From 62be662e2f2bed1569ba846abee81288a64ff8f9 Mon Sep 17 00:00:00 2001 From: "giancarlo.panichi" Date: Fri, 5 May 2017 15:07:30 +0000 Subject: [PATCH] ref 8397:Accounting Manager - Add the Spaces management https://support.d4science.org/issues/8397 Added the Spaces management git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/admin/accounting-manager@148337 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 6 +- distro/changelog.xml | 4 + pom.xml | 2 +- .../client/AccountingManagerController.java | 168 ++-- .../client/filters/ActiveFiltersPanel.java | 382 ++++++-- .../client/maindata/ChartViewerPanel.java | 6 + .../charts/AccountingChart4Space.java | 75 ++ .../charts/space/SpaceChartSpacesPanel.java | 891 ++++++++++++++++++ .../charts/utils/SpaceChartMeasure.java | 64 ++ .../client/menu/AccountingManagerMenu.java | 9 + ...perties.java => GenresDataProperties.java} | 10 +- .../resource/AccountingManagerResources.java | 18 +- .../client/resource/accounting-space_128.png | Bin 0 -> 2535 bytes .../client/resource/accounting-space_24.png | Bin 0 -> 928 bytes .../client/resource/accounting-space_32.png | Bin 0 -> 1170 bytes .../client/resource/accounting-space_48.png | Bin 0 -> 1688 bytes .../client/rpc/AccountingManagerService.java | 26 +- .../rpc/AccountingManagerServiceAsync.java | 22 +- .../state/AccountingClientStateData.java | 35 +- .../server/AccountingClientCallable.java | 30 +- .../server/AccountingClientDaemon.java | 30 +- .../server/AccountingManagerServiceImpl.java | 80 +- .../server/amservice/AccountingCaller.java | 20 + .../amservice/AccountingCallerInterface.java | 9 +- .../amservice/AccountingCallerTester.java | 111 ++- .../AccountingCommandGetFilterKeys.java | 44 +- .../AccountingCommandGetFilterValues.java | 6 + .../command/AccountingCommandGetSpaces.java | 63 ++ .../command/AccountingCommandSpaces.java | 111 +++ .../query/AccountingQuery4Space.java | 106 +++ .../query/AccountingQuerySpaces.java | 73 ++ .../response/SeriesResponse4SpaceSpaces.java | 78 ++ .../server/is/BuildEnableTabs.java | 56 +- .../shared/data/AccountingFilterSpaces.java | 74 ++ .../shared/data/AccountingType.java | 3 +- .../shared/data/ChartType.java | 2 +- .../accountingmanager/shared/data/Genres.java | 39 + .../shared/data/GenresData.java | 46 + .../accountingmanager/shared/data/Spaces.java | 39 + .../shared/data/SpacesData.java | 46 + .../shared/data/response/SeriesSpace.java | 40 + .../data/response/space/SeriesSpaceData.java | 50 + .../response/space/SeriesSpaceDataSpaces.java | 55 ++ .../response/space/SeriesSpaceDefinition.java | 31 + .../response/space/SeriesSpaceSpaces.java | 58 ++ .../accountingmanager/accountingman.gwt.xml | 5 +- .../client/resource/accounting-space_128.png | Bin 0 -> 2535 bytes .../client/resource/accounting-space_24.png | Bin 0 -> 928 bytes .../client/resource/accounting-space_32.png | Bin 0 -> 1170 bytes .../client/resource/accounting-space_48.png | Bin 0 -> 1688 bytes src/main/webapp/WEB-INF/liferay-portlet.xml | 1 + 51 files changed, 2763 insertions(+), 261 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/AccountingChart4Space.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/space/SpaceChartSpacesPanel.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/utils/SpaceChartMeasure.java rename src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/{ContextDataProperties.java => GenresDataProperties.java} (56%) create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_128.png create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_24.png create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_32.png create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_48.png create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandGetSpaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandSpaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Space.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuerySpaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/response/SeriesResponse4SpaceSpaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingFilterSpaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Genres.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/GenresData.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Spaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/SpacesData.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/SeriesSpace.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceData.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDataSpaces.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDefinition.java create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceSpaces.java create mode 100644 src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_128.png create mode 100644 src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_24.png create mode 100644 src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_32.png create mode 100644 src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_48.png diff --git a/.classpath b/.classpath index a8509f0..4754935 100644 --- a/.classpath +++ b/.classpath @@ -1,12 +1,12 @@ - + - + @@ -45,5 +45,5 @@ - + diff --git a/distro/changelog.xml b/distro/changelog.xml index 598a499..8e4453f 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -1,4 +1,8 @@ + + Added Spaces chart [Ticket #8397] + Fixed download in case of multitab on different scopes diff --git a/pom.xml b/pom.xml index 48092c5..f44390f 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 org.gcube.portlets.admin accounting-manager - 1.6.0-SNAPSHOT + 1.7.0-SNAPSHOT war diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/AccountingManagerController.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/AccountingManagerController.java index d564adc..385ea5b 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/AccountingManagerController.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/AccountingManagerController.java @@ -24,11 +24,13 @@ import org.gcube.portlets.admin.accountingmanager.client.type.UIStateType; import org.gcube.portlets.admin.accountingmanager.client.util.UtilsGXT3; import org.gcube.portlets.admin.accountingmanager.shared.Constants; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterBasic; +import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterSpaces; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingPeriod; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingPeriodMode; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; import org.gcube.portlets.admin.accountingmanager.shared.data.Context; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.data.query.SeriesRequest; import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesResponse; import org.gcube.portlets.admin.accountingmanager.shared.exception.SessionExpiredException; @@ -189,7 +191,9 @@ public class AccountingManagerController { } else { this.enableTabs = enableTabs; EnableTabsEvent event = new EnableTabsEvent(enableTabs); + Log.debug("Fire: " + event); eventBus.fireEvent(event); + } } @@ -300,6 +304,7 @@ public class AccountingManagerController { case STORAGE: case TASK: case JOB: + case SPACE: Log.debug("AccountingType: " + event.getAccountingType()); accountingStateData = accountingState.getState(event .getAccountingType()); @@ -322,29 +327,17 @@ public class AccountingManagerController { if (enableTabs != null && enableTabs.getTabs() != null && enableTabs.getTabs().size() > 0 && enableTabs.getTabs().get(0) != null) { + Log.debug("Create DefaultChart"); createDefaultChart(enableTabs.getTabs().get(0).getAccountingType()); } } private void createDefaultChart(AccountingType accountingType) { accountingMonitor = new AccountingMonitor(); - Date now = new Date(); - DateTimeFormat dtf = DateTimeFormat - .getFormat(PredefinedFormat.YEAR_MONTH_DAY); - String currentDate = dtf.format(now); - Date date = dtf.parse(currentDate); - Date lastMonth = new Date(date.getTime()); - CalendarUtil.addMonthsToDate(lastMonth, -1); - SeriesRequest seriesRequest = new SeriesRequest(new AccountingPeriod( - dtf.format(lastMonth), dtf.format(date), - AccountingPeriodMode.DAILY), new AccountingFilterBasic()); - Log.debug("DefaultSeriesRequest: " + seriesRequest); - Log.debug("LastMoth= " + dtf.format(lastMonth) + " , date=" - + dtf.format(date)); this.accountingType = accountingType; AccountingClientStateData accountingStateData = new AccountingClientStateData( - accountingType, seriesRequest, null, null, null, rootScope); + accountingType, rootScope); accountingState.setState(accountingType, accountingStateData); retrieveFilterKey(); @@ -415,12 +408,90 @@ public class AccountingManagerController { accountingStateData.setAvailableContext(result); accountingState.setState(accountingType, accountingStateData); - callDefaultSeriesRequest(); + retrieveSpace(); } }); } + private void retrieveSpace() { + if (rootScope) { + + AccountingManagerServiceAsync.INSTANCE + .getSpaces(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + accountingMonitor.hide(); + if (caught instanceof SessionExpiredException) { + eventBus.fireEvent(new SessionExpiredEvent( + SessionExpiredType.EXPIREDONSERVER)); + } else { + Log.error("Error retrieving sapces for " + + accountingType + ":" + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error retrieving spaces ", + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(Spaces result) { + Log.debug("Available Spaces: " + result); + createDefaultSeriesRequest(result); + } + }); + } else { + createDefaultSeriesRequest(null); + } + } + + private void createDefaultSeriesRequest(Spaces spaces) { + Date now = new Date(); + DateTimeFormat dtf = DateTimeFormat + .getFormat(PredefinedFormat.YEAR_MONTH_DAY); + String currentDate = dtf.format(now); + Date date = dtf.parse(currentDate); + Date lastMonth = new Date(date.getTime()); + CalendarUtil.addMonthsToDate(lastMonth, -1); + Log.debug("LastMoth= " + dtf.format(lastMonth) + " , date=" + + dtf.format(date)); + + AccountingClientStateData accountingStateData = accountingState + .getState(accountingType); + SeriesRequest seriesRequest = null; + + switch (accountingType) { + case JOB: + case PORTLET: + case SERVICE: + case STORAGE: + case TASK: + seriesRequest = new SeriesRequest(new AccountingPeriod( + dtf.format(lastMonth), dtf.format(date), + AccountingPeriodMode.DAILY), new AccountingFilterBasic()); + Log.debug("DefaultSeriesRequest: " + seriesRequest); + + break; + case SPACE: + accountingStateData.setAvailableSpaces(spaces); + seriesRequest = new SeriesRequest(new AccountingPeriod( + dtf.format(lastMonth), dtf.format(date), + AccountingPeriodMode.DAILY), new AccountingFilterSpaces( + spaces)); + Log.debug("DefaultSeriesRequest: " + seriesRequest); + break; + default: + break; + + } + + accountingStateData.setSeriesRequest(seriesRequest); + accountingState.setState(accountingType, accountingStateData); + callDefaultSeriesRequest(); + } + private void callDefaultSeriesRequest() { AccountingManagerServiceAsync.INSTANCE.getSeriesInCache(accountingType, @@ -461,13 +532,12 @@ public class AccountingManagerController { caught.getLocalizedMessage()); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( - StateChangeType.Restore, accountingState.getState(accountingType)); + StateChangeType.Restore, accountingState + .getState(accountingType)); eventBus.fireEvent(stateChangeEvent); } @@ -493,10 +563,8 @@ public class AccountingManagerController { + operationId); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( StateChangeType.Restore, accountingState @@ -520,10 +588,8 @@ public class AccountingManagerController { caught.getLocalizedMessage()); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( StateChangeType.Restore, accountingState @@ -612,10 +678,8 @@ public class AccountingManagerController { UtilsGXT3.alert("Error Time Out", "Time Out"); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( StateChangeType.Restore, @@ -698,13 +762,12 @@ public class AccountingManagerController { caught.printStackTrace(); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( - StateChangeType.Update, accountingState.getState(accountingType)); + StateChangeType.Update, accountingState + .getState(accountingType)); eventBus.fireEvent(stateChangeEvent); } @@ -729,13 +792,12 @@ public class AccountingManagerController { + operationId); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( - StateChangeType.Update, accountingState.getState(accountingType)); + StateChangeType.Update, accountingState + .getState(accountingType)); eventBus.fireEvent(stateChangeEvent); } else { operationMonitor(operationId); @@ -755,13 +817,12 @@ public class AccountingManagerController { caught.printStackTrace(); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( - StateChangeType.Update, accountingState.getState(accountingType)); + StateChangeType.Update, accountingState + .getState(accountingType)); eventBus.fireEvent(stateChangeEvent); } @@ -826,7 +887,9 @@ public class AccountingManagerController { accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( - StateChangeType.Update, accountingState.getState(accountingType)); + StateChangeType.Update, + accountingState + .getState(accountingType)); eventBus.fireEvent(stateChangeEvent); } @@ -842,13 +905,12 @@ public class AccountingManagerController { UtilsGXT3.alert("Error Time Out", "Time Out"); AccountingClientStateData accountingStateData = accountingState .getState(accountingType); - accountingStateData - .setSeriesResponse(null); - accountingState.setState( - accountingType, + accountingStateData.setSeriesResponse(null); + accountingState.setState(accountingType, accountingStateData); StateChangeEvent stateChangeEvent = new StateChangeEvent( - StateChangeType.Update, accountingState.getState(accountingType)); + StateChangeType.Update, + accountingState.getState(accountingType)); eventBus.fireEvent(stateChangeEvent); break; diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/filters/ActiveFiltersPanel.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/filters/ActiveFiltersPanel.java index 1f693fc..a79ec6e 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/filters/ActiveFiltersPanel.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/filters/ActiveFiltersPanel.java @@ -9,7 +9,7 @@ import org.gcube.portlets.admin.accountingmanager.client.event.SessionExpiredEve import org.gcube.portlets.admin.accountingmanager.client.event.StateChangeEvent; import org.gcube.portlets.admin.accountingmanager.client.monitor.AccountingMonitor; import org.gcube.portlets.admin.accountingmanager.client.properties.AccountingFilterProperties; -import org.gcube.portlets.admin.accountingmanager.client.properties.ContextDataProperties; +import org.gcube.portlets.admin.accountingmanager.client.properties.GenresDataProperties; import org.gcube.portlets.admin.accountingmanager.client.resource.AccountingManagerResources; import org.gcube.portlets.admin.accountingmanager.client.rpc.AccountingManagerServiceAsync; import org.gcube.portlets.admin.accountingmanager.client.state.AccountingClientStateData; @@ -19,13 +19,15 @@ import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilter; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterBasic; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterContext; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterDefinition; +import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterSpaces; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterTop; import org.gcube.portlets.admin.accountingmanager.shared.data.ChartType; -import org.gcube.portlets.admin.accountingmanager.shared.data.ContextData; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValue; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesRequest; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesResponse; +import org.gcube.portlets.admin.accountingmanager.shared.data.GenresData; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.exception.SessionExpiredException; import com.allen_sauer.gwt.log.client.Log; @@ -105,9 +107,10 @@ public class ActiveFiltersPanel extends SimpleContainer { private EventBus eventBus; private Grid gridFilter; private ListStore storeFilter; - private Grid gridContext; - private ListStore storeContext; - private CheckBoxSelectionModel smContext; + private Grid gridGenres; + private ListStore storeGenres; + private CheckBoxSelectionModel smGenres; + private ColumnConfig labelGenresCol; private boolean addStatus; private AccountingClientStateData accountingStateData; private ListStore storeComboFilterKey; @@ -117,6 +120,7 @@ public class ActiveFiltersPanel extends SimpleContainer { private GridRowEditing editing; private TextButton addButton; private int seq; + private FieldLabel comboChartTypeLabel; private ListStore storeComboChartType; private ComboBox comboChartType; private ListStore storeComboTopFilterKey; @@ -415,7 +419,6 @@ public class ActiveFiltersPanel extends SimpleContainer { } }); - storeComboChartType.addAll(ChartType.asList()); LabelProvider comboChartTypeLabelProvider = new LabelProvider() { @@ -428,16 +431,16 @@ public class ActiveFiltersPanel extends SimpleContainer { }; // /Grid Context - ContextDataProperties propsContextData = GWT - .create(ContextDataProperties.class); + GenresDataProperties propsGenresData = GWT + .create(GenresDataProperties.class); - IdentityValueProvider identity = new IdentityValueProvider(); - smContext = new CheckBoxSelectionModel(identity); + IdentityValueProvider identity = new IdentityValueProvider(); + smGenres = new CheckBoxSelectionModel(identity); - ColumnConfig labelCol = new ColumnConfig( - propsContextData.label(), 356, "Scope"); + labelGenresCol = new ColumnConfig( + propsGenresData.label(), 356, "Genres"); - labelCol.setCell(new AbstractCell() { + labelGenresCol.setCell(new AbstractCell() { @Override public void render(Context context, String value, SafeHtmlBuilder sb) { @@ -450,26 +453,26 @@ public class ActiveFiltersPanel extends SimpleContainer { }); - List> lContext = new ArrayList>(); - lContext.add(smContext.getColumn()); - lContext.add(labelCol); - ColumnModel cmContextData = new ColumnModel( - lContext); + List> lGenres = new ArrayList>(); + lGenres.add(smGenres.getColumn()); + lGenres.add(labelGenresCol); + ColumnModel cmGenresData = new ColumnModel( + lGenres); - storeContext = new ListStore(propsContextData.id()); + storeGenres = new ListStore(propsGenresData.id()); - gridContext = new Grid(storeContext, cmContextData); + gridGenres = new Grid(storeGenres, cmGenresData); sm.setSelectionMode(SelectionMode.MULTI); - gridContext.setHeight("130px"); - gridContext.setSelectionModel(smContext); - gridContext.getView().setStripeRows(true); - gridContext.getView().setColumnLines(true); - gridContext.getView().setAutoFill(true); - gridContext.setBorders(true); - gridContext.setColumnReordering(false); - gridContext.getView().setAutoExpandColumn(labelCol); - gridContext.getView().setSortingEnabled(true); + gridGenres.setHeight("130px"); + gridGenres.setSelectionModel(smGenres); + gridGenres.getView().setStripeRows(true); + gridGenres.getView().setColumnLines(true); + gridGenres.getView().setAutoFill(true); + gridGenres.setBorders(true); + gridGenres.setColumnReordering(false); + gridGenres.getView().setAutoExpandColumn(labelGenresCol); + gridGenres.getView().setSortingEnabled(true); // / @@ -486,7 +489,7 @@ public class ActiveFiltersPanel extends SimpleContainer { comboChartType.setTriggerAction(TriggerAction.ALL); addHandlersForComboChartType(comboChartTypeLabelProvider); - FieldLabel comboChartTypeLabel = new FieldLabel(comboChartType, "Chart"); + comboChartTypeLabel = new FieldLabel(comboChartType, "Chart"); // FileterKeyCombo for Top Chart storeComboTopFilterKey = new ListStore( @@ -582,7 +585,7 @@ public class ActiveFiltersPanel extends SimpleContainer { vlc.add(comboChartTypeLabel, new VerticalLayoutData(1, -1, new Margins( 0))); - vlc.add(gridContext, new VerticalLayoutData(1, -1, new Margins(0))); + vlc.add(gridGenres, new VerticalLayoutData(1, -1, new Margins(0))); vlc.add(noContextLabel, new VerticalLayoutData(1, -1, new Margins(0))); vlc.add(comboTopFilterKeyLabel, new VerticalLayoutData(1, -1, new Margins(0))); @@ -598,7 +601,8 @@ public class ActiveFiltersPanel extends SimpleContainer { fieldSet.add(vlc); add(fieldSet, new MarginData(0)); - gridContext.setVisible(false); + comboChartTypeLabel.setVisible(false); + gridGenres.setVisible(false); noContextLabel.setVisible(false); comboTopFilterKeyLabel.setVisible(false); showOthersLabel.setVisible(false); @@ -648,8 +652,48 @@ public class ActiveFiltersPanel extends SimpleContainer { } private void onRestoreStateChange(StateChangeEvent event) { + Log.debug("onRestoreStateChange: " + event); if (event.getAccountingStateData() != null) { + accountingStateData = event.getAccountingStateData(); + if (accountingStateData.getAccountingType() != null) { + switch (accountingStateData.getAccountingType()) { + case JOB: + case PORTLET: + case SERVICE: + case STORAGE: + case TASK: + List chartsTypeForDefault = new ArrayList<>(ChartType.asList()); + Log.debug("ChartsType: " + chartsTypeForDefault); + chartsTypeForDefault.remove(ChartType.Spaces); + Log.debug("ChartsType after remove: " + chartsTypeForDefault); + storeComboChartType.clear(); + storeComboChartType.addAll(chartsTypeForDefault); + storeComboChartType.commitChanges(); + comboChartTypeLabel.setVisible(true); + break; + case SPACE: + List chartsTypeForSpace = new ArrayList<>(); + chartsTypeForSpace.add(ChartType.Spaces); + Log.debug("ChartsType: " + chartsTypeForSpace); + storeComboChartType.clear(); + storeComboChartType.addAll(chartsTypeForSpace); + storeComboChartType.commitChanges(); + comboChartTypeLabel.setVisible(false); + break; + default: + storeComboChartType.clear(); + storeComboChartType.commitChanges(); + comboChartTypeLabel.setVisible(false); + break; + + } + } else { + storeComboChartType.clear(); + storeComboChartType.commitChanges(); + comboChartTypeLabel.setVisible(false); + + } changeActiveFilters(); } else { @@ -683,6 +727,10 @@ public class ActiveFiltersPanel extends SimpleContainer { case Context: changeActiveFiltersForContext(); break; + case Spaces: + changeActiveFiltersForSpaces(); + break; + default: changeActiveFiltersForBasic(); break; @@ -748,7 +796,7 @@ public class ActiveFiltersPanel extends SimpleContainer { } comboChartType.setValue(ChartType.Basic); - gridContext.setVisible(false); + gridGenres.setVisible(false); comboTopFilterKey.reset(); comboTopFilterKeyLabel.setVisible(false); showOthersToggle.reset(); @@ -815,7 +863,7 @@ public class ActiveFiltersPanel extends SimpleContainer { } comboChartType.setValue(ChartType.Top); - gridContext.setVisible(false); + gridGenres.setVisible(false); comboTopFilterKeyLabel.setVisible(true); showOthersLabel.setVisible(true); noContextToggle.reset(); @@ -825,7 +873,6 @@ public class ActiveFiltersPanel extends SimpleContainer { forceLayout(); } - // TODO private void changeActiveFiltersForContext() { if (accountingStateData.getSeriesRequest() != null && accountingStateData.getSeriesRequest() @@ -845,42 +892,41 @@ public class ActiveFiltersPanel extends SimpleContainer { .isEmpty()) { ArrayList contexts = accountingStateData .getAvailableContext().getContexts(); - ArrayList ctx = new ArrayList(); + ArrayList genres = new ArrayList(); for (String context : contexts) { - ContextData contextData = new ContextData(context); - ctx.add(contextData); + GenresData genresData = new GenresData(context); + genres.add(genresData); } - storeContext.clear(); - storeContext.addAll(ctx); - storeContext.commitChanges(); + storeGenres.clear(); + storeGenres.addAll(genres); + storeGenres.commitChanges(); - smContext.deselectAll(); + smGenres.deselectAll(); if (accountingFilterContext.getContext().getContexts() == null || accountingFilterContext.getContext() .getContexts().isEmpty()) { } else { - ArrayList selected = new ArrayList<>(); + ArrayList selected = new ArrayList<>(); for (String c : accountingFilterContext.getContext() .getContexts()) { - for (ContextData contextData : storeContext - .getAll()) { - if (c.compareTo(contextData.getContextData()) == 0) { - selected.add(contextData); + for (GenresData genresData : storeGenres.getAll()) { + if (c.compareTo(genresData.getGenre()) == 0) { + selected.add(genresData); break; } } } if (!selected.isEmpty()) { - if (selected.size() == storeContext.getAll().size()) { - smContext.selectAll(); + if (selected.size() == storeGenres.getAll().size()) { + smGenres.selectAll(); } else { - smContext.select(selected, false); + smGenres.select(selected, false); } } } - smContext.refresh(); + smGenres.refresh(); } else { repopulatesContexts(); @@ -916,7 +962,9 @@ public class ActiveFiltersPanel extends SimpleContainer { } comboChartType.setValue(ChartType.Context); - gridContext.setVisible(true); + gridGenres.setVisible(true); + labelGenresCol.setHeader("Scope"); + gridGenres.getView().refresh(true); comboTopFilterKey.reset(); comboTopFilterKeyLabel.setVisible(false); showOthersToggle.reset(); @@ -943,25 +991,164 @@ public class ActiveFiltersPanel extends SimpleContainer { } private void resetContexts() { - storeContext.clear(); - storeContext.commitChanges(); - smContext.deselectAll(); - smContext.refresh(); + storeGenres.clear(); + storeGenres.commitChanges(); + smGenres.deselectAll(); + smGenres.refresh(); } private void repopulatesContexts() { ArrayList contexts = accountingStateData.getAvailableContext() .getContexts(); - ArrayList ctx = new ArrayList(); + ArrayList genres = new ArrayList(); for (String context : contexts) { - ContextData contextData = new ContextData(context); - ctx.add(contextData); + GenresData genresData = new GenresData(context); + genres.add(genresData); } - storeContext.clear(); - storeContext.addAll(ctx); - storeContext.commitChanges(); - smContext.selectAll(); - smContext.refresh(); + storeGenres.clear(); + storeGenres.addAll(genres); + storeGenres.commitChanges(); + smGenres.selectAll(); + smGenres.refresh(); + } + + private void changeActiveFiltersForSpaces() { + if (accountingStateData.getSeriesRequest() != null + && accountingStateData.getSeriesRequest() + .getAccountingFilterDefinition() != null + && accountingStateData.getSeriesRequest() + .getAccountingFilterDefinition() instanceof AccountingFilterSpaces) { + AccountingFilterSpaces accountingFilterSapces = (AccountingFilterSpaces) accountingStateData + .getSeriesRequest().getAccountingFilterDefinition(); + if (accountingStateData.getAvailableSpaces() != null + && accountingStateData.getAvailableSpaces().getSpacesList() != null + && !accountingStateData.getAvailableSpaces().getSpacesList() + .isEmpty()) { + + if (accountingFilterSapces.getSpaces() != null + && accountingFilterSapces.getSpaces().getSpacesList() != null + && !accountingFilterSapces.getSpaces().getSpacesList() + .isEmpty()) { + ArrayList spacesList = accountingStateData + .getAvailableSpaces().getSpacesList(); + ArrayList genres = new ArrayList(); + for (String space : spacesList) { + GenresData genresData = new GenresData(space); + genres.add(genresData); + } + storeGenres.clear(); + storeGenres.addAll(genres); + storeGenres.commitChanges(); + + smGenres.deselectAll(); + + if (accountingFilterSapces.getSpaces().getSpacesList() == null + || accountingFilterSapces.getSpaces() + .getSpacesList().isEmpty()) { + } else { + ArrayList selected = new ArrayList<>(); + for (String s : accountingFilterSapces.getSpaces() + .getSpacesList()) { + for (GenresData genresData : storeGenres.getAll()) { + if (s.compareTo(genresData.getGenre()) == 0) { + selected.add(genresData); + break; + } + } + } + if (!selected.isEmpty()) { + if (selected.size() == storeGenres.getAll().size()) { + smGenres.selectAll(); + } else { + smGenres.select(selected, false); + } + } + } + + smGenres.refresh(); + + } else { + repopulatesSpaces(); + } + + } else { + resetSpaces(); + } + + if (accountingFilterSapces.getFilters() != null) { + List filters = accountingFilterSapces + .getFilters(); + storeFilter.clear(); + storeFilter.addAll(filters); + seq = 0; + for (AccountingFilter filter : filters) { + if (filter.getId() > seq) { + seq = filter.getId(); + } + } + storeFilter.commitChanges(); + } else { + storeFilter.clear(); + storeFilter.commitChanges(); + seq = 0; + } + + } else { + reconfigureSpaces(); + storeFilter.clear(); + storeFilter.commitChanges(); + seq = 0; + + } + comboChartType.setValue(ChartType.Spaces); + gridGenres.setVisible(true); + labelGenresCol.setHeader("Space"); + gridGenres.getView().refresh(true); + comboTopFilterKey.reset(); + comboTopFilterKeyLabel.setVisible(false); + showOthersToggle.reset(); + showOthersNo.setValue(true); + showOthersLabel.setVisible(false); + noContextToggle.reset(); + noContextNo.setValue(true); + noContextLabel.setVisible(false); + topNumber.reset(); + topNumberLabel.setVisible(false); + forceLayout(); + + } + + private void reconfigureSpaces() { + if (accountingStateData.getAvailableSpaces() != null + && accountingStateData.getAvailableSpaces().getSpacesList() != null + && !accountingStateData.getAvailableSpaces().getSpacesList() + .isEmpty()) { + repopulatesSpaces(); + } else { + resetSpaces(); + } + } + + private void resetSpaces() { + storeGenres.clear(); + storeGenres.commitChanges(); + smGenres.deselectAll(); + smGenres.refresh(); + } + + private void repopulatesSpaces() { + ArrayList spaces = accountingStateData.getAvailableSpaces() + .getSpacesList(); + ArrayList genres = new ArrayList(); + for (String space : spaces) { + GenresData genresData = new GenresData(space); + genres.add(genresData); + } + storeGenres.clear(); + storeGenres.addAll(genres); + storeGenres.commitChanges(); + smGenres.selectAll(); + smGenres.refresh(); } public AccountingFilterDefinition getActiveFilters() { @@ -975,7 +1162,8 @@ public class ActiveFiltersPanel extends SimpleContainer { return getActiveFiltersForTop(); case Context: return getActiveFiltersForContext(); - + case Spaces: + return getActiveFiltersForSpaces(); default: return null; @@ -1054,11 +1242,10 @@ public class ActiveFiltersPanel extends SimpleContainer { private AccountingFilterDefinition getActiveFiltersForContext() { ArrayList contextsSelected = new ArrayList(); - if (storeContext != null && storeContext.size() > 0 - && smContext != null) { - List selected = smContext.getSelectedItems(); - for (ContextData cd : selected) { - contextsSelected.add(cd.getContextData()); + if (storeGenres != null && storeGenres.size() > 0 && smGenres != null) { + List selected = smGenres.getSelectedItems(); + for (GenresData cd : selected) { + contextsSelected.add(cd.getGenre()); } } org.gcube.portlets.admin.accountingmanager.shared.data.Context context = new org.gcube.portlets.admin.accountingmanager.shared.data.Context( @@ -1080,6 +1267,32 @@ public class ActiveFiltersPanel extends SimpleContainer { } + private AccountingFilterDefinition getActiveFiltersForSpaces() { + ArrayList spacesSelected = new ArrayList(); + if (storeGenres != null && storeGenres.size() > 0 && smGenres != null) { + List selected = smGenres.getSelectedItems(); + for (GenresData cd : selected) { + spacesSelected.add(cd.getGenre()); + } + } + Spaces spaces = new Spaces(spacesSelected); + + List filtersActives = storeFilter.getAll(); + ArrayList filtersReady = new ArrayList(); + for (AccountingFilter filter : filtersActives) { + if (filter.getFilterValue() != null + && !filter.getFilterValue().isEmpty()) { + filtersReady.add(filter); + } + } + if (filtersReady.size() > 0) { + return new AccountingFilterSpaces(spaces, filtersReady); + } else { + return new AccountingFilterSpaces(spaces, null); + } + + } + private void addNewFilter(SelectEvent event) { List filtersSet = storeFilter.getAll(); FilterKey fk = null; @@ -1275,7 +1488,7 @@ public class ActiveFiltersPanel extends SimpleContainer { } switch (chartType) { case Basic: - gridContext.setVisible(false); + gridGenres.setVisible(false); comboTopFilterKey.reset(); comboTopFilterKeyLabel.setVisible(false); showOthersToggle.reset(); @@ -1300,7 +1513,7 @@ public class ActiveFiltersPanel extends SimpleContainer { forceLayout(); break; case Top: - gridContext.setVisible(false); + gridGenres.setVisible(false); comboTopFilterKey.reset(); if (accountingStateData != null && accountingStateData.getAvailableFilterKeys() != null @@ -1326,7 +1539,30 @@ public class ActiveFiltersPanel extends SimpleContainer { break; case Context: reconfigureContext(); - gridContext.setVisible(true); + gridGenres.setVisible(true); + labelGenresCol.setHeader("Scope"); + gridGenres.getView().refresh(true); + comboTopFilterKey.reset(); + comboTopFilterKeyLabel.setVisible(false); + showOthersToggle.reset(); + showOthersNo.setValue(true); + showOthersLabel.setVisible(false); + noContextToggle.reset(); + noContextYes.setValue(false); + noContextNo.setValue(true); + noContextLabel.setVisible(false); + topNumber.reset(); + topNumberLabel.setVisible(false); + storeFilter.clear(); + storeFilter.commitChanges(); + seq = 0; + forceLayout(); + break; + case Spaces: + reconfigureSpaces(); + gridGenres.setVisible(true); + labelGenresCol.setHeader("Space"); + gridGenres.getView().refresh(true); comboTopFilterKey.reset(); comboTopFilterKeyLabel.setVisible(false); showOthersToggle.reset(); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/ChartViewerPanel.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/ChartViewerPanel.java index 3f216cc..b046073 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/ChartViewerPanel.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/ChartViewerPanel.java @@ -4,6 +4,7 @@ import org.gcube.portlets.admin.accountingmanager.client.event.StateChangeEvent; import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChart4Job; import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChart4Portlet; import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChart4Service; +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChart4Space; import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChart4Storage; import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChart4Task; import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.AccountingChartBuilder; @@ -100,6 +101,11 @@ public class ChartViewerPanel extends FramedPanel { case TASK: createChart(new AccountingChart4Task(eventBus, event.getAccountingStateData())); break; + case SPACE: + createChart(new AccountingChart4Space(eventBus, event.getAccountingStateData())); + break; + + default: break; } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/AccountingChart4Space.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/AccountingChart4Space.java new file mode 100644 index 0000000..7bd96f3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/AccountingChart4Space.java @@ -0,0 +1,75 @@ +package org.gcube.portlets.admin.accountingmanager.client.maindata.charts; + +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.space.SpaceChartSpacesPanel; +import org.gcube.portlets.admin.accountingmanager.client.state.AccountingClientStateData; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesSpace; +import org.gcube.portlets.admin.accountingmanager.shared.exception.ChartDrawException; + +import com.google.gwt.event.shared.EventBus; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; + +/** + * Accounting Chart 4 Space + * + * @author "Giancarlo Panichi" email: g.panichi@isti.cnr.it + * + */ +public class AccountingChart4Space extends AccountingChartBuilder { + private EventBus eventBus; + private AccountingClientStateData accountingStateData; + + + public AccountingChart4Space(EventBus eventBus, AccountingClientStateData accountingStateData) { + this.eventBus=eventBus; + this.accountingStateData = accountingStateData; + } + + @Override + public void buildChart() throws ChartDrawException { + AccountingChartPanel accountingChartPanel = null; + + if (accountingStateData == null + || accountingStateData.getAccountingType() == null + || accountingStateData.getSeriesRequest() == null + || accountingStateData.getSeriesResponse() == null) { + accountingChartSpec.setChart(accountingChartPanel); + return; + } + + if (!(accountingStateData.getSeriesResponse() instanceof SeriesSpace)) { + accountingChartSpec.setChart(accountingChartPanel); + return; + } + + SimpleContainer container = createSpaceChartPanel(); + + accountingChartPanel = new AccountingChartPanel(container); + + accountingChartSpec.setChart(accountingChartPanel); + + } + + private SimpleContainer createSpaceChartPanel() + throws ChartDrawException { + + if (accountingStateData == null + || accountingStateData.getSeriesRequest() == null + || accountingStateData.getSeriesRequest() + .getAccountingFilterDefinition() == null + || accountingStateData.getSeriesRequest() + .getAccountingFilterDefinition().getChartType() == null) { + return null; + } + + switch (accountingStateData.getSeriesRequest() + .getAccountingFilterDefinition().getChartType()) { + + case Spaces: + return new SpaceChartSpacesPanel(eventBus,accountingStateData); + default: + return null; + } + + } +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/space/SpaceChartSpacesPanel.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/space/SpaceChartSpacesPanel.java new file mode 100644 index 0000000..e4760a2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/space/SpaceChartSpacesPanel.java @@ -0,0 +1,891 @@ +package org.gcube.portlets.admin.accountingmanager.client.maindata.charts.space; + +import java.util.ArrayList; +import java.util.Date; + +import org.gcube.portlets.admin.accountingmanager.client.event.ExportRequestEvent; +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.utils.ByteUnitMeasure; +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.utils.ChartDateTimeData; +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.utils.ChartTimeMeasure; +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.utils.DownloadConstants; +import org.gcube.portlets.admin.accountingmanager.client.maindata.charts.utils.SpaceChartMeasure; +import org.gcube.portlets.admin.accountingmanager.client.resource.AccountingManagerResources; +import org.gcube.portlets.admin.accountingmanager.client.state.AccountingClientStateData; +import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingPeriodMode; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesSpace; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceSpaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceData; +import org.gcube.portlets.admin.accountingmanager.shared.export.ExportType; + +import com.allen_sauer.gwt.log.client.Log; +import com.github.highcharts4gwt.client.view.widget.HighchartsLayoutPanel; +import com.github.highcharts4gwt.model.array.api.Array; +import com.github.highcharts4gwt.model.array.api.ArrayNumber; +import com.github.highcharts4gwt.model.array.api.ArrayString; +import com.github.highcharts4gwt.model.factory.api.HighchartsOptionFactory; +import com.github.highcharts4gwt.model.factory.jso.JsoHighchartsOptionFactory; +import com.github.highcharts4gwt.model.highcharts.option.api.ChartOptions; +import com.github.highcharts4gwt.model.highcharts.option.api.SeriesColumn; +import com.github.highcharts4gwt.model.highcharts.option.api.seriescolumn.Data; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.sencha.gxt.cell.core.client.ButtonCell.ButtonArrowAlign; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class SpaceChartSpacesPanel extends SimpleContainer { + + private static final String DATA_VOLUME_UNIT = "Data Volume Unit"; + + private DateTimeFormat dtf = DateTimeFormat + .getFormat(PredefinedFormat.YEAR_MONTH_DAY); + + private EventBus eventBus; + private AccountingClientStateData accountingStateData; + private HighchartsLayoutPanel highchartsLayoutPanel; + + // Download Menu + private MenuItem downloadCSVItem; + private MenuItem downloadXMLItem; + private MenuItem downloadJSONItem; + private MenuItem downloadPNGItem; + private MenuItem downloadJPGItem; + private MenuItem downloadPDFItem; + private MenuItem downloadSVGItem; + + // Unit Menu + private MenuItem kBItem; + private MenuItem MBItem; + private MenuItem GBItem; + private MenuItem TBItem; + + private long unitMeasure = ByteUnitMeasure.getMegaByteDimForStorage(); + private String unitMeasureLabel = ByteUnitMeasure.MB; + private TextButton unitButton; + + private ChartOptions options; + + private SpaceChartMeasure measure = SpaceChartMeasure.DataVolume; + private TextButton measureButton; + + private VerticalLayoutContainer vert; + + public SpaceChartSpacesPanel(EventBus eventBus, + AccountingClientStateData accountingStateData) { + this.eventBus = eventBus; + this.accountingStateData = accountingStateData; + forceLayoutOnResize = true; + create(); + + } + + private void create() { + ToolBar toolBar = new ToolBar(); + toolBar.setSpacing(2); + // Download + final TextButton downloadButton = new TextButton( + DownloadConstants.DOWNLOAD, + AccountingManagerResources.INSTANCE.accountingDownload24()); + // downloadButton.setScale(ButtonScale.MEDIUM); + downloadButton.setIconAlign(IconAlign.RIGHT); + downloadButton.setArrowAlign(ButtonArrowAlign.RIGHT); + downloadButton.setMenu(createDownloadMenu()); + + // Unit + unitButton = new TextButton(DATA_VOLUME_UNIT, + AccountingManagerResources.INSTANCE.accountingUnitMB24()); + unitButton.setIconAlign(IconAlign.RIGHT); + unitButton.setArrowAlign(ButtonArrowAlign.RIGHT); + unitButton.setMenu(createUnitMenu()); + + toolBar.add(downloadButton, new BoxLayoutData(new Margins(0))); + toolBar.add(unitButton, new BoxLayoutData(new Margins(0))); + + // + createChart(); + + highchartsLayoutPanel = new HighchartsLayoutPanel(); + highchartsLayoutPanel.renderChart(options); + + // + vert = new VerticalLayoutContainer(); + vert.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + vert.add(highchartsLayoutPanel, new VerticalLayoutData(1, 1, + new Margins(0))); + + add(vert, new MarginData(0)); + + } + + private void updateChart() { + createChart(); + highchartsLayoutPanel.renderChart(options); + forceLayout(); + } + + private Menu createDownloadMenu() { + Menu menuDownload = new Menu(); + downloadCSVItem = new MenuItem(DownloadConstants.DOWNLOAD_CSV, + AccountingManagerResources.INSTANCE.accountingFileCSV24()); + downloadCSVItem.setHeight(30); + downloadXMLItem = new MenuItem(DownloadConstants.DOWNLOAD_XML, + AccountingManagerResources.INSTANCE.accountingFileXML24()); + downloadXMLItem.setHeight(30); + downloadJSONItem = new MenuItem(DownloadConstants.DOWNLOAD_JSON, + AccountingManagerResources.INSTANCE.accountingFileJSON24()); + downloadJSONItem.setHeight(30); + downloadPNGItem = new MenuItem(DownloadConstants.DOWNLOAD_PNG, + AccountingManagerResources.INSTANCE.accountingFilePNG24()); + downloadPNGItem.setHeight(30); + downloadJPGItem = new MenuItem(DownloadConstants.DOWNLOAD_JPG, + AccountingManagerResources.INSTANCE.accountingFileJPG24()); + downloadJPGItem.setHeight(30); + downloadPDFItem = new MenuItem(DownloadConstants.DOWNLOAD_PDF, + AccountingManagerResources.INSTANCE.accountingFilePDF24()); + downloadPDFItem.setHeight(30); + downloadSVGItem = new MenuItem(DownloadConstants.DOWNLOAD_SVG, + AccountingManagerResources.INSTANCE.accountingFileSVG24()); + downloadSVGItem.setHeight(30); + + downloadCSVItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + onDownloadCSV(); + + } + + }); + + downloadXMLItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + onDownloadXML(); + + } + + }); + + downloadJSONItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + onDownloadJSON(); + + } + + }); + + downloadPNGItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + String id = highchartsLayoutPanel.getElement().getId(); + onDownloadPNG(id); + + } + }); + + downloadJPGItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + String id = highchartsLayoutPanel.getElement().getId(); + onDownloadJPG(id); + } + }); + + downloadPDFItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + String id = highchartsLayoutPanel.getElement().getId(); + onDownloadPDF(id); + } + }); + + downloadSVGItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + String id = highchartsLayoutPanel.getElement().getId(); + onDownloadSVG(id); + } + }); + + menuDownload.add(downloadCSVItem); + menuDownload.add(downloadXMLItem); + menuDownload.add(downloadJSONItem); + menuDownload.add(downloadPNGItem); + menuDownload.add(downloadJPGItem); + menuDownload.add(downloadPDFItem); + menuDownload.add(downloadSVGItem); + return menuDownload; + + } + + private Menu createUnitMenu() { + Menu menuUnit = new Menu(); + kBItem = new MenuItem(ByteUnitMeasure.KILOBYTE, + AccountingManagerResources.INSTANCE.accountingUnitkB24()); + kBItem.setHeight(30); + MBItem = new MenuItem(ByteUnitMeasure.MEGABYTE, + AccountingManagerResources.INSTANCE.accountingUnitMB24()); + MBItem.setHeight(30); + GBItem = new MenuItem(ByteUnitMeasure.GIGABYTE, + AccountingManagerResources.INSTANCE.accountingUnitGB24()); + GBItem.setHeight(30); + TBItem = new MenuItem(ByteUnitMeasure.TERABYTE, + AccountingManagerResources.INSTANCE.accountingUnitTB24()); + TBItem.setHeight(30); + + kBItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + unitMeasure = ByteUnitMeasure.getKiloByteDimForStorage(); + unitMeasureLabel = ByteUnitMeasure.kB; + unitButton.setIcon(AccountingManagerResources.INSTANCE + .accountingUnitkB24()); + updateChart(); + } + }); + + MBItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + unitMeasure = ByteUnitMeasure.getMegaByteDimForStorage(); + unitMeasureLabel = ByteUnitMeasure.MB; + unitButton.setIcon(AccountingManagerResources.INSTANCE + .accountingUnitMB24()); + updateChart(); + } + }); + + GBItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + unitMeasure = ByteUnitMeasure.getGigaByteDimForStorage(); + unitMeasureLabel = ByteUnitMeasure.GB; + unitButton.setIcon(AccountingManagerResources.INSTANCE + .accountingUnitGB24()); + updateChart(); + } + }); + + TBItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + unitMeasure = ByteUnitMeasure.getTeraByteDimForStorage(); + unitMeasureLabel = ByteUnitMeasure.TB; + unitButton.setIcon(AccountingManagerResources.INSTANCE + .accountingUnitTB24()); + updateChart(); + } + }); + + menuUnit.add(kBItem); + menuUnit.add(MBItem); + menuUnit.add(GBItem); + menuUnit.add(TBItem); + return menuUnit; + + } + + private void onDownloadCSV() { + ExportRequestEvent event = new ExportRequestEvent(ExportType.CSV, + accountingStateData.getAccountingType()); + eventBus.fireEvent(event); + } + + private void onDownloadXML() { + ExportRequestEvent event = new ExportRequestEvent(ExportType.XML, + accountingStateData.getAccountingType()); + eventBus.fireEvent(event); + } + + private void onDownloadJSON() { + ExportRequestEvent event = new ExportRequestEvent(ExportType.JSON, + accountingStateData.getAccountingType()); + eventBus.fireEvent(event); + } + + // chart.options.exporting.buttons.contextButton.menuItems[0].onclick(); + + public static native void onDownloadPNG(String id) /*-{ + console.log(id); + var chart = $wnd + .jQuery('#' + id) + .highcharts( + this.@org.gcube.portlets.admin.accountingmanager.client.maindata.charts.space.SpaceChartSpacesPanel::options); + console.log(chart); + chart.exportChart(); + + }-*/; + + public static native void onDownloadJPG(String id) /*-{ + console.log(id); + var chart = $wnd + .jQuery('#' + id) + .highcharts( + this.@org.gcube.portlets.admin.accountingmanager.client.maindata.charts.space.SpaceChartSpacesPanel::options); + console.log(chart); + chart.exportChart({ + type : 'image/jpeg' + }); + + }-*/; + + public static native void onDownloadPDF(String id) /*-{ + console.log(id); + var chart = $wnd + .jQuery('#' + id) + .highcharts( + this.@org.gcube.portlets.admin.accountingmanager.client.maindata.charts.space.SpaceChartSpacesPanel::options); + console.log(chart); + chart.exportChart({ + type : 'application/pdf' + }); + + }-*/; + + public static native void onDownloadSVG(String id) /*-{ + console.log(id); + var chart = $wnd + .jQuery('#' + id) + .highcharts( + this.@org.gcube.portlets.admin.accountingmanager.client.maindata.charts.space.SpaceChartSpacesPanel::options); + console.log(chart); + chart.exportChart({ + type : 'image/svg+xml' + }); + + }-*/; + + private void createChart() { + SeriesSpace seriesSpace = (SeriesSpace) accountingStateData + .getSeriesResponse(); + + if (!(seriesSpace.getSerieSpaceDefinition() instanceof SeriesSpaceSpaces)) { + Log.debug("Invalid SeriesSpaceCategories!"); + return; + } + SeriesSpaceSpaces seriesSpaceCategories = (SeriesSpaceSpaces) seriesSpace + .getSerieSpaceDefinition(); + + HighchartsOptionFactory highchartsFactory = new JsoHighchartsOptionFactory(); + + options = highchartsFactory.createChartOptions(); + options.chart().zoomType("xy"); + options.exporting().buttons().contextButton().enabled(false); + options.exporting().filename("AccountingSpaceCategories"); + options.title().text("Accounting Space"); + + /* + * options.subtitle().text("Click and drag in the plot area to zoom in"); + */ + + ArrayString colors = options.colors(); + // colors.setValue(0, "#cc0038"); + // colors.setValue(1, "#32cd32"); + + // yAxis + options.setFieldAsJsonObject("yAxis", retrieveYAxis(colors)); + + options.plotOptions().setFieldAsJsonObject( + "column", + "{ " + "\"stacking\": \"normal\"," + "\"dataLabels\": { " + + " \"enabled\": \"true\"," + + " \"color\": \"white\", " + " \"style\": {" + + " \"textShadow\": \"0 0 3px black\"" + " }" + + " }" + " }"); + + ArrayList seriesColumn = new ArrayList<>(); + /* + * if (seriesServiceContext.getShowOthers()) { + * createSeriesColumnShowOthers(seriesServiceContext, highchartsFactory, + * colors, seriesColumn); } else { + */ + createSeriesColumnSimple(seriesSpaceCategories, highchartsFactory, + colors, seriesColumn); + /* } */ + for (SeriesColumn serie : seriesColumn) { + options.series().addToEnd(serie); + } + + options.chart().showAxes(true); + + options.legend().enabled(true); + return; + } + + private void createSeriesColumnShowOthers( + SeriesSpaceSpaces seriesSpaceCategories, + HighchartsOptionFactory highchartsFactory, ArrayString colors, + ArrayList seriesColumn) { + Log.debug("Series ShowOthers"); + if (accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.DAILY) == 0 + || accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.HOURLY) == 0 + || accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.MINUTELY) == 0) { + + double minRange = ChartTimeMeasure + .calculateMinRange(accountingStateData.getSeriesRequest() + .getAccountingPeriod()); + + double interval = ChartTimeMeasure + .calculateInterval(accountingStateData.getSeriesRequest() + .getAccountingPeriod()); + + Date dateStart = dtf.parse(accountingStateData.getSeriesRequest() + .getAccountingPeriod().getStartDate()); + + dateStart.setTime(dateStart.getTime() + + ChartTimeMeasure.timeZoneOffset() + * ChartTimeMeasure.MINUTE); + + Log.debug("BuildChart DateStart: " + + DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_FULL) + .format(dateStart)); + + // xAxis + options.xAxis().type("datetime"); + options.xAxis().minRange(minRange); + options.tooltip().xDateFormat("Selected Data"); + + int i = 0; + for (; i < seriesSpaceCategories.getSeriesSpaceDataCategoriesList() + .size(); i++) { + SeriesColumn seriesColumnData = highchartsFactory + .createSeriesColumn(); + + seriesColumnData.name(seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSpace()); + seriesColumnData.color(colors.get(i)); + seriesColumnData.type("column"); + + ArrayNumber data = seriesColumnData.dataAsArrayNumber(); + + for (SeriesSpaceData seriesSpaceData : seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSeries()) { + switch (measure) { + case DataVolume: + data.push(seriesSpaceData.getDataVolume() / unitMeasure); + break; + default: + data.push(seriesSpaceData.getDataVolume()); + break; + + } + + } + + seriesColumnData.pointInterval(interval).pointStart( + dateStart.getTime()); + seriesColumn.add(seriesColumnData); + + } + + if (i < seriesSpaceCategories.getSeriesSpaceDataCategoriesList() + .size()) { + SeriesColumn seriesColumnData = highchartsFactory + .createSeriesColumn(); + + seriesColumnData.name("Others"); + seriesColumnData.color(colors.get(i)); + seriesColumnData.type("column"); + + ArrayList othersData = new ArrayList<>(); + for (int j = i; j < seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().size(); j++) { + Long value; + for (int k = 0; k < seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(j) + .getSeries().size(); k++) { + SeriesSpaceData seriesSpaceData = seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(j) + .getSeries().get(k); + if (j == i) { + switch (measure) { + case DataVolume: + othersData.add(seriesSpaceData.getDataVolume() + / unitMeasure); + break; + default: + othersData.add(seriesSpaceData.getDataVolume() + / unitMeasure); + break; + + } + } else { + switch (measure) { + case DataVolume: + + value = seriesSpaceData.getDataVolume() + / unitMeasure + othersData.get(k); + othersData.set(k, value); + break; + default: + value = seriesSpaceData.getDataVolume() + / unitMeasure + othersData.get(k); + othersData.set(k, value); + break; + + } + } + + } + } + + ArrayNumber data = seriesColumnData.dataAsArrayNumber(); + + for (Long value : othersData) { + data.push(value); + } + + seriesColumnData.pointInterval(interval).pointStart( + dateStart.getTime()); + seriesColumn.add(seriesColumnData); + } + + } else { + // xAxis + options.xAxis().type("datetime"); + + if (accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.MONTHLY) == 0) { + // options.tooltip().xDateFormat("%b, %Y"); + options.tooltip().xDateFormat("Selected Data"); + + } else { + if (accountingStateData.getSeriesRequest() + .getAccountingPeriod().getPeriod() + .compareTo(AccountingPeriodMode.YEARLY) == 0) { + // options.tooltip().xDateFormat("%Y"); + options.tooltip().xDateFormat("Selected Data"); + + } else { + options.tooltip().xDateFormat("Selected Data"); + } + + } + + int i = 0; + for (; i < seriesSpaceCategories.getSeriesSpaceDataCategoriesList() + .size(); i++) { + SeriesColumn seriesColumnData = highchartsFactory + .createSeriesColumn(); + + seriesColumnData.name(seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSpace()); + seriesColumnData.color(colors.get(i)); + seriesColumnData.type("column"); + + Array arrayData = seriesColumnData.dataAsArrayObject(); + + for (SeriesSpaceData seriesSpaceData : seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSeries()) { + long dateFrom1970 = seriesSpaceData.getDate().getTime(); + + Log.debug("SeriersSpaceData: " + seriesSpaceData.getDate()); + Log.debug("SeriersSpaceData: " + dateFrom1970); + + Data data = highchartsFactory.createSeriesColumnData(); + + switch (measure) { + case DataVolume: + data.x(dateFrom1970); + data.y(seriesSpaceData.getDataVolume() / unitMeasure); + arrayData.addToEnd(data); + break; + default: + data.x(dateFrom1970); + data.y(seriesSpaceData.getDataVolume() / unitMeasure); + arrayData.addToEnd(data); + break; + + } + + } + + seriesColumn.add(seriesColumnData); + + } + + if (i < seriesSpaceCategories.getSeriesSpaceDataCategoriesList() + .size()) { + SeriesColumn seriesColumnData = highchartsFactory + .createSeriesColumn(); + + seriesColumnData.name("Others"); + seriesColumnData.color(colors.get(i)); + seriesColumnData.type("column"); + + ArrayList othersData = new ArrayList<>(); + for (int j = i; j < seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().size(); j++) { + ChartDateTimeData chartDateTimeData; + for (int k = 0; k < seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(j) + .getSeries().size(); k++) { + SeriesSpaceData seriesSpaceData = seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(j) + .getSeries().get(k); + if (j == i) { + switch (measure) { + case DataVolume: + chartDateTimeData = new ChartDateTimeData( + seriesSpaceData.getDate(), + seriesSpaceData.getDataVolume() + / unitMeasure); + othersData.add(chartDateTimeData); + break; + + default: + chartDateTimeData = new ChartDateTimeData( + seriesSpaceData.getDate(), + seriesSpaceData.getDataVolume() + / unitMeasure); + othersData.add(chartDateTimeData); + break; + } + } else { + switch (measure) { + case DataVolume: + chartDateTimeData = new ChartDateTimeData( + seriesSpaceData.getDate(), + (seriesSpaceData.getDataVolume() / unitMeasure) + + othersData.get(k).getValue()); + othersData.set(k, chartDateTimeData); + break; + default: + chartDateTimeData = new ChartDateTimeData( + seriesSpaceData.getDate(), + (seriesSpaceData.getDataVolume() / unitMeasure) + + othersData.get(k).getValue()); + othersData.set(k, chartDateTimeData); + break; + + } + } + + } + } + + Array arrayData = seriesColumnData.dataAsArrayObject(); + + for (ChartDateTimeData chartDateTimeData : othersData) { + long dateFrom1970 = chartDateTimeData.getDate().getTime(); + + Log.debug("SeriersOthersData: " + + chartDateTimeData.getDate()); + Log.debug("SeriersOthersData: " + dateFrom1970); + + Data data = highchartsFactory.createSeriesColumnData(); + + data.x(dateFrom1970); + data.y(chartDateTimeData.getValue()); + arrayData.addToEnd(data); + + } + + seriesColumn.add(seriesColumnData); + } + + } + + } + + private void createSeriesColumnSimple( + SeriesSpaceSpaces seriesSpaceCategories, + HighchartsOptionFactory highchartsFactory, ArrayString colors, + ArrayList seriesColumn) { + + Log.debug("Series Simple"); + if (accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.DAILY) == 0 + || accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.HOURLY) == 0 + || accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.MINUTELY) == 0) { + + double minRange = ChartTimeMeasure + .calculateMinRange(accountingStateData.getSeriesRequest() + .getAccountingPeriod()); + + double interval = ChartTimeMeasure + .calculateInterval(accountingStateData.getSeriesRequest() + .getAccountingPeriod()); + + Date dateStart = dtf.parse(accountingStateData.getSeriesRequest() + .getAccountingPeriod().getStartDate()); + + dateStart.setTime(dateStart.getTime() + + ChartTimeMeasure.timeZoneOffset() + * ChartTimeMeasure.MINUTE); + + Log.debug("BuildChart DateStart: " + + DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_FULL) + .format(dateStart)); + + // xAxis + options.xAxis().type("datetime"); + options.xAxis().minRange(minRange); + options.tooltip().xDateFormat("Selected Data"); + + for (int i = 0; i < seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().size(); i++) { + SeriesColumn seriesColumnData = highchartsFactory + .createSeriesColumn(); + + seriesColumnData.name(seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSpace()); + seriesColumnData.color(colors.get(i)); + seriesColumnData.type("column"); + + ArrayNumber data = seriesColumnData.dataAsArrayNumber(); + + for (SeriesSpaceData seriesSpaceData : seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSeries()) { + switch (measure) { + case DataVolume: + data.push(seriesSpaceData.getDataVolume() / unitMeasure); + break; + default: + data.push(seriesSpaceData.getDataVolume()); + break; + + } + + } + + seriesColumnData.pointInterval(interval).pointStart( + dateStart.getTime()); + seriesColumn.add(seriesColumnData); + + } + + } else { + // xAxis + options.xAxis().type("datetime"); + + if (accountingStateData.getSeriesRequest().getAccountingPeriod() + .getPeriod().compareTo(AccountingPeriodMode.MONTHLY) == 0) { + // options.tooltip().xDateFormat("%b, %Y"); + options.tooltip().xDateFormat("Selected Data"); + + } else { + if (accountingStateData.getSeriesRequest() + .getAccountingPeriod().getPeriod() + .compareTo(AccountingPeriodMode.YEARLY) == 0) { + // options.tooltip().xDateFormat("%Y"); + options.tooltip().xDateFormat("Selected Data"); + + } else { + options.tooltip().xDateFormat("Selected Data"); + } + + } + + for (int i = 0; i < seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().size(); i++) { + SeriesColumn seriesColumnData = highchartsFactory + .createSeriesColumn(); + + seriesColumnData.name(seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSpace()); + seriesColumnData.color(colors.get(i)); + seriesColumnData.type("column"); + + Array arrayData = seriesColumnData.dataAsArrayObject(); + + for (SeriesSpaceData seriesSpaceData : seriesSpaceCategories + .getSeriesSpaceDataCategoriesList().get(i).getSeries()) { + long dateFrom1970 = seriesSpaceData.getDate().getTime(); + + Log.debug("SeriersSpaceData: " + seriesSpaceData.getDate()); + Log.debug("SeriersStorageData: " + dateFrom1970); + + Data data = highchartsFactory.createSeriesColumnData(); + + switch (measure) { + case DataVolume: + data.x(dateFrom1970); + data.y(seriesSpaceData.getDataVolume() / unitMeasure); + arrayData.addToEnd(data); + break; + default: + data.x(dateFrom1970); + data.y(seriesSpaceData.getDataVolume() / unitMeasure); + arrayData.addToEnd(data); + break; + + } + + } + + seriesColumn.add(seriesColumnData); + + } + + } + } + + private String retrieveYAxis(ArrayString colors) { + switch (measure) { + case DataVolume: + return "[{" + " \"id\": \"" + SpaceChartMeasure.DataVolume.name() + + "\"," + " \"labels\": {" + " \"format\": \"{value} " + + unitMeasureLabel + "\"," + " \"style\": {" + + " \"color\": \"" + colors.get(1) + "\"" + " }" + + " }," + " \"stackLabels\": {" + " \"enabled\": \"true\"," + + " \"style\": {" + " \"fontWeight\": \"bold\"," + + " \"color\": \"gray\"" + " } " + " }," + + " \"title\": { " + " \"text\": \"" + + SpaceChartMeasure.DataVolume.getLabel() + "\"," + + " \"style\": {" + " \"color\": \"" + + colors.get(1) + "\"" + " }" + " }" + "}]"; + + default: + return "[{" + " \"id\": \"" + SpaceChartMeasure.DataVolume.name() + + "\"," + " \"labels\": {" + " \"format\": \"{value} " + + unitMeasureLabel + "\"," + " \"style\": {" + + " \"color\": \"" + colors.get(1) + "\"" + " }" + + " }," + " \"stackLabels\": {" + " \"enabled\": \"true\"," + + " \"style\": {" + " \"fontWeight\": \"bold\"," + + " \"color\": \"gray\"" + " } " + " }," + + " \"title\": { " + " \"text\": \"" + + SpaceChartMeasure.DataVolume.getLabel() + "\"," + + " \"style\": {" + " \"color\": \"" + + colors.get(1) + "\"" + " }" + " }" + "}]"; + + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/utils/SpaceChartMeasure.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/utils/SpaceChartMeasure.java new file mode 100644 index 0000000..1869aed --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/maindata/charts/utils/SpaceChartMeasure.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.admin.accountingmanager.client.maindata.charts.utils; + +import java.util.Arrays; +import java.util.List; + +/** + * Service Chart Measure + * + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ + +public enum SpaceChartMeasure { + + DataVolume("Data Volume"); + + /** + * + * @param id + */ + private SpaceChartMeasure(final String id) { + this.id = id; + } + + private final String id; + + @Override + public String toString() { + return id; + } + + public String getLabel() { + return id; + } + + public String getId() { + return id; + } + + /** + * + * @param id + * @return + */ + public static SpaceChartMeasure getFromId(String id) { + if (id == null || id.isEmpty()) + return null; + + for (SpaceChartMeasure measure : values()) { + if (measure.id.compareToIgnoreCase(id) == 0) { + return measure; + } + } + return null; + } + + public static List asList() { + List list = Arrays.asList(values()); + return list; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/menu/AccountingManagerMenu.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/menu/AccountingManagerMenu.java index a98c664..02a3168 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/menu/AccountingManagerMenu.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/menu/AccountingManagerMenu.java @@ -63,6 +63,15 @@ public class AccountingManagerMenu extends TabPanel { AccountingType.SERVICE.name()); add(serviceCategory, serviceItemConf); break; + case SPACE: + TabItemConfig spaceItemConf = new TabItemConfig("Space", false); + spaceItemConf.setIcon(AccountingManagerResources.INSTANCE + .accountingSpace48()); + EmptyPanel spaceCategory = new EmptyPanel( + AccountingType.SPACE.name()); + add(spaceCategory, spaceItemConf); + break; + case STORAGE: TabItemConfig storageItemConf = new TabItemConfig("Storage", false); storageItemConf.setIcon(AccountingManagerResources.INSTANCE diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/ContextDataProperties.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/GenresDataProperties.java similarity index 56% rename from src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/ContextDataProperties.java rename to src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/GenresDataProperties.java index 14ed341..d64a492 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/ContextDataProperties.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/properties/GenresDataProperties.java @@ -1,6 +1,6 @@ package org.gcube.portlets.admin.accountingmanager.client.properties; -import org.gcube.portlets.admin.accountingmanager.shared.data.ContextData; +import org.gcube.portlets.admin.accountingmanager.shared.data.GenresData; import com.google.gwt.editor.client.Editor.Path; import com.sencha.gxt.core.client.ValueProvider; @@ -13,9 +13,9 @@ import com.sencha.gxt.data.shared.PropertyAccess; * href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it * */ -public interface ContextDataProperties extends PropertyAccess { - @Path("contextData") - ModelKeyProvider id(); +public interface GenresDataProperties extends PropertyAccess { + @Path("genre") + ModelKeyProvider id(); - ValueProvider label(); + ValueProvider label(); } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/AccountingManagerResources.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/AccountingManagerResources.java index 62fa31b..b421cff 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/AccountingManagerResources.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/AccountingManagerResources.java @@ -39,6 +39,9 @@ public interface AccountingManagerResources extends ClientBundle { @Source("accounting-job_128.png") ImageResource accountingJob128(); + @Source("accounting-space_128.png") + ImageResource accountingSpace128(); + @Source("accounting-manager_48.png") ImageResource accountingManager48(); @@ -57,6 +60,9 @@ public interface AccountingManagerResources extends ClientBundle { @Source("accounting-job_48.png") ImageResource accountingJob48(); + @Source("accounting-space_48.png") + ImageResource accountingSpace48(); + @Source("accounting-manager_32.png") ImageResource accountingManager32(); @@ -75,6 +81,9 @@ public interface AccountingManagerResources extends ClientBundle { @Source("accounting-job_32.png") ImageResource accountingJob32(); + @Source("accounting-space_32.png") + ImageResource accountingSpace32(); + @Source("accounting-manager_24.png") ImageResource accountingManager24(); @@ -93,6 +102,9 @@ public interface AccountingManagerResources extends ClientBundle { @Source("accounting-job_24.png") ImageResource accountingJob24(); + @Source("accounting-space_24.png") + ImageResource accountingSpace24(); + @Source("accounting-reload_24.png") ImageResource accountingReload24(); @@ -185,19 +197,19 @@ public interface AccountingManagerResources extends ClientBundle { @Source("accounting-file-csv_32.png") ImageResource accountingFileCSV32(); - + @Source("accounting-file-xml_24.png") ImageResource accountingFileXML24(); @Source("accounting-file-xml_32.png") ImageResource accountingFileXML32(); - + @Source("accounting-file-json_24.png") ImageResource accountingFileJSON24(); @Source("accounting-file-json_32.png") ImageResource accountingFileJSON32(); - + @Source("accounting-file-png_24.png") ImageResource accountingFilePNG24(); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_128.png b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_128.png new file mode 100644 index 0000000000000000000000000000000000000000..df774d9f02a24627e186b0363f2959b21cb5d5bd GIT binary patch literal 2535 zcmVsb#VOtaq>1polM-Og(tcDo(poa;OQ`a=bRzDt3K z$@ylMPaOf8reST{K3W2(hNzEkL`*aP&=SzLEeQa?HUJ=yaZ#g2fRF%SZUcQbut`1Z zhc*%8?6(1d5&!{?iE;{n(A7PP8R&{_qy_^JuL*lpDY}jVAVgLU9)35b<&9>Vu z+wFFGjqVd6Aj2<;f>l+;&d$!*d_HIA=jZJF{G2To3pSt6*=#mrWmz&QU2)};{IN#QvBz6I@9P6SU_!u1jlrN)=0Ja2?!d~phA4SZwpK1$81-db! zfJkM=Q$>In!H~=n5E2!f%n}gWnSM$tc+5knzLo(I>&y=!5lbNv6fw{K+=fR19uoi# zX#wl?TI&F-)rzfFE4JBev}TW0yJMCLAeDgSlTxy>EZJ-}V~fRtEfx!{2VgCrD2hF* zIAHEXcTUERXp;^GCtw|bbFKk!3}cA(1$d^EQa{^v931~%Oijid{<9X)e;I%%khOrm z$y4fDK#V|`qW#GOfNBq(lok;4_AhGz!?uH23y9QyUIJLw0&)((!Z;RgD^L*&C}fQ5 ze+XKDtwsU9BN)T3Ln)=AX97daMY^urV;@~P8$Z((5O|EIe<-y8xEBDLzUuGG^!FuYGF)RNGJ2wTZG8FmM~#G>uogu4@w|vkUN@%YyTLM*!EgiDU|nr`X8A z%=aCET-PR&smyraAgJq_q$pHf*LtS|yAnJJPVJ9OVfIrcV-%66u4`77rL)>ZGPW6S z0000*?%}dFksQ-mV*-G>G#k*pvDYS&V>y0|HQM$JN+z44NR;c^L{78-Uv>N8 zIk5iKbs~`SQh^UDx*!oJ0W1y8ToI8?iFzv$?*HAcs2MtlRIK8>gUS zu_JtoP_7*BGy+go?cVKnB%(|Rd`J*EKnQjFA^P}UdLRj;0s$ESLaW1ZTSdDp96s8Zt_jih_1Yv;SSpP_45I2g+kMsTH#vFW<4sN;_;{0(A6p9;%kG%9i8$xnnHo5D-G0oo zV}9J^1SAYm1u4(xQ*rXKYXOk^Nmnx;BiCo6 z;^b4&0-Sk^>U=&GC!dNI;Jo*_*k~MEz()WW$_G&GiK%!1D!Z=s|9eTG%g*=)0Tm~o zwSWV>z?3+7D!Zd;0YkQfA=T}ln%xt5749qogjTC(3U*!F7SAChw{)7#xBLLY)Un~- zcdZ^OPCf-Kzy<)PT7ZvQJye{0(prEGDW@cZSqlhX3plj2XDuKyyWX^bQSs1uW247{qU zG!U>j1ORyZ_H8lRF2J@Dm@^-D7G`=;6no)+$Q^#0%7_O6!fjcWIs^|{cBt)Q^%2X^ z5DCmrFS)$DRE#m@3jjI_m|+sjpHfOzRn^|?KXvP5hGVmA8~hwsD#1?Z`%!L`cJXyM z99i*M1l)(^a#{TT{hRrW06Oga`0=BK(1mOE;pM=kBk)>_OQu7O0Q@>st1u?JIIqGl z`1#ezG6b{#`ue)OxVTV#!+)=Bp!xgn-o0ag{`}$h_xG*o@F6q*DbmF}I%TqvX3`b2 zT?{%5i0kX?^6%fj-K$rx)c5b-85IB?fncmsv9@DSHUh+UWO}G0eA|8QW8@*>@35QOP`Zve<32-Epq0g!_xSbyT&s%AX2NM_8%YF=(@Gzg~|W`002ovPDHLkV1hpAu7Cgl literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_24.png b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_24.png new file mode 100644 index 0000000000000000000000000000000000000000..a36181f6f8da2e42f478533e73d735d98f7c48d0 GIT binary patch literal 928 zcmV;R17G}!P)X-G?Cbl4U(0gKt(^Dy2TzeFg0FA^zK3 z@O_`Xy}gWob#)aHd1{<_U`Is$wt?5c+;hXXZJWu-N%Hxx-_UNiv2FV$&CCI>ZQ#{& zQA#Pa*5q9$D2iw{n-mI#1c5Oop(st&qo&(Ro*@z- z3`45bDraYBXsrQ=qKN6~X}aAmK@cQGjWNv6&oePGF}MfMAqawi{r&v`nI0YdB#rkMuaZkOxp>kQ;D49VqkynXvNkz}XSA&MeOr4o+gU|H7F0!bfkZf@Av z*cb@f+S=my_&DQRTwJ79t8sL6l<_YuEg>Qa0wp4qSf-bkmsG1&f*?qOa=9Fy=W%;` zn_0Bs;bDw1wA<|jvEw+*%*;?KmEw7w+Q3KPub86U-Q58Mo12>hi?+75#=*e>7Z(>9 z|IW@%`uNcXzQiZ3HM6s`+}+(JlDoRP!WcubSj6)@0DRvENR$*WU7DJ{eX)Vhz^RDL zDW$M1D_N-69LLEln(Mk)mW9?j6K{-35BwDPY%8UjBJx2g^@oV$>-9RFPA8+HFbt{H zYRUE7YPB%N;QKy}Mk7&Iuh)y`)B!#yrJ9-Rx?Zm@pP!%0{r$a);pX#sJkO)qY!Zec z0G4GjGBQFGMfko?6h$bda9vlXrlwS}Sp40#?d8Ysfg1$D&%Ivn$GA{@(P^!DczDR{ zhvPVi21c)?cD`)cgkg?ZQi%@X5P$vGw%UI z2s7)<{3SE5F!Nhxwm2+S7hCE6tK(A$GjB2T1v9sJcxiQYwm!!2GiH9rA208i`Pqk@ zy2_tUs&Ubv2;<)YcmqI0DRep=n5GG44q=92Ael_Yol64vfr$Q$b)f6zFLB1DlqeJm zI5;>!yWQ@?9LK@h+8UOYmY}NYLr(leM0@^%8q7I>%{b!#;CUWetro7Xt|IYfvkAv> zpePE6DC!phV3V2uAfjTQ0|0&lF!4xjAdyI5b#)b%W%bfPM9?%1x~@Y?`B;ffbZvdz zbD$ggmB%!R2)1qG@bEAa-`LoQJNcljF!L4>?TK!~crhe9005e%#o|%L86z*4Syur( z2e2@#mJkBV%gb;aCsc$&h^Mf90l;&$o0HTq8bkyk1j^+yI-O3W14E_&U7HgsfR|5b zQ1Cnt`FuVScU|`>DFA?%#LO0ep$12%(?PLVM4?bXtJUhm5{U$6XJ@gnumD}xLy;gN zsH!@+ZmYu@_cyUDE0zV@+uJxgI>Oo6SqRfK4g351n4X>vI-!dv&WHzD&~CSpPNyTW zsi`U0wjJsdYE-*5O*1l|uIoZk6y$O_xUL(*q?E{Jv&iLgp%fT~5m_H02W;EM$;k;W zFE2xzR4Nth?Cjw7_BN6Qs;a`aZIntSD2mdDPfkuoGDHPn`*py~ux%TaN(H4-DKeCe zM&m&i)a!K=i^WJiDdk`kY+~lO0KV}ZxVyVUKA%UmTJ2L%6a~7jL)UefrWu-snx?@p z40xW0X0r*;^ZJ^XVHj9kT*S=GOmJHMr2^RX9q=dK>FFu1udgFdxw*NCE`ajYb1EH#eb8 zYPA}Y$s{V3$_KL`u;*(cveoXX_n7%xB3hABqFgS=-g+LJ1&^_yD}VdfG8(vs|5K~g zCN3^61{ENL=vDgt{XHDV>C362D9B_oa9tP8W;3KaGBV<`pr)$oSD`Bz5fwepdzDJ1 zex93~6ZLw%msdY@sZHqoc@VG7`Wm-+1J;+_J3i z0sQW|t_Yrxh@jNfob`?dD0DerT({F};m`Eu(_yuJU3*r&$)h9pG kKI_x$fAKi|ub$`s0s(?8t%~_0od5s;07*qoM6N<$f-#d88UO$Q literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_48.png b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_48.png new file mode 100644 index 0000000000000000000000000000000000000000..182f49837bc8d7988ff695a14217cef1f0f51fd3 GIT binary patch literal 1688 zcmV;J250$+P);E zK~!ko)mlqy6j>DhZoRrHcDg&=Y7!EILEL2FBItk{UjbdsLXhzXhzJAY!U0i4VIr;s zaTdim#OEq|;Sh&*NgMnog&x`j*|vj0XaNK6UH+&OPUR zr*0L{fe}%Li28|WfQar8(Hyn6xxjZIxHf~WHX`aHqEkflClTrN?WPB7oFbyWtpb0I zh$=)>r|wxjSo7Lu0^dhOW!iiz6VbkIgFhccXsfJ3MCW<1u{OXp0A&E<0K_dWH4nfu z0EZc4W@-XNlml=dzzNP>0ueR-kG&ydjXzHN8^BMDu~lvYLF6B%0bj4z@#4h`RIAlQ zU)ObU@Zdr8_Vz*$gft{hM(unx;XLBwi9H z0!%-&{vbpZY>@N($?AEi*X!JAVHgG+$4N}J2pf+oY@xMP0+>uwutWsk_hH*M48!2M z#&H~Yo|l$@2w<|c#j+MKWdMiLtm^wdEX%^u(h}ajeG6UJVObVD&)ZPEvMeK)%VB6} z2!n%z=;`T!BuQzz(-X$n;SDtqsNkV*>357V_`Z*snHelDF1Gc*apOjsF4Ss=i0B$) zY_gF;!5ng-lcvoWgQjUn({ei?aUq7cLOTYaAO)SM*lGR)z|*HsF+V@gUBn%dC<0&tfU8}YR^j_T_h`_C8VK#GlvZ_< zK=BHh=Xu;D+U(LeqYlH+EM#xqyn(LksMqW33N-{F%QEu$JO&2`(cj+>RaGI1@uDvX z0vKZuMKP9$)Q#weLiXs$=EfG8h>dfubmhYs<2{ zVKC$(;QKywUB}CpFB2CaBDk)Lv9U4i-n|>8QYqFyEXuH$j~+dmD0-qOBA3f07P^#_ z61uMA?%lg>9}@xK=FOW}SXkf^vP+jP;nSy2Tt$5L>{;yHyEnd5B}LV7oJ97`R;^aK zm6bRDoAD$Om`@^5sZ_XbQmfTcJ&`$%!{zI`ZW7^nMnrc2{M@RPhGF32$B%gT?j4qw zmm?Pv1Oc)vBb&`4lgYrcEYxZ>Se6wjWQw9d(==?`whgZ9qE@RlI#P3#L-ERHvlti{ zz|hbT^7(v}7W^RrxZX-29JJQf)^PjwZLUaNzI++8v$J^q{CQj7ix)5A_3PJo@ZdpP z-!o^UX*X8yN zC*25p44@)0#w;S50`OzhQ`zX~DAv~2VsFS8L$z9k=Xu;h=6N1eRpk;gMNy*eZ2_2K zj9KA6&H|`66JU%%RaNZYzaO@3$BI)pDax{pk&zK>-@d&oLKdc3E|-f+qk4e(Um;_R zEfdi#0KYXaU|AOK-MhynWLK_S!Q$fLRtecH#@O;YAq&n~p0tVwuaLQ}o9Y>&10j17 zo(V-M@h<>Yn#T!VA#)rDrfF`9kTnrl2{1+; z>Gwne0qcKk+dix>%swzCsTjv|4#G0m| zudffqViBsUE+~p}fNL6ET3R|%EEXSTv)SXKD56j(M0N|tSYsDNQH1aNjp(=YC8ESr z>gL^*WqIb+t5+u@TXS6QRVtNyPfyQ%B03(|>Y9P^2w>~$rKEM6+V1q{&!0~Z4-Z#T z5eNWj!IAqo5sADvJOIyhT|cs8#|{IX*#G%8YZ?;Y?~CphBH!ny1}!AM i-;X_7i2UcD+k6FSVj=RyWh3bT0000 callback); - /** * Retrieve Accounting Series in Cache * @@ -67,16 +67,16 @@ public interface AccountingManagerServiceAsync { */ void getSeries(AccountingType accountingType, SeriesRequest seriesRequest, AsyncCallback callback); - - + /** * Accounting Request Monitor * * @param operationId * @param callback */ - void operationMonitor(String operationId, AsyncCallback callback); - + void operationMonitor(String operationId, + AsyncCallback callback); + /** * * @param accountingType @@ -95,6 +95,12 @@ public interface AccountingManagerServiceAsync { */ void getContext(AsyncCallback callback); + /** + * + * @param callback + */ + void getSpaces(AsyncCallback callback); + /** * * @param itemDescription @@ -118,14 +124,12 @@ public interface AccountingManagerServiceAsync { * return the list of enabled tabs */ void getEnableTabs(AsyncCallback callback); - + /** * Check if the user is in root scope * * @param callback */ void isRootScope(AsyncCallback callback); - - } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/state/AccountingClientStateData.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/state/AccountingClientStateData.java index 4dee1fd..d638822 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/client/state/AccountingClientStateData.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/client/state/AccountingClientStateData.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.ArrayList; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.data.Context; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; import org.gcube.portlets.admin.accountingmanager.shared.data.query.SeriesRequest; @@ -23,12 +24,30 @@ public class AccountingClientStateData implements Serializable { private SeriesResponse seriesResponse; private ArrayList availableFilterKeys; private Context availableContext; + private Spaces availableSpaces; private Boolean rootScope; public AccountingClientStateData() { super(); } - + + /** + * + * @param accountingType + * @param rootScope + */ + public AccountingClientStateData(AccountingType accountingType, + Boolean rootScope) { + super(); + this.accountingType = accountingType; + this.seriesRequest = null; + this.seriesResponse = null; + this.availableFilterKeys = null; + this.availableContext = null; + this.availableSpaces = null; + this.rootScope = rootScope; + } + /** * * @param accountingType @@ -41,13 +60,14 @@ public class AccountingClientStateData implements Serializable { public AccountingClientStateData(AccountingType accountingType, SeriesRequest seriesRequest, SeriesResponse seriesResponse, ArrayList availableFilterKeys, Context availableContext, - Boolean rootScope) { + Spaces availableSpaces, Boolean rootScope) { super(); this.accountingType = accountingType; this.seriesRequest = seriesRequest; this.seriesResponse = seriesResponse; this.availableFilterKeys = availableFilterKeys; this.availableContext = availableContext; + this.availableSpaces = availableSpaces; this.rootScope = rootScope; } @@ -99,13 +119,22 @@ public class AccountingClientStateData implements Serializable { this.accountingType = accountingType; } + public Spaces getAvailableSpaces() { + return availableSpaces; + } + + public void setAvailableSpaces(Spaces availableSpaces) { + this.availableSpaces = availableSpaces; + } + @Override public String toString() { return "AccountingClientStateData [accountingType=" + accountingType + ", seriesRequest=" + seriesRequest + ", seriesResponse=" + seriesResponse + ", availableFilterKeys=" + availableFilterKeys + ", availableContext=" - + availableContext + ", rootScope=" + rootScope + "]"; + + availableContext + ", availableSpaces=" + availableSpaces + + ", rootScope=" + rootScope + "]"; } } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientCallable.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientCallable.java index 79a2dc8..915bd28 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientCallable.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientCallable.java @@ -29,11 +29,12 @@ public class AccountingClientCallable implements Callable { private TaskRequest taskRequest; private AccountingCache accountingCache; - public AccountingClientCallable(TaskRequest taskRequest, AccountingCache accountingCache) { + public AccountingClientCallable(TaskRequest taskRequest, + AccountingCache accountingCache) { super(); this.taskRequest = taskRequest; this.accountingCache = accountingCache; - logger.debug("AccountingClientCallable: "+taskRequest); + logger.debug("AccountingClientCallable: " + taskRequest); } @Override @@ -41,28 +42,30 @@ public class AccountingClientCallable implements Callable { try { HttpSession httpSession = taskRequest.getHttpSession(); - if(httpSession==null){ + if (httpSession == null) { logger.error("Error retrieving HttpSession in AccountingClientCallable: is null"); return TaskStatus.ERROR; } - - - logger.info("Set SecurityToken: "+taskRequest.getServiceCredentials().getToken()); - SecurityTokenProvider.instance.set(taskRequest.getServiceCredentials().getToken()); - logger.info("Set ScopeProvider: "+taskRequest.getServiceCredentials().getScope()); - ScopeProvider.instance.set(taskRequest.getServiceCredentials().getScope()); - - + AccountingCallerInterface accountingCaller; if (Constants.DEBUG_MODE) { accountingCaller = new AccountingCallerTester(); } else { + logger.info("Set SecurityToken: " + + taskRequest.getServiceCredentials().getToken()); + SecurityTokenProvider.instance.set(taskRequest + .getServiceCredentials().getToken()); + logger.info("Set ScopeProvider: " + + taskRequest.getServiceCredentials().getScope()); + ScopeProvider.instance.set(taskRequest.getServiceCredentials() + .getScope()); accountingCaller = new AccountingCaller(); + } SeriesResponse seriesResponse = null; - try { + try { seriesResponse = accountingCaller.getSeries( taskRequest.getAccountingType(), taskRequest.getSeriesRequest()); @@ -96,7 +99,6 @@ public class AccountingClientCallable implements Callable { + taskRequest.getAccountingType().name() + "_" + taskRequest.getSeriesRequest().toString()); - accountingCache.putSeries(key, seriesResponse); AccountingStateData accountingStateData = new AccountingStateData( @@ -130,6 +132,6 @@ public class AccountingClientCallable implements Callable { + e.getLocalizedMessage(), e); return TaskStatus.ERROR; } - + } } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java index c194ba9..8b69297 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java @@ -139,17 +139,25 @@ public class AccountingClientDaemon implements Runnable { private void retrieveTimeOut() { long timeo = 0; - try { - LiferayGroupManager groupManagement = new LiferayGroupManager(); - String scope = groupManagement - .getInfrastructureScope(groupManagement.getRootVO() - .getGroupId()); - logger.debug("Retrieving thread pool timeout in scope: " + scope); - ThreadPoolInfo threadPoolInfo = BuildThreadPoolInfo.build(scope); - timeo = threadPoolInfo.getTimeout(); - } catch (Throwable e) { - logger.error("Error retrieving thread pool timeout!", e); - return; + if (Constants.DEBUG_MODE) { + logger.info("AccountingManager use default configuration for threadpool"); + timeo = Constants.SERVICE_CLIENT_TIMEOUT_DEFAULT_MILLIS; + } else { + + try { + LiferayGroupManager groupManagement = new LiferayGroupManager(); + String scope = groupManagement + .getInfrastructureScope(groupManagement.getRootVO() + .getGroupId()); + logger.debug("Retrieving thread pool timeout in scope: " + + scope); + ThreadPoolInfo threadPoolInfo = BuildThreadPoolInfo + .build(scope); + timeo = threadPoolInfo.getTimeout(); + } catch (Throwable e) { + logger.error("Error retrieving thread pool timeout!", e); + return; + } } if (timeo > 0) { diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java index 869dfc7..a105b1f 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java @@ -23,6 +23,7 @@ import org.gcube.portlets.admin.accountingmanager.server.util.TaskRequest; import org.gcube.portlets.admin.accountingmanager.server.util.TaskWrapper; import org.gcube.portlets.admin.accountingmanager.shared.Constants; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.data.Context; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesRequest; @@ -101,15 +102,29 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet } } - + @Override public EnableTabs getEnableTabs() throws ServiceException { try { ServiceCredentials serviceCredentials = SessionUtil .getServiceCredentials(this.getThreadLocalRequest()); + logger.debug("getEnableTabs()"); + + boolean isRootScope=false; + if (Constants.DEBUG_MODE) { + isRootScope=true; + } else { + LiferayGroupManager groupManagement = new LiferayGroupManager(); + isRootScope = groupManagement.isRootVO(groupManagement + .getGroupIdFromInfrastructureScope(serviceCredentials + .getScope())); + } + logger.debug("RootScope: " + isRootScope); + EnableTabs enableTabs = BuildEnableTabs.build(serviceCredentials - .getScope()); + .getScope(), isRootScope); + logger.debug("EnableTabs: " + enableTabs); return enableTabs; } catch (ServiceException e) { @@ -125,15 +140,14 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet @Override public Long getClientMonitorTimeout() throws ServiceException { try { - SessionUtil - .getServiceCredentials(this.getThreadLocalRequest()); + SessionUtil.getServiceCredentials(this.getThreadLocalRequest()); ServletContext sc = getServletContext(); Long timeout = (Long) sc .getAttribute(SessionConstants.ACCOUNTING_CLIENT_MONITOR_TIME_OUT_PERIODMILLIS); logger.debug("Accounting Client Monitor Time Out in milliseconds: " + timeout); - + return timeout; } catch (ServiceException e) { @@ -141,13 +155,12 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet throw e; } catch (Throwable e) { e.printStackTrace(); - logger.error("getClientMonitorTimeout(): " + e.getLocalizedMessage(), e); + logger.error( + "getClientMonitorTimeout(): " + e.getLocalizedMessage(), e); throw new ServiceException(e.getLocalizedMessage()); } } - - - + /** * * {@inheritDoc} @@ -384,6 +397,39 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet } + /** + * + * {@inheritDoc} + */ + @Override + public Spaces getSpaces() throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + @SuppressWarnings("unused") + ServiceCredentials serviceCredentials = SessionUtil + .getServiceCredentials(httpRequest); + + AccountingCallerInterface accountingCaller; + if (Constants.DEBUG_MODE) { + accountingCaller = new AccountingCallerTester(); + } else { + accountingCaller = new AccountingCaller(); + } + Spaces categories = accountingCaller.getSpaces(); + + return categories; + + } catch (ServiceException e) { + e.printStackTrace(); + throw e; + } catch (Throwable e) { + e.printStackTrace(); + logger.error("getCategories(): " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + + } + /** * * {@inheritDoc} @@ -424,16 +470,16 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet if (Constants.DEBUG_MODE) { logger.debug("RootScope: " + true); return true; + } else { + LiferayGroupManager groupManagement = new LiferayGroupManager(); + Boolean isRoot = groupManagement.isRootVO(groupManagement + .getGroupIdFromInfrastructureScope(serviceCredentials + .getScope())); + + logger.debug("RootScope: " + isRoot); + return isRoot; } - LiferayGroupManager groupManagement = new LiferayGroupManager(); - Boolean isRoot = groupManagement.isRootVO(groupManagement - .getGroupIdFromInfrastructureScope(serviceCredentials - .getScope())); - - logger.debug("RootScope: " + isRoot); - return isRoot; - } catch (ServiceException e) { e.printStackTrace(); throw e; diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java index 4a3d8be..db59d91 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java @@ -6,19 +6,24 @@ import org.gcube.portlets.admin.accountingmanager.server.amservice.command.Accou import org.gcube.portlets.admin.accountingmanager.server.amservice.command.AccountingCommandContext; import org.gcube.portlets.admin.accountingmanager.server.amservice.command.AccountingCommandGetFilterKeys; import org.gcube.portlets.admin.accountingmanager.server.amservice.command.AccountingCommandGetFilterValues; +import org.gcube.portlets.admin.accountingmanager.server.amservice.command.AccountingCommandSpaces; +import org.gcube.portlets.admin.accountingmanager.server.amservice.command.AccountingCommandGetSpaces; import org.gcube.portlets.admin.accountingmanager.server.amservice.command.AccountingCommandTop; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery4Job; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery4Portlet; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery4Service; +import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery4Space; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery4Storage; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuery4Task; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQueryBasic; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQueryBuilder; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQueryContext; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQueryDirector; +import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuerySpaces; import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQueryTop; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesRequest; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesResponse; @@ -56,6 +61,14 @@ public class AccountingCaller implements AccountingCallerInterface { return accountingCommand.execute(); } + + + public Spaces getSpaces() throws ServiceException { + AccountingCommandGetSpaces accountingCommand = new AccountingCommandGetSpaces(); + return accountingCommand.execute(); + + } + public SeriesResponse getSeries(AccountingType accountingType, SeriesRequest seriesRequest) throws ServiceException { @@ -94,6 +107,11 @@ public class AccountingCaller implements AccountingCallerInterface { AccountingCommandContext accountingCommandContext = new AccountingCommandContext( accountingQueryContext, accountingType); return accountingCommandContext.execute(); + case Spaces: + AccountingQuerySpaces accountingQuerySpace = (AccountingQuerySpaces) query; + AccountingCommandSpaces accountingCommandSpace = new AccountingCommandSpaces( + accountingQuerySpace, accountingType); + return accountingCommandSpace.execute(); default: throw new ServiceException( "Error in invocation: Operation not supported"); @@ -130,6 +148,8 @@ public class AccountingCaller implements AccountingCallerInterface { return new AccountingQuery4Storage(seriesRequest); case TASK: return new AccountingQuery4Task(seriesRequest); + case SPACE: + return new AccountingQuery4Space(seriesRequest); default: throw new ServiceException("Error request type is unknow!"); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerInterface.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerInterface.java index d5fd349..58f2aa4 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerInterface.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerInterface.java @@ -3,6 +3,7 @@ package org.gcube.portlets.admin.accountingmanager.server.amservice; import java.util.ArrayList; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesRequest; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesResponse; @@ -22,11 +23,11 @@ public interface AccountingCallerInterface { throws ServiceException; public FilterValuesResponse getFilterValues( - FilterValuesRequest filterValuesRequest) - throws ServiceException; + FilterValuesRequest filterValuesRequest) throws ServiceException; + + public Spaces getSpaces() throws ServiceException; public SeriesResponse getSeries(AccountingType accountingType, - SeriesRequest seriesRequest) - throws ServiceException; + SeriesRequest seriesRequest) throws ServiceException; } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerTester.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerTester.java index 8ae1629..7aed75c 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerTester.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCallerTester.java @@ -12,6 +12,7 @@ import java.util.List; import org.gcube.accounting.analytics.TemporalConstraint; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterTop; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; import org.gcube.portlets.admin.accountingmanager.shared.data.Context; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValue; @@ -21,6 +22,7 @@ import org.gcube.portlets.admin.accountingmanager.shared.data.query.SeriesReques import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesJob; import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesResponse; import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesService; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesSpace; import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesStorage; import org.gcube.portlets.admin.accountingmanager.shared.data.response.job.SeriesJobBasic; import org.gcube.portlets.admin.accountingmanager.shared.data.response.job.SeriesJobContext; @@ -36,6 +38,10 @@ import org.gcube.portlets.admin.accountingmanager.shared.data.response.service.S import org.gcube.portlets.admin.accountingmanager.shared.data.response.service.SeriesServiceDataTop; import org.gcube.portlets.admin.accountingmanager.shared.data.response.service.SeriesServiceDefinition; import org.gcube.portlets.admin.accountingmanager.shared.data.response.service.SeriesServiceTop; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceSpaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceData; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceDataSpaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceDefinition; import org.gcube.portlets.admin.accountingmanager.shared.data.response.storage.SeriesStorageBasic; import org.gcube.portlets.admin.accountingmanager.shared.data.response.storage.SeriesStorageContext; import org.gcube.portlets.admin.accountingmanager.shared.data.response.storage.SeriesStorageData; @@ -72,13 +78,13 @@ public class AccountingCallerTester implements AccountingCallerInterface { return new ArrayList(); } ArrayList filterKeys = new ArrayList(); - + FilterKey key = new FilterKey("ConsumerId"); filterKeys.add(key); - + key = new FilterKey("ClassName"); filterKeys.add(key); - + for (int i = 0; i < 20; i++) { key = new FilterKey("ServiceName" + i); filterKeys.add(key); @@ -99,14 +105,14 @@ public class AccountingCallerTester implements AccountingCallerInterface { try { logger.debug("getFilterValue(): [FilterValueRequest=" + filterValuesRequest + "]"); - FilterValuesResponse filterValuesResponse=null; + FilterValuesResponse filterValuesResponse = null; if (filterValuesRequest == null || filterValuesRequest.getAccountingType() == null || filterValuesRequest.getFilterKey() == null) { filterValuesResponse = new FilterValuesResponse( new ArrayList()); return filterValuesResponse; - + } ArrayList filterValues = new ArrayList(); @@ -116,15 +122,11 @@ public class AccountingCallerTester implements AccountingCallerInterface { switch (filterValuesRequest.getAccountingType()) { case JOB: - values = Arrays.asList(vals); case PORTLET: - values = Arrays.asList(vals); case SERVICE: - values = Arrays.asList(vals); case STORAGE: - values = Arrays.asList(vals); case TASK: - values = Arrays.asList(vals); + case SPACE: default: values = Arrays.asList(vals); } @@ -133,9 +135,8 @@ public class AccountingCallerTester implements AccountingCallerInterface { filterValues.add(new FilterValue(value)); } } - - filterValuesResponse = new FilterValuesResponse( - filterValues); + + filterValuesResponse = new FilterValuesResponse(filterValues); return filterValuesResponse; } catch (Throwable e) { logger.error("Error in getFilterValues(): " @@ -435,6 +436,81 @@ public class AccountingCallerTester implements AccountingCallerInterface { seriesResponse = new SeriesService(serieServiceDefinition); break; + case SPACE: + SeriesSpaceDefinition serieSpaceDefinition = null; + if (seriesRequest.getAccountingFilterDefinition() + .getChartType() != null) { + ArrayList seriesSpaceData = new ArrayList<>(); + switch (seriesRequest.getAccountingPeriod().getPeriod()) { + case DAILY: + case HOURLY: + case MINUTELY: + for (int i = 0; i < 30; i++) { + SeriesSpaceData data = new SeriesSpaceData( + new Date(), new Double( + 10000 * Math.random()).longValue()); + seriesSpaceData.add(data); + } + break; + case MONTHLY: + while (startCalendar.compareTo(endCalendar) <= 0) { + SeriesSpaceData data = new SeriesSpaceData( + startCalendar.getTime(), new Double( + 10000 * Math.random()).longValue()); + seriesSpaceData.add(data); + startCalendar.add(Calendar.MONTH, 1); + } + break; + case YEARLY: + while (startCalendar.compareTo(endCalendar) <= 0) { + SeriesSpaceData data = new SeriesSpaceData( + startCalendar.getTime(), new Double( + 10000 * Math.random()).longValue()); + seriesSpaceData.add(data); + startCalendar.add(Calendar.YEAR, 1); + } + break; + default: + break; + + } + + switch (seriesRequest.getAccountingFilterDefinition() + .getChartType()) { + case Basic: + case Top: + case Context: + break; + case Spaces: + // AccountingFilterContext accountingFilterContext = + // (AccountingFilterContext) seriesRequest + // .getAccountingFilterDefinition(); + ArrayList seriesSpaceDataSpacesList = new ArrayList<>(); + ArrayList spacesList = new ArrayList<>(); + + for (int i = 1; i < 3; i++) { + String space = new String("Space" + i); + spacesList.add(space); + SeriesSpaceDataSpaces seriesSpaceDataSpaces = new SeriesSpaceDataSpaces( + space, seriesSpaceData); + seriesSpaceDataSpacesList + .add(seriesSpaceDataSpaces); + } + + Spaces spaces=new Spaces(spacesList); + serieSpaceDefinition = new SeriesSpaceSpaces( + spaces, seriesSpaceDataSpacesList); + + default: + break; + + } + } + + seriesResponse = new SeriesSpace(serieSpaceDefinition); + + break; + case STORAGE: SeriesStorageDefinition serieStorageDefinition = null; if (seriesRequest.getAccountingFilterDefinition() @@ -549,4 +625,13 @@ public class AccountingCallerTester implements AccountingCallerInterface { } } + + @Override + public Spaces getSpaces() throws ServiceException { + ArrayList categoriesList = new ArrayList<>(); + categoriesList.add("Space1"); + categoriesList.add("Space2"); + Spaces categories = new Spaces(categoriesList); + return categories; + } } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandGetFilterKeys.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandGetFilterKeys.java index 5fa8fcf..73a8594 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandGetFilterKeys.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandGetFilterKeys.java @@ -6,6 +6,7 @@ import java.util.SortedSet; import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery; import org.gcube.accounting.datamodel.aggregation.AggregatedJobUsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; +import org.gcube.accounting.datamodel.aggregation.AggregatedStorageStatusRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedStorageUsageRecord; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; import org.gcube.portlets.admin.accountingmanager.shared.data.FilterKey; @@ -15,20 +16,21 @@ import org.slf4j.LoggerFactory; /** * - * @author Giancarlo Panichi - * email: g.panichi@isti.cnr.it + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it * */ -public class AccountingCommandGetFilterKeys implements AccountingCommand> { - private static final Logger logger = LoggerFactory.getLogger(AccountingCommandGetFilterKeys.class); - +public class AccountingCommandGetFilterKeys implements + AccountingCommand> { + private static final Logger logger = LoggerFactory + .getLogger(AccountingCommandGetFilterKeys.class); + private AccountingType accountingType; - - public AccountingCommandGetFilterKeys(AccountingType accountingType){ - this.accountingType=accountingType; + + public AccountingCommandGetFilterKeys(AccountingType accountingType) { + this.accountingType = accountingType; } - - + @Override public ArrayList execute() throws ServiceException { try { @@ -40,29 +42,34 @@ public class AccountingCommandGetFilterKeys implements AccountingCommand filterKeys = new ArrayList(); SortedSet keys; - switch (accountingType) { case JOB: - keys = AccountingPersistenceQuery.getQuerableKeys(AggregatedJobUsageRecord.class); + keys = AccountingPersistenceQuery + .getQuerableKeys(AggregatedJobUsageRecord.class); break; case PORTLET: // keys=rrq.getKeys(AggregatedPortletUsageRecord.class); return filterKeys; case SERVICE: - keys = AccountingPersistenceQuery.getQuerableKeys(AggregatedServiceUsageRecord.class); + keys = AccountingPersistenceQuery + .getQuerableKeys(AggregatedServiceUsageRecord.class); break; case STORAGE: - keys =AccountingPersistenceQuery.getQuerableKeys(AggregatedStorageUsageRecord.class); + keys = AccountingPersistenceQuery + .getQuerableKeys(AggregatedStorageUsageRecord.class); break; case TASK: // keys=rrq.getKeys(AggregatedTaskUsageRecord.class); return filterKeys; + case SPACE: + keys = AccountingPersistenceQuery + .getQuerableKeys(AggregatedStorageStatusRecord.class); + break; default: return filterKeys; } - - - logger.debug("AccountingPersistenceQuery.getQuerableKeys: "+keys); + + logger.debug("AccountingPersistenceQuery.getQuerableKeys: " + keys); for (String key : keys) { if (key != null && !key.isEmpty()) { filterKeys.add(new FilterKey(key)); @@ -71,7 +78,8 @@ public class AccountingCommandGetFilterKeys implements AccountingCommandg.panichi@isti.cnr.it + * + */ +public class AccountingCommandGetSpaces implements + AccountingCommand { + private static final Logger logger = LoggerFactory + .getLogger(AccountingCommandGetSpaces.class); + + public AccountingCommandGetSpaces() { + } + + @Override + public Spaces execute() throws ServiceException { + try { + logger.debug("getSpaces()"); + SortedSet keys = null; + AccountingPersistenceQuery apq = AccountingPersistenceQueryFactory + .getInstance(); + + keys = apq.getSpaceProvidersIds(); + + logger.debug("AccountingPersistenceQuery.getSpaces: " + keys); + if (keys == null || keys.isEmpty()) { + return null; + } + + ArrayList spaceList = new ArrayList<>(); + + for (String key : keys) { + if (key != null && !key.isEmpty()) { + spaceList.add(key); + } + } + Spaces categories = new Spaces(spaceList); + + logger.debug("Spaces:" + categories); + + return categories; + } catch (Throwable e) { + logger.error("Error in AccountingCommandGetSpaces(): " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException("No spaces available!"); + + } + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandSpaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandSpaces.java new file mode 100644 index 0000000..efc3505 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandSpaces.java @@ -0,0 +1,111 @@ +package org.gcube.portlets.admin.accountingmanager.server.amservice.command; + +import java.util.Calendar; +import java.util.SortedMap; + +import org.gcube.accounting.analytics.Filter; +import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery; +import org.gcube.accounting.analytics.persistence.AccountingPersistenceQueryFactory; +import org.gcube.portlets.admin.accountingmanager.server.amservice.query.AccountingQuerySpaces; +import org.gcube.portlets.admin.accountingmanager.server.amservice.response.SeriesResponse4SpaceSpaces; +import org.gcube.portlets.admin.accountingmanager.server.amservice.response.SeriesResponseBuilder; +import org.gcube.portlets.admin.accountingmanager.server.amservice.response.SeriesResponseDirector; +import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesResponse; +import org.gcube.portlets.admin.accountingmanager.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class AccountingCommandSpaces implements + AccountingCommand { + private static final Logger logger = LoggerFactory + .getLogger(AccountingCommandSpaces.class); + + private AccountingQuerySpaces accountingQuerySpaces; + private AccountingType accountingType; + + public AccountingCommandSpaces( + AccountingQuerySpaces accountingQuerySpaces, + AccountingType accountingType) { + this.accountingQuerySpaces = accountingQuerySpaces; + this.accountingType = accountingType; + } + + @Override + public SeriesResponse execute() throws ServiceException { + try { + AccountingPersistenceQuery apq = AccountingPersistenceQueryFactory + .getInstance(); + + logger.debug("Query Spaces: " + accountingQuerySpaces.getSpaces()); + + SortedMap> spaceSM; + + Spaces spaces = accountingQuerySpaces.getSpaces(); + + if (spaces == null) { + throw new ServiceException( + "Error retrieving Spaces param: null!"); + } + + spaceSM = apq.getSpaceTimeSeries(accountingQuerySpaces.getType(), + accountingQuerySpaces.getTemporalConstraint(), + accountingQuerySpaces.getFilters(), spaces.getSpacesList()); + + if (spaceSM == null) { + throw new ServiceException( + "Error retrieving info for space: sorted map is null!"); + } + + logger.debug("SpaceSM: " + spaceSM); + + SeriesResponseBuilder seriesResponseBuilder = getSeriesResponseBuilder( + accountingType, spaces, spaceSM); + + SeriesResponseDirector seriesResponseDirector = new SeriesResponseDirector(); + seriesResponseDirector + .setSeriesResponseBuilder(seriesResponseBuilder); + seriesResponseDirector.constructSeriesResponse(); + SeriesResponse seriesResponse = seriesResponseDirector + .getSeriesResponse(); + + if (seriesResponse == null) { + throw new ServiceException("Error creating series response!"); + } + logger.debug("SeriesResponse Created: " + seriesResponse); + return seriesResponse; + + } catch (Throwable e) { + logger.error("Error in AccountingCommandSpace(): " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException("No data available!"); + + } + } + + private SeriesResponseBuilder getSeriesResponseBuilder( + AccountingType accountingType, Spaces spaces, + SortedMap> spaceSM) + throws ServiceException { + if (accountingType == null) { + throw new ServiceException("Error accounting type is null"); + } + + switch (accountingType) { + case SPACE: + return new SeriesResponse4SpaceSpaces(spaces, spaceSM); + default: + throw new ServiceException("Error request type is unknow!"); + + } + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Space.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Space.java new file mode 100644 index 0000000..db73245 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Space.java @@ -0,0 +1,106 @@ +package org.gcube.portlets.admin.accountingmanager.server.amservice.query; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; + +import org.gcube.accounting.analytics.Filter; +import org.gcube.accounting.analytics.TemporalConstraint; +import org.gcube.accounting.datamodel.aggregation.AggregatedStorageStatusRecord; +import org.gcube.portlets.admin.accountingmanager.server.amservice.PeriodModeMap; +import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilter; +import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterSpaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.query.SeriesRequest; +import org.gcube.portlets.admin.accountingmanager.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Accounting Query 4 Space + * + * @author "Giancarlo Panichi" email: g.panichi@isti.cnr.it + * + */ +public class AccountingQuery4Space extends AccountingQueryBuilder { + protected static Logger logger = LoggerFactory + .getLogger(AccountingQuery4Space.class); + private SeriesRequest seriesRequest; + + public AccountingQuery4Space(SeriesRequest seriesRequest) { + this.seriesRequest = seriesRequest; + } + + @Override + public void buildOpEx() throws ServiceException { + + Calendar startCalendar = GregorianCalendar + .getInstance(TemporalConstraint.DEFAULT_TIME_ZONE); + try { + startCalendar.setTime(sdf.parse(seriesRequest.getAccountingPeriod() + .getStartDate())); + } catch (ParseException e) { + e.printStackTrace(); + throw new ServiceException("Start Date not valid!"); + } + + Calendar endCalendar = GregorianCalendar + .getInstance(TemporalConstraint.DEFAULT_TIME_ZONE); + try { + endCalendar.setTime(sdf.parse(seriesRequest.getAccountingPeriod() + .getEndDate())); + } catch (ParseException e) { + e.printStackTrace(); + throw new ServiceException("End Date not valid!"); + } + + endCalendar.set(GregorianCalendar.HOUR_OF_DAY, 23); + endCalendar.set(GregorianCalendar.MINUTE, 59); + endCalendar.set(GregorianCalendar.SECOND, 59); + endCalendar.set(GregorianCalendar.MILLISECOND, 999); + + TemporalConstraint temporalConstraint = new TemporalConstraint( + startCalendar.getTimeInMillis(), endCalendar.getTimeInMillis(), + PeriodModeMap.getMode(seriesRequest.getAccountingPeriod() + .getPeriod())); + + ArrayList filters = null; + ArrayList accountingFilters = null; + AccountingQuery invocation = null; + + if (seriesRequest != null + && seriesRequest.getAccountingFilterDefinition() != null) { + if (seriesRequest.getAccountingFilterDefinition() instanceof AccountingFilterSpaces) { + AccountingFilterSpaces accountingFilterSpace = (AccountingFilterSpaces) seriesRequest + .getAccountingFilterDefinition(); + accountingFilters = accountingFilterSpace.getFilters(); + filters = new ArrayList(); + if (accountingFilters != null) { + for (AccountingFilter accountigFilters : accountingFilters) { + Filter filter = new Filter(accountigFilters + .getFilterKey().getKey(), + accountigFilters.getFilterValue()); + filters.add(filter); + } + } + invocation = new AccountingQuerySpaces( + AggregatedStorageStatusRecord.class, + accountingFilterSpace.getSpaces(), + temporalConstraint, filters); + + } else { + logger.error("Invalid Request: " + seriesRequest); + throw new ServiceException("Invalid Request!"); + + } + + } else { + logger.error("Invalid Request: " + seriesRequest); + throw new ServiceException("Invalid Request!"); + } + + accountingQuerySpec.setOp(invocation); + + } +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuerySpaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuerySpaces.java new file mode 100644 index 0000000..cf2df68 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuerySpaces.java @@ -0,0 +1,73 @@ +package org.gcube.portlets.admin.accountingmanager.server.amservice.query; + +import java.util.ArrayList; + +import org.gcube.accounting.analytics.Filter; +import org.gcube.accounting.analytics.TemporalConstraint; +import org.gcube.accounting.datamodel.AggregatedUsageRecord; +import org.gcube.portlets.admin.accountingmanager.shared.data.ChartType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class AccountingQuerySpaces extends AccountingQuery { + private Class> type; + private Spaces spaces; + private TemporalConstraint temporalConstraint; + private ArrayList filters; + + public AccountingQuerySpaces( + Class> type, Spaces spaces, + TemporalConstraint temporalConstraint, ArrayList filters) { + super(); + chartType = ChartType.Spaces; + this.type = type; + this.temporalConstraint = temporalConstraint; + this.filters = filters; + this.spaces = spaces; + } + + public Class> getType() { + return type; + } + + public void setType(Class> type) { + this.type = type; + } + + public TemporalConstraint getTemporalConstraint() { + return temporalConstraint; + } + + public void setTemporalConstraint(TemporalConstraint temporalConstraint) { + this.temporalConstraint = temporalConstraint; + } + + public ArrayList getFilters() { + return filters; + } + + public void setFilters(ArrayList filters) { + this.filters = filters; + } + + public Spaces getSpaces() { + return spaces; + } + + public void setSpaces(Spaces spaces) { + this.spaces = spaces; + } + + @Override + public String toString() { + return "AccountingQuerySpaces [type=" + type + ", spaces=" + spaces + + ", temporalConstraint=" + temporalConstraint + ", filters=" + + filters + "]"; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/response/SeriesResponse4SpaceSpaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/response/SeriesResponse4SpaceSpaces.java new file mode 100644 index 0000000..b26efd8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/response/SeriesResponse4SpaceSpaces.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.admin.accountingmanager.server.amservice.response; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.SortedMap; + +import org.gcube.accounting.analytics.Filter; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesSpace; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceSpaces; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceData; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceDataSpaces; +import org.gcube.portlets.admin.accountingmanager.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Categories Series Response 4 Space + * + * @author "Giancarlo Panichi" email: g.panichi@isti.cnr.it + * + */ +public class SeriesResponse4SpaceSpaces extends SeriesResponseBuilder { + protected static Logger logger = LoggerFactory + .getLogger(SeriesResponse4SpaceSpaces.class); + private Spaces spaces; + private SortedMap> spaceSM; + + public SeriesResponse4SpaceSpaces(Spaces spaces, + SortedMap> spaceSM) { + this.spaces = spaces; + this.spaceSM = spaceSM; + } + + @Override + public void buildSeriesResponse() throws ServiceException { + try { + if (spaceSM == null || spaceSM.isEmpty()) { + logger.error("Error creating series for space accounting: No data available!"); + throw new ServiceException("No data available!"); + } + + ArrayList seriesSpaceDataContextList = new ArrayList<>(); + + for (Filter spaceValue : spaceSM.keySet()) { + + ArrayList series = new ArrayList<>(); + SortedMap infos = spaceSM.get(spaceValue); + for (Calendar calendar : infos.keySet()) { + Long value = infos.get(calendar); + + series.add(new SeriesSpaceData(calendar.getTime(), value)); + + } + SeriesSpaceDataSpaces seriesSpaceDataContext = new SeriesSpaceDataSpaces( + spaceValue.getValue(), series); + seriesSpaceDataContextList.add(seriesSpaceDataContext); + + } + + SeriesSpaceSpaces seriesSpaceContext = new SeriesSpaceSpaces( + spaces, seriesSpaceDataContextList); + SeriesSpace seriesSpace = new SeriesSpace(seriesSpaceContext); + + seriesResponseSpec.setSr(seriesSpace); + + } catch (Throwable e) { + logger.error("Error creating series for space accounting categories chart: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException( + "Error creating series for space accounting categories chart: " + + e.getLocalizedMessage()); + } + + } +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/is/BuildEnableTabs.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/is/BuildEnableTabs.java index 3f87818..4241d74 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/is/BuildEnableTabs.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/is/BuildEnableTabs.java @@ -21,24 +21,30 @@ public class BuildEnableTabs { private static Logger logger = LoggerFactory .getLogger(BuildEnableTabs.class); - public static EnableTabs build(String scope) throws ServiceException { + public static EnableTabs build(String scope, boolean isRootScope) + throws ServiceException { ArrayList enableTabList = new ArrayList<>(); - + if (Constants.DEBUG_MODE) { - EnableTab enableTabData = new EnableTab( + EnableTab enableTabDataSpace = new EnableTab(AccountingType.SPACE, + null); + enableTabList.add(enableTabDataSpace); + EnableTab enableTabDataService = new EnableTab( AccountingType.SERVICE, null); - enableTabList.add(enableTabData); + enableTabList.add(enableTabDataService); + } else { - EnableTabsJAXB enableTabsJAXB=null; + EnableTabsJAXB enableTabsJAXB = null; try { - enableTabsJAXB= InformationSystemUtils - .retrieveEnableTab(scope); - } catch(ServiceException e){ + enableTabsJAXB = InformationSystemUtils + .retrieveEnableTab(scope); + } catch (ServiceException e) { logger.info(e.getLocalizedMessage()); } - + logger.debug("Enable Tabs: " + enableTabsJAXB); - if (enableTabsJAXB != null && enableTabsJAXB.getEnableTabs() != null + if (enableTabsJAXB != null + && enableTabsJAXB.getEnableTabs() != null && !enableTabsJAXB.getEnableTabs().isEmpty()) { AccountingType type; for (EnableTabJAXB enableTab : enableTabsJAXB.getEnableTabs()) { @@ -49,29 +55,43 @@ public class BuildEnableTabs { && !enableTab.getRoles().isEmpty()) { ArrayList enableRoles = new ArrayList<>(); enableRoles.addAll(enableTab.getRoles()); - enableTabList.add(new EnableTab(type, - enableRoles)); + enableTabList.add(new EnableTab(type, enableRoles)); } else { - enableTabList - .add(new EnableTab(type, null)); + enableTabList.add(new EnableTab(type, null)); } } } } else { - logger.info("AccountingManager use default configuration for scope: "+scope); + logger.info("AccountingManager use default configuration for scope: " + + scope); EnableTab enableTabDataService = new EnableTab( AccountingType.SERVICE, null); enableTabList.add(enableTabDataService); EnableTab enableTabDataStorage = new EnableTab( AccountingType.STORAGE, null); enableTabList.add(enableTabDataStorage); - EnableTab enableTabDataJob = new EnableTab( - AccountingType.JOB, null); + EnableTab enableTabDataJob = new EnableTab(AccountingType.JOB, + null); enableTabList.add(enableTabDataJob); - + } } + if (isRootScope) { + boolean spaceTabPresent = false; + for (EnableTab enableTab : enableTabList) { + if (enableTab.getAccountingType().compareTo( + AccountingType.SPACE) == 0) { + spaceTabPresent = true; + break; + } + } + if (!spaceTabPresent) { + EnableTab enableTabDataSpace = new EnableTab( + AccountingType.SPACE, null); + enableTabList.add(enableTabDataSpace); + } + } EnableTabs enableTabs = new EnableTabs(enableTabList); logger.debug("EnableTabsData: " + enableTabs); return enableTabs; diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingFilterSpaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingFilterSpaces.java new file mode 100644 index 0000000..f2ee5e7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingFilterSpaces.java @@ -0,0 +1,74 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class AccountingFilterSpaces extends AccountingFilterDefinition + implements Serializable { + + private static final long serialVersionUID = -6805006183397381154L; + private Spaces spaces; + private ArrayList filters; + + public AccountingFilterSpaces() { + super(); + this.chartType = ChartType.Spaces; + spaces = null; + filters = null; + + } + + /** + * + * @param spaces + */ + public AccountingFilterSpaces(Spaces spaces) { + super(); + chartType = ChartType.Spaces; + this.spaces = spaces; + this.filters = null; + } + + /** + * + * @param spaces + * @param filters + */ + public AccountingFilterSpaces(Spaces spaces, + ArrayList filters) { + super(); + chartType = ChartType.Spaces; + this.spaces = spaces; + this.filters = filters; + + } + + public Spaces getSpaces() { + return spaces; + } + + public void setSpaces(Spaces spaces) { + this.spaces = spaces; + } + + public ArrayList getFilters() { + return filters; + } + + public void setFilters(ArrayList filters) { + this.filters = filters; + } + + @Override + public String toString() { + return "AccountingFilterSpaces [spaces=" + spaces + ", filters=" + + filters + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingType.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingType.java index 67add99..b6935a5 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingType.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/AccountingType.java @@ -14,7 +14,8 @@ public enum AccountingType { SERVICE, PORTLET, TASK, - JOB; + JOB, + SPACE; public static AccountingType getTypeFromString(String value){ for(AccountingType a:values()){ diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/ChartType.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/ChartType.java index b339d0e..efa5bd0 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/ChartType.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/ChartType.java @@ -14,7 +14,7 @@ import java.util.List; public enum ChartType { - Basic("Basic"),Top("Top"), Context("Context"); + Basic("Basic"),Top("Top"), Context("Context"), Spaces("Spaces"); /** * diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Genres.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Genres.java new file mode 100644 index 0000000..77de56d --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Genres.java @@ -0,0 +1,39 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class Genres implements Serializable { + + private static final long serialVersionUID = -1704075020370137961L; + private ArrayList genresList; + + public Genres() { + super(); + } + + public Genres(ArrayList genresList) { + super(); + this.genresList = genresList; + } + + public ArrayList getGenresList() { + return genresList; + } + + public void setGenresList(ArrayList genresList) { + this.genresList = genresList; + } + + @Override + public String toString() { + return "Genres [genresList=" + genresList + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/GenresData.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/GenresData.java new file mode 100644 index 0000000..5b51b98 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/GenresData.java @@ -0,0 +1,46 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class GenresData implements Serializable { + + private static final long serialVersionUID = 719740085818609829L; + private String genre; + + public GenresData() { + super(); + } + + public GenresData(String genre) { + super(); + this.genre = genre; + } + + public String getGenre() { + return genre; + } + + public void setGenre(String genre) { + this.genre = genre; + } + + public String getLabel() { + return genre; + } + + public void setLabel(String genre) { + this.genre = genre; + } + + @Override + public String toString() { + return "GenresData [genre=" + genre + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Spaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Spaces.java new file mode 100644 index 0000000..27e3da5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/Spaces.java @@ -0,0 +1,39 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class Spaces implements Serializable { + + private static final long serialVersionUID = -1704075020370137961L; + private ArrayList spacesList; + + public Spaces() { + super(); + } + + public Spaces(ArrayList spacesList) { + super(); + this.spacesList = spacesList; + } + + public ArrayList getSpacesList() { + return spacesList; + } + + public void setSpacesList(ArrayList spacesList) { + this.spacesList = spacesList; + } + + @Override + public String toString() { + return "Spaces [spacesList=" + spacesList + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/SpacesData.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/SpacesData.java new file mode 100644 index 0000000..ae3b097 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/SpacesData.java @@ -0,0 +1,46 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class SpacesData implements Serializable { + + private static final long serialVersionUID = 719740085818609829L; + private String space; + + public SpacesData() { + super(); + } + + public SpacesData(String space) { + super(); + this.space = space; + } + + public String getSpace() { + return space; + } + + public void setSpace(String space) { + this.space = space; + } + + public String getLabel() { + return space; + } + + public void setLabel(String space) { + this.space = space; + } + + @Override + public String toString() { + return "SpacesData [space=" + space + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/SeriesSpace.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/SeriesSpace.java new file mode 100644 index 0000000..dda4dce --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/SeriesSpace.java @@ -0,0 +1,40 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data.response; + +import org.gcube.portlets.admin.accountingmanager.shared.data.response.space.SeriesSpaceDefinition; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class SeriesSpace extends SeriesResponse { + + private static final long serialVersionUID = -1311805875898959881L; + private SeriesSpaceDefinition serieSpaceDefinition; + + public SeriesSpace() { + super(); + } + + public SeriesSpace(SeriesSpaceDefinition serieSpaceDefinition) { + super(); + this.serieSpaceDefinition = serieSpaceDefinition; + } + + public SeriesSpaceDefinition getSerieSpaceDefinition() { + return serieSpaceDefinition; + } + + public void setSerieSpaceDefinition( + SeriesSpaceDefinition serieSpaceDefinition) { + this.serieSpaceDefinition = serieSpaceDefinition; + } + + @Override + public String toString() { + return "SeriesSpace [serieSpaceDefinition=" + serieSpaceDefinition + + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceData.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceData.java new file mode 100644 index 0000000..010e497 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceData.java @@ -0,0 +1,50 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data.response.space; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class SeriesSpaceData implements Serializable { + + private static final long serialVersionUID = -3946372711632911008L; + private Date date; + private Long dataVolume; + + public SeriesSpaceData() { + super(); + } + + public SeriesSpaceData(Date date, Long dataVolume) { + super(); + this.date = date; + this.dataVolume = dataVolume; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Long getDataVolume() { + return dataVolume; + } + + public void setDataVolume(Long dataVolume) { + this.dataVolume = dataVolume; + } + + @Override + public String toString() { + return "SeriesSpaceData [date=" + date + ", dataVolume=" + dataVolume + + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDataSpaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDataSpaces.java new file mode 100644 index 0000000..fdc86cb --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDataSpaces.java @@ -0,0 +1,55 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data.response.space; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class SeriesSpaceDataSpaces implements Serializable { + + private static final long serialVersionUID = 1601335458514606805L; + private String space; + private ArrayList series; + + public SeriesSpaceDataSpaces() { + super(); + } + + /** + * + * @param space + * @param series + */ + public SeriesSpaceDataSpaces(String space, ArrayList series) { + super(); + this.space = space; + this.series = series; + } + + public String getSpace() { + return space; + } + + public void setSpace(String space) { + this.space = space; + } + + public ArrayList getSeries() { + return series; + } + + public void setSeries(ArrayList series) { + this.series = series; + } + + @Override + public String toString() { + return "SeriesSpaceDataSpaces [space=" + space + ", series=" + series + + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDefinition.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDefinition.java new file mode 100644 index 0000000..2947417 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceDefinition.java @@ -0,0 +1,31 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data.response.space; + +import java.io.Serializable; + +import org.gcube.portlets.admin.accountingmanager.shared.data.ChartType; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class SeriesSpaceDefinition implements Serializable { + + private static final long serialVersionUID = -1371973741194014153L; + protected ChartType chartType; + + public SeriesSpaceDefinition() { + super(); + } + + public ChartType getChartType() { + return chartType; + } + + @Override + public String toString() { + return "SeriesSpaceDefinition [chartType=" + chartType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceSpaces.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceSpaces.java new file mode 100644 index 0000000..bdecb1f --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/data/response/space/SeriesSpaceSpaces.java @@ -0,0 +1,58 @@ +package org.gcube.portlets.admin.accountingmanager.shared.data.response.space; + +import java.util.ArrayList; + +import org.gcube.portlets.admin.accountingmanager.shared.data.ChartType; +import org.gcube.portlets.admin.accountingmanager.shared.data.Spaces; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class SeriesSpaceSpaces extends SeriesSpaceDefinition { + + private static final long serialVersionUID = -1704880534497695545L; + private Spaces spaces; + private ArrayList seriesSpaceDataCategoriesList; + + public SeriesSpaceSpaces() { + super(); + this.chartType = ChartType.Spaces; + + } + + public SeriesSpaceSpaces(Spaces spaces, + ArrayList seriesSpaceDataCategoriesList) { + super(); + this.chartType = ChartType.Spaces; + this.spaces = spaces; + this.seriesSpaceDataCategoriesList = seriesSpaceDataCategoriesList; + } + + public Spaces getSpaces() { + return spaces; + } + + public void setSpaces(Spaces spaces) { + this.spaces = spaces; + } + + public ArrayList getSeriesSpaceDataCategoriesList() { + return seriesSpaceDataCategoriesList; + } + + public void setSeriesSpaceDataCategoriesList( + ArrayList seriesSpaceDataCategoriesList) { + this.seriesSpaceDataCategoriesList = seriesSpaceDataCategoriesList; + } + + @Override + public String toString() { + return "SeriesSpaceSpaces [spaces=" + spaces + + ", seriesSpaceDataCategoriesList=" + + seriesSpaceDataCategoriesList + "]"; + } + +} diff --git a/src/main/resources/org/gcube/portlets/admin/accountingmanager/accountingman.gwt.xml b/src/main/resources/org/gcube/portlets/admin/accountingmanager/accountingman.gwt.xml index 05133b2..75f5a18 100644 --- a/src/main/resources/org/gcube/portlets/admin/accountingmanager/accountingman.gwt.xml +++ b/src/main/resources/org/gcube/portlets/admin/accountingmanager/accountingman.gwt.xml @@ -49,10 +49,11 @@ name="locale" values="es" /> --> - + /> --> diff --git a/src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_128.png b/src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_128.png new file mode 100644 index 0000000000000000000000000000000000000000..df774d9f02a24627e186b0363f2959b21cb5d5bd GIT binary patch literal 2535 zcmVsb#VOtaq>1polM-Og(tcDo(poa;OQ`a=bRzDt3K z$@ylMPaOf8reST{K3W2(hNzEkL`*aP&=SzLEeQa?HUJ=yaZ#g2fRF%SZUcQbut`1Z zhc*%8?6(1d5&!{?iE;{n(A7PP8R&{_qy_^JuL*lpDY}jVAVgLU9)35b<&9>Vu z+wFFGjqVd6Aj2<;f>l+;&d$!*d_HIA=jZJF{G2To3pSt6*=#mrWmz&QU2)};{IN#QvBz6I@9P6SU_!u1jlrN)=0Ja2?!d~phA4SZwpK1$81-db! zfJkM=Q$>In!H~=n5E2!f%n}gWnSM$tc+5knzLo(I>&y=!5lbNv6fw{K+=fR19uoi# zX#wl?TI&F-)rzfFE4JBev}TW0yJMCLAeDgSlTxy>EZJ-}V~fRtEfx!{2VgCrD2hF* zIAHEXcTUERXp;^GCtw|bbFKk!3}cA(1$d^EQa{^v931~%Oijid{<9X)e;I%%khOrm z$y4fDK#V|`qW#GOfNBq(lok;4_AhGz!?uH23y9QyUIJLw0&)((!Z;RgD^L*&C}fQ5 ze+XKDtwsU9BN)T3Ln)=AX97daMY^urV;@~P8$Z((5O|EIe<-y8xEBDLzUuGG^!FuYGF)RNGJ2wTZG8FmM~#G>uogu4@w|vkUN@%YyTLM*!EgiDU|nr`X8A z%=aCET-PR&smyraAgJq_q$pHf*LtS|yAnJJPVJ9OVfIrcV-%66u4`77rL)>ZGPW6S z0000*?%}dFksQ-mV*-G>G#k*pvDYS&V>y0|HQM$JN+z44NR;c^L{78-Uv>N8 zIk5iKbs~`SQh^UDx*!oJ0W1y8ToI8?iFzv$?*HAcs2MtlRIK8>gUS zu_JtoP_7*BGy+go?cVKnB%(|Rd`J*EKnQjFA^P}UdLRj;0s$ESLaW1ZTSdDp96s8Zt_jih_1Yv;SSpP_45I2g+kMsTH#vFW<4sN;_;{0(A6p9;%kG%9i8$xnnHo5D-G0oo zV}9J^1SAYm1u4(xQ*rXKYXOk^Nmnx;BiCo6 z;^b4&0-Sk^>U=&GC!dNI;Jo*_*k~MEz()WW$_G&GiK%!1D!Z=s|9eTG%g*=)0Tm~o zwSWV>z?3+7D!Zd;0YkQfA=T}ln%xt5749qogjTC(3U*!F7SAChw{)7#xBLLY)Un~- zcdZ^OPCf-Kzy<)PT7ZvQJye{0(prEGDW@cZSqlhX3plj2XDuKyyWX^bQSs1uW247{qU zG!U>j1ORyZ_H8lRF2J@Dm@^-D7G`=;6no)+$Q^#0%7_O6!fjcWIs^|{cBt)Q^%2X^ z5DCmrFS)$DRE#m@3jjI_m|+sjpHfOzRn^|?KXvP5hGVmA8~hwsD#1?Z`%!L`cJXyM z99i*M1l)(^a#{TT{hRrW06Oga`0=BK(1mOE;pM=kBk)>_OQu7O0Q@>st1u?JIIqGl z`1#ezG6b{#`ue)OxVTV#!+)=Bp!xgn-o0ag{`}$h_xG*o@F6q*DbmF}I%TqvX3`b2 zT?{%5i0kX?^6%fj-K$rx)c5b-85IB?fncmsv9@DSHUh+UWO}G0eA|8QW8@*>@35QOP`Zve<32-Epq0g!_xSbyT&s%AX2NM_8%YF=(@Gzg~|W`002ovPDHLkV1hpAu7Cgl literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_24.png b/src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_24.png new file mode 100644 index 0000000000000000000000000000000000000000..a36181f6f8da2e42f478533e73d735d98f7c48d0 GIT binary patch literal 928 zcmV;R17G}!P)X-G?Cbl4U(0gKt(^Dy2TzeFg0FA^zK3 z@O_`Xy}gWob#)aHd1{<_U`Is$wt?5c+;hXXZJWu-N%Hxx-_UNiv2FV$&CCI>ZQ#{& zQA#Pa*5q9$D2iw{n-mI#1c5Oop(st&qo&(Ro*@z- z3`45bDraYBXsrQ=qKN6~X}aAmK@cQGjWNv6&oePGF}MfMAqawi{r&v`nI0YdB#rkMuaZkOxp>kQ;D49VqkynXvNkz}XSA&MeOr4o+gU|H7F0!bfkZf@Av z*cb@f+S=my_&DQRTwJ79t8sL6l<_YuEg>Qa0wp4qSf-bkmsG1&f*?qOa=9Fy=W%;` zn_0Bs;bDw1wA<|jvEw+*%*;?KmEw7w+Q3KPub86U-Q58Mo12>hi?+75#=*e>7Z(>9 z|IW@%`uNcXzQiZ3HM6s`+}+(JlDoRP!WcubSj6)@0DRvENR$*WU7DJ{eX)Vhz^RDL zDW$M1D_N-69LLEln(Mk)mW9?j6K{-35BwDPY%8UjBJx2g^@oV$>-9RFPA8+HFbt{H zYRUE7YPB%N;QKy}Mk7&Iuh)y`)B!#yrJ9-Rx?Zm@pP!%0{r$a);pX#sJkO)qY!Zec z0G4GjGBQFGMfko?6h$bda9vlXrlwS}Sp40#?d8Ysfg1$D&%Ivn$GA{@(P^!DczDR{ zhvPVi21c)?cD`)cgkg?ZQi%@X5P$vGw%UI z2s7)<{3SE5F!Nhxwm2+S7hCE6tK(A$GjB2T1v9sJcxiQYwm!!2GiH9rA208i`Pqk@ zy2_tUs&Ubv2;<)YcmqI0DRep=n5GG44q=92Ael_Yol64vfr$Q$b)f6zFLB1DlqeJm zI5;>!yWQ@?9LK@h+8UOYmY}NYLr(leM0@^%8q7I>%{b!#;CUWetro7Xt|IYfvkAv> zpePE6DC!phV3V2uAfjTQ0|0&lF!4xjAdyI5b#)b%W%bfPM9?%1x~@Y?`B;ffbZvdz zbD$ggmB%!R2)1qG@bEAa-`LoQJNcljF!L4>?TK!~crhe9005e%#o|%L86z*4Syur( z2e2@#mJkBV%gb;aCsc$&h^Mf90l;&$o0HTq8bkyk1j^+yI-O3W14E_&U7HgsfR|5b zQ1Cnt`FuVScU|`>DFA?%#LO0ep$12%(?PLVM4?bXtJUhm5{U$6XJ@gnumD}xLy;gN zsH!@+ZmYu@_cyUDE0zV@+uJxgI>Oo6SqRfK4g351n4X>vI-!dv&WHzD&~CSpPNyTW zsi`U0wjJsdYE-*5O*1l|uIoZk6y$O_xUL(*q?E{Jv&iLgp%fT~5m_H02W;EM$;k;W zFE2xzR4Nth?Cjw7_BN6Qs;a`aZIntSD2mdDPfkuoGDHPn`*py~ux%TaN(H4-DKeCe zM&m&i)a!K=i^WJiDdk`kY+~lO0KV}ZxVyVUKA%UmTJ2L%6a~7jL)UefrWu-snx?@p z40xW0X0r*;^ZJ^XVHj9kT*S=GOmJHMr2^RX9q=dK>FFu1udgFdxw*NCE`ajYb1EH#eb8 zYPA}Y$s{V3$_KL`u;*(cveoXX_n7%xB3hABqFgS=-g+LJ1&^_yD}VdfG8(vs|5K~g zCN3^61{ENL=vDgt{XHDV>C362D9B_oa9tP8W;3KaGBV<`pr)$oSD`Bz5fwepdzDJ1 zex93~6ZLw%msdY@sZHqoc@VG7`Wm-+1J;+_J3i z0sQW|t_Yrxh@jNfob`?dD0DerT({F};m`Eu(_yuJU3*r&$)h9pG kKI_x$fAKi|ub$`s0s(?8t%~_0od5s;07*qoM6N<$f-#d88UO$Q literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_48.png b/src/main/resources/org/gcube/portlets/admin/accountingmanager/client/resource/accounting-space_48.png new file mode 100644 index 0000000000000000000000000000000000000000..182f49837bc8d7988ff695a14217cef1f0f51fd3 GIT binary patch literal 1688 zcmV;J250$+P);E zK~!ko)mlqy6j>DhZoRrHcDg&=Y7!EILEL2FBItk{UjbdsLXhzXhzJAY!U0i4VIr;s zaTdim#OEq|;Sh&*NgMnog&x`j*|vj0XaNK6UH+&OPUR zr*0L{fe}%Li28|WfQar8(Hyn6xxjZIxHf~WHX`aHqEkflClTrN?WPB7oFbyWtpb0I zh$=)>r|wxjSo7Lu0^dhOW!iiz6VbkIgFhccXsfJ3MCW<1u{OXp0A&E<0K_dWH4nfu z0EZc4W@-XNlml=dzzNP>0ueR-kG&ydjXzHN8^BMDu~lvYLF6B%0bj4z@#4h`RIAlQ zU)ObU@Zdr8_Vz*$gft{hM(unx;XLBwi9H z0!%-&{vbpZY>@N($?AEi*X!JAVHgG+$4N}J2pf+oY@xMP0+>uwutWsk_hH*M48!2M z#&H~Yo|l$@2w<|c#j+MKWdMiLtm^wdEX%^u(h}ajeG6UJVObVD&)ZPEvMeK)%VB6} z2!n%z=;`T!BuQzz(-X$n;SDtqsNkV*>357V_`Z*snHelDF1Gc*apOjsF4Ss=i0B$) zY_gF;!5ng-lcvoWgQjUn({ei?aUq7cLOTYaAO)SM*lGR)z|*HsF+V@gUBn%dC<0&tfU8}YR^j_T_h`_C8VK#GlvZ_< zK=BHh=Xu;D+U(LeqYlH+EM#xqyn(LksMqW33N-{F%QEu$JO&2`(cj+>RaGI1@uDvX z0vKZuMKP9$)Q#weLiXs$=EfG8h>dfubmhYs<2{ zVKC$(;QKywUB}CpFB2CaBDk)Lv9U4i-n|>8QYqFyEXuH$j~+dmD0-qOBA3f07P^#_ z61uMA?%lg>9}@xK=FOW}SXkf^vP+jP;nSy2Tt$5L>{;yHyEnd5B}LV7oJ97`R;^aK zm6bRDoAD$Om`@^5sZ_XbQmfTcJ&`$%!{zI`ZW7^nMnrc2{M@RPhGF32$B%gT?j4qw zmm?Pv1Oc)vBb&`4lgYrcEYxZ>Se6wjWQw9d(==?`whgZ9qE@RlI#P3#L-ERHvlti{ zz|hbT^7(v}7W^RrxZX-29JJQf)^PjwZLUaNzI++8v$J^q{CQj7ix)5A_3PJo@ZdpP z-!o^UX*X8yN zC*25p44@)0#w;S50`OzhQ`zX~DAv~2VsFS8L$z9k=Xu;h=6N1eRpk;gMNy*eZ2_2K zj9KA6&H|`66JU%%RaNZYzaO@3$BI)pDax{pk&zK>-@d&oLKdc3E|-f+qk4e(Um;_R zEfdi#0KYXaU|AOK-MhynWLK_S!Q$fLRtecH#@O;YAq&n~p0tVwuaLQ}o9Y>&10j17 zo(V-M@h<>Yn#T!VA#)rDrfF`9kTnrl2{1+; z>Gwne0qcKk+dix>%swzCsTjv|4#G0m| zudffqViBsUE+~p}fNL6ET3R|%EEXSTv)SXKD56j(M0N|tSYsDNQH1aNjp(=YC8ESr z>gL^*WqIb+t5+u@TXS6QRVtNyPfyQ%B03(|>Y9P^2w>~$rKEM6+V1q{&!0~Z4-Z#T z5eNWj!IAqo5sADvJOIyhT|cs8#|{IX*#G%8YZ?;Y?~CphBH!ny1}!AM i-;X_7i2UcD+k6FSVj=RyWh3bT0000false false false + AccountingManagerCSS