From 5b68060b5f813add31167b47255bfaddc0c6aca3 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 16 Feb 2017 11:44:41 +0000 Subject: [PATCH] completed work on Create Gis Layer using SPD job git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/speciesdiscovery@142603 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/ConstantsSpeciesDiscovery.java | 2 +- .../client/SearchController.java | 145 +++++++++++++++--- .../client/event/ReSubmitJobEvent.java | 9 ++ .../client/event/SaveJobEvent.java | 9 ++ .../gridview/ResultRowResultsPanel.java | 86 ++++++++++- .../client/job/gislayer/GisLayerGridJob.java | 110 ++++++------- .../client/resources/Resources.java | 9 +- .../client/resources/gislayer/globe16.png | Bin 0 -> 879 bytes .../client/resources/gislayer/globe24.png | Bin 0 -> 1616 bytes .../client/rpc/TaxonomySearchService.java | 9 ++ .../rpc/TaxonomySearchServiceAsync.java | 32 ++++ .../windowdetail/ViewDetailsWindow.java | 4 +- .../server/TaxonomySearchServiceImpl.java | 121 ++++++++++++++- .../server/job/GisLayerJobUtil.java | 42 +++++ .../server/service/SpeciesService.java | 21 +-- src/main/webapp/WEB-INF/web.xml | 33 ---- 16 files changed, 487 insertions(+), 145 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gislayer/globe16.png create mode 100644 src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gislayer/globe24.png diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java index 2e767fa..1b6e453 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/ConstantsSpeciesDiscovery.java @@ -91,7 +91,7 @@ public final class ConstantsSpeciesDiscovery { public static final String SAVE_OCCURRENCES = "Save Occurrences"; public static final String CREATE_GIS_LAYER_TITLE = "Create Gis Layer"; public static final String CREATE_GIS_LAYER_TEXT = "Create a Gis Layer from selected occurences points"; - public static final String GIS_LAYER_EVENT_TEXT = "Gis Layer generated from SPD Portlet by gCube Framework"; + public static final String GIS_LAYER_EVENT_TEXT = "Gis Layer generated via SPD Service by gCube Framework"; public static final String SAVE_TAXONOMY_ITEMS = "Save Taxonomy Items"; public final static String DETAILS = "Details"; diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java index db5e56a..349d4c0 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/SearchController.java @@ -243,6 +243,8 @@ public class SearchController { } else if(reSubmitJobEvent.getLoadType().equals(SearchResultType.TAXONOMY_ITEM)){ resubmitJob(reSubmitJobEvent.getLoadType(), reSubmitJobEvent.getJobTaxonomyModel().getIdentifier()); + }else if(reSubmitJobEvent.getLoadType().equals(SearchResultType.GIS_LAYER_POINT)){ + resubmitJob(reSubmitJobEvent.getLoadType(), reSubmitJobEvent.getJobGisModel().getJobIdentifier()); } } }); @@ -271,30 +273,44 @@ public class SearchController { eventBus.addHandler(CreateGisLayerJobEvent.TYPE, new CreateGisLayerJobEventHandler() { @Override - public void onCreateGisLayerJob(CreateGisLayerJobEvent createGisLayerJobEvent) { + public void onCreateGisLayerJob(final CreateGisLayerJobEvent createGisLayerJobEvent) { - // TODO Auto-generated method stub - - SpeciesDiscovery.taxonomySearchService.createGisLayerJobFromSelectedOccurrenceKeys(createGisLayerJobEvent.getJobName(), createGisLayerJobEvent.getJobDescription(), createGisLayerJobEvent.getTotalPoints(), new AsyncCallback() { + SpeciesDiscovery.taxonomySearchService.retrieveOccurencesFromSelection(new AsyncCallback() { @Override - public void onFailure(Throwable caught) { + public void onSuccess(Integer returnedPoints) { + Long expectedPoints = createGisLayerJobEvent.getTotalPoints(); + Log.trace("Expected points: "+expectedPoints); + if(returnedPoints==null || returnedPoints.intValue()==0){ + Info.display("Info", "There are no occurrence points selected to create a gis layer"); + return; + } + Log.trace("Returned points: "+expectedPoints); - Info.display("Error generating the map", "An error occurred generating the map, retry"); - Log.error("Error on loading", "An error occurred on edit listner, retry." +caught.getMessage()); + SpeciesDiscovery.taxonomySearchService.createGisLayerJobFromSelectedOccurrenceKeys(createGisLayerJobEvent.getJobName(), createGisLayerJobEvent.getJobDescription(), createGisLayerJobEvent.getTotalPoints(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + + Info.display("Error generating the map", "An error occurred generating the map, retry"); + Log.error("Error on loading", "An error occurred on edit listner, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(JobGisLayerModel gisJob) { + GWT.log("Returned gis job: "+gisJob); + Info.display("Gis Layer Occurrence Job", "Generating Gis layer: "+gisJob.getJobName()+" submitted"); + excecuteGetJobs(SearchResultType.GIS_LAYER_POINT, false); + searchBorderLayoutPanel.getSpeciesSouthPanel().setIconGisLayerByCounter(1); + } + }); } @Override - public void onSuccess(JobGisLayerModel gisJob) { - GWT.log("Returned gis job: "+gisJob); - Info.display("Gis Layer Occurrence Job", "Generating Gis layer: "+gisJob.getJobName()+" submitted"); - excecuteGetJobs(SearchResultType.GIS_LAYER_POINT, false); - searchBorderLayoutPanel.getSpeciesSouthPanel().setIconGisLayerByCounter(1); - - -// progress.close(); -// showMap(layerName); + public void onFailure(Throwable caught) { + Info.display("Error getting occurrences", "Error getting occurrences, retry"); + Log.trace("Error getting occurrences", caught); } }); } @@ -412,6 +428,8 @@ public class SearchController { } else if(saveJobEvent.getItemType().equals(SearchResultType.OCCURRENCE_POINT)){ saveOccurencesJob(saveJobEvent.getJobOccurrenceModel(), saveJobEvent.getScientificName(), saveJobEvent.getListDataSources()); + }else if(saveJobEvent.getItemType().equals(SearchResultType.GIS_LAYER_POINT)){ + saveGisLayerJob(saveJobEvent.getJobGisLayer()); } } @@ -767,9 +785,7 @@ public class SearchController { } }); - } - - else if(resultType.equals(SearchResultType.TAXONOMY_ITEM)){ + }else if(resultType.equals(SearchResultType.TAXONOMY_ITEM)){ SpeciesDiscovery.taxonomySearchService.resubmitTaxonomyJob(jobIdentifier, new AsyncCallback() { @@ -790,6 +806,27 @@ public class SearchController { } }); + }else if(resultType.equals(SearchResultType.GIS_LAYER_POINT)){ + + SpeciesDiscovery.taxonomySearchService.resubmitGisLayerJob(jobIdentifier, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Info.display("Error on resubmit", "An error occurred on resubmit job, retry."); + Log.error("Error on resubmit", "An error occurred on resubmit job, retry." +caught.getMessage()); + caught.printStackTrace(); + + } + + @Override + public void onSuccess(JobGisLayerModel result) { + + if(result!=null) + excecuteGetJobs(SearchResultType.GIS_LAYER_POINT, false); + + } + }); + } } else @@ -1154,6 +1191,54 @@ public class SearchController { } + private void saveGisLayerJob(final JobGisLayerModel jobGisLayer) { + + String fileName = jobGisLayer.getJobName(); + final WorkspaceExplorerSaveDialog navigator = new WorkspaceExplorerSaveDialog("Save Gis Layer", fileName, false); + WorskpaceExplorerSaveNotificationListener listener = new WorskpaceExplorerSaveNotificationListener(){ + + @Override + public void onSaving(Item parent, final String fileName) { + GWT.log("onSaving parent: "+parent +", fileName" +fileName); + navigator.hide(); + + Info.display("Saving in progress", "..."); + + SpeciesDiscovery.taxonomySearchService.saveGisLayerAsWsLink(jobGisLayer, parent.getId(), fileName, new AsyncCallback() { + + @Override + public void onSuccess(Boolean result) { + + if(result){ + Info.display("File saved", "The "+fileName+" file has been saved in the workspace."); + changeStatusJob(SearchResultType.GIS_LAYER_POINT, jobGisLayer.getJobIdentifier(), DownloadState.SAVED); + } + } + + @Override + public void onFailure(Throwable caught) { + Info.display("Error saving the file", "An error occurred saving the file, retry."); + Log.error("Error saving the file", "An error occurred saving the file, retry." +caught.getMessage()); + } + }); + } + + @Override + public void onAborted() { + GWT.log("onAborted"); + } + + @Override + public void onFailed(Throwable throwable) { + GWT.log("onFailed"); + } + }; + + navigator.addWorkspaceExplorerSaveNotificationListener(listener); + navigator.show(); + + } + private void saveOccurencesJob(final JobOccurrencesModel jobOccurrencesModel,final String scientificName, List dataSourceList) { @@ -1261,9 +1346,26 @@ public class SearchController { if(result) excecuteGetJobs(SearchResultType.TAXONOMY_ITEM, true); + } + }); + }else if(jobType.equals(SearchResultType.GIS_LAYER_POINT)){ + SpeciesDiscovery.taxonomySearchService.changeStatusGisLayerJob(jobId, state, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error on change status", "An error occurred on change status, retry." +caught.getMessage()); + + } + + @Override + public void onSuccess(Boolean result) { + if(result) + excecuteGetJobs(SearchResultType.GIS_LAYER_POINT, true); + } }); } + //TODO } @@ -1685,7 +1787,8 @@ public class SearchController { } }); - }else if(type.equals(SearchResultType.GIS_LAYER_POINT)){ + } + else if(type.equals(SearchResultType.GIS_LAYER_POINT)){ if(resetStructures) GisLayerJobSpeciesPanel.getInstance(eventBus).getGridJob().mask("Loading", ConstantsSpeciesDiscovery.LOADINGSTYLE); @@ -1697,8 +1800,6 @@ public class SearchController { @Override public void onFailure(Throwable caught) { - // TODO Auto-generated method stub - } @Override diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java index eb02c85..20875cc 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/ReSubmitJobEvent.java @@ -39,6 +39,15 @@ public class ReSubmitJobEvent extends GwtEvent { this.jobGisModel = jobGisModel; } + + /** + * @return the jobGisModel + */ + public JobGisLayerModel getJobGisModel() { + + return jobGisModel; + } + public SearchResultType getLoadType() { return loadType; } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java index e511026..1d867f4 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/event/SaveJobEvent.java @@ -97,6 +97,15 @@ public class SaveJobEvent extends GwtEvent { + + /** + * @return the jobGisLayer + */ + public JobGisLayerModel getJobGisLayer() { + + return jobGisLayer; + } + public String getJobIdentifier() { return jobIdentifier; } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java index 46f1719..6a4a8e8 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/gridview/ResultRowResultsPanel.java @@ -44,6 +44,12 @@ import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; +/** + * The Class ResultRowResultsPanel. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 16, 2017 + */ public class ResultRowResultsPanel extends ContentPanel { @@ -110,11 +116,23 @@ public class ResultRowResultsPanel extends ContentPanel { private Button btnCreateGisLayer; private Button btnOccurrencesMenu; + /** + * Gets the single instance of ResultRowResultsPanel. + * + * @return single instance of ResultRowResultsPanel + */ public static ResultRowResultsPanel getInstance() { return instance; } + /** + * Instantiates a new result row results panel. + * + * @param eventBus the event bus + * @param loader the loader + * @param searchController the search controller + */ public ResultRowResultsPanel(final EventBus eventBus, StreamPagingLoader loader, SearchController searchController) { instance=this; @@ -294,14 +312,23 @@ public class ResultRowResultsPanel extends ContentPanel { } + + /** + * Active tool bar buttons. + * + * @param bool the bool + */ public void activeToolBarButtons(boolean bool){ btnShowOnlySelectedButton.setEnabled(bool); btnViewDetails.setEnabled(bool); -// btnShowInGisViewer.setEnabled(bool); btnOccurrencesMenu.setEnabled(bool); + btnCreateGisLayer.setEnabled(bool); } + /** + * Reset filter. + */ public void resetFilter (){ labelFilter.setLabel(ConstantsSpeciesDiscovery.FILTER); labelFilterValue.setLabel(ConstantsSpeciesDiscovery.NONE); @@ -311,6 +338,12 @@ public class ResultRowResultsPanel extends ContentPanel { pageToolBar.reset(); //ADDED 03/08/2012 } + /** + * Sets the filter active. + * + * @param isActive the is active + * @param label the label + */ public void setFilterActive(boolean isActive, String label){ if(isActive){ @@ -322,11 +355,22 @@ public class ResultRowResultsPanel extends ContentPanel { resetFilter(); } + /** + * Bind. + * + * @param eventBus the event bus + * @param loader the loader + */ protected void bind(EventBus eventBus, StreamPagingLoader loader) { // this.gridViewManager = new GridViewManager(eventBus, loader); } + /** + * Toggle view. + * + * @param view the view + */ protected void toggleView(ContentPanel view) { instance.mask("Switching view.."); @@ -357,6 +401,9 @@ public class ResultRowResultsPanel extends ContentPanel { } + /* (non-Javadoc) + * @see com.extjs.gxt.ui.client.widget.Container#onAfterLayout() + */ @Override protected void onAfterLayout() { super.onAfterLayout(); @@ -365,12 +412,20 @@ public class ResultRowResultsPanel extends ContentPanel { reload(); } + /** + * Reload. + */ public void reload() { // if (currentView!=null) // this.gridViewManager.reload(); } + /** + * Active btn show only selected. + * + * @param bool the bool + */ public void activeBtnShowOnlySelected(boolean bool) { this.btnShowOnlySelectedButton.removeSelectionListener(btnOnlySelectedListner); @@ -386,16 +441,29 @@ public class ResultRowResultsPanel extends ContentPanel { } }; + /** + * Reset store. + */ public void resetStore() { this.store.removeAll(); } + /** + * Gets the classic grid view. + * + * @return the classic grid view + */ public SpeciesGrid getClassicGridView() { return classicGridView; } + /** + * Select all rows. + * + * @param selectionValue the selection value + */ public void selectAllRows(boolean selectionValue) { if(selectionValue) classicGridView.selectAll(); @@ -404,11 +472,19 @@ public class ResultRowResultsPanel extends ContentPanel { } + /** + * Active check all rows. + * + * @param active the active + */ public void activeCheckAllRows(boolean active) { btnSelectAllRow.setEnabled(active); btnDeSelectAllRow.setEnabled(active); } + /** + * Adds the buttons occurrences job. + */ public void addButtonsOccurrencesJob(){ btnOccurrencesMenu = new Button(ConstantsSpeciesDiscovery.SAVE_OCCURRENCES); @@ -507,10 +583,9 @@ public class ResultRowResultsPanel extends ContentPanel { btnCreateGisLayer = new Button(ConstantsSpeciesDiscovery.CREATE_GIS_LAYER_TITLE); - btnCreateGisLayer.setMenu(formatSubMenu); btnCreateGisLayer.setScale(ButtonScale.MEDIUM); // btnOccurrencesMenu.setIconAlign(IconAlign.TOP); - btnCreateGisLayer.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGisLayerLogo())); + btnCreateGisLayer.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGlobe24())); btnCreateGisLayer.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.CREATE_GIS_LAYER_TITLE, ConstantsSpeciesDiscovery.CREATE_GIS_LAYER_TEXT)); btnCreateGisLayer.addSelectionListener(new SelectionListener() { @@ -540,6 +615,11 @@ public class ResultRowResultsPanel extends ContentPanel { } + /** + * Checks if is search by common name. + * + * @return true, if is search by common name + */ protected boolean isSearchByCommonName() { if(searchController.getLastSearchEvent().getType().equals(SearchType.BY_COMMON_NAME)) diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/gislayer/GisLayerGridJob.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/gislayer/GisLayerGridJob.java index 6892b1c..6aa084e 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/gislayer/GisLayerGridJob.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/job/gislayer/GisLayerGridJob.java @@ -7,7 +7,6 @@ import org.gcube.portlets.user.speciesdiscovery.client.ConstantsSpeciesDiscovery import org.gcube.portlets.user.speciesdiscovery.client.SpeciesDiscovery; import org.gcube.portlets.user.speciesdiscovery.client.event.ReLoadListJobEvent; import org.gcube.portlets.user.speciesdiscovery.client.event.ReSubmitJobEvent; -import org.gcube.portlets.user.speciesdiscovery.client.event.SaveJobErrorEvent; import org.gcube.portlets.user.speciesdiscovery.client.event.SaveJobEvent; import org.gcube.portlets.user.speciesdiscovery.client.resources.Resources; import org.gcube.portlets.user.speciesdiscovery.client.window.MessageBoxConfirm; @@ -82,8 +81,8 @@ public class GisLayerGridJob extends ContentPanel{ private Button buttonInfo; private Button buttonCancel; private Button buttonSave; - private Button buttonSaveError; private Button buttonReSubmit; + private Button buttonOpenGisViewerApp; private Button buttonRefreshList; private Menu menu = new Menu(); @@ -99,22 +98,11 @@ public class GisLayerGridJob extends ContentPanel{ ColumnConfig name = new ColumnConfig(JobGisLayerModel.JOBNAME, JobGisLayerModel.JOBNAME, 220); ColumnConfig progress = new ColumnConfig(JobGisLayerModel.PROGRESS, JobGisLayerModel.PROGRESS, 150); ColumnConfig startDate = new ColumnConfig(JobGisLayerModel.STARTTIME, JobGisLayerModel.STARTTIME, 140); - - //ColumnConfig submitDate = new ColumnConfig(JobGisLayerModel.SUBMITTIME, JobGisLayerModel.SUBMITTIME, 140); -// creationDate.setDateTimeFormat(DateTimeFormat.getFormat(DATE_TIME_FORMAT)); - ColumnConfig endTime = new ColumnConfig(JobGisLayerModel.ENDTIME, JobGisLayerModel.ENDTIME, 140); -// endTime.setDateTimeFormat(DateTimeFormat.getFormat(DATE_TIME_FORMAT)); - - //ColumnConfig elapsedTime = new ColumnConfig(JobGisLayerModel.ELAPSEDTIME, JobGisLayerModel.ELAPSEDTIME + " Days, " + ConstantsSpeciesDiscovery.TIMEFORMAT_HH_MM_SS, 100); -// elapsedTime.setHidden(true); - ColumnConfig layerUUID = new ColumnConfig(JobGisLayerModel.LAYERUUID, JobGisLayerModel.LAYERUUID, 140); ColumnConfig gisViewerAppLink = new ColumnConfig(JobGisLayerModel.GISVIEWERAPPLINK, JobGisLayerModel.GISVIEWERAPPLINK, 140); - - ColumnConfig status = new ColumnConfig(JobGisLayerModel.STATUS, JobGisLayerModel.STATUS, 80); - + //final ColumnModel cm = new ColumnModel(Arrays.asList(name, progress, status, layerUUID, gisViewerAppLink, startDate, endTime)); final ColumnModel cm = new ColumnModel(Arrays.asList(name, progress, status, layerUUID, gisViewerAppLink, startDate, endTime)); setBodyBorder(false); @@ -292,11 +280,11 @@ public class GisLayerGridJob extends ContentPanel{ /** - * Removes the species job by identifier. + * Removes the gis layer job by identifier. * * @param jobIdentifier the job identifier */ - public void removeSpeciesJobByIdentifier(String jobIdentifier) { + public void removeGisLayerJobByIdentifier(String jobIdentifier) { BaseModelData job = store.findModel(JobGisLayerModel.JOBINDENTIFIER, jobIdentifier); if(job!=null){ store.remove(job); @@ -339,13 +327,13 @@ public class GisLayerGridJob extends ContentPanel{ final String jobIdentifier = baseModelData.get(JobGisLayerModel.JOBINDENTIFIER); - SpeciesDiscovery.taxonomySearchService.cancelOccurrenceJob(jobIdentifier, new AsyncCallback() { + SpeciesDiscovery.taxonomySearchService.cancelGisLayerJob(jobIdentifier, new AsyncCallback() { @Override public void onSuccess(Boolean result) { if(result) - removeSpeciesJobByIdentifier(jobIdentifier); + removeGisLayerJobByIdentifier(jobIdentifier); } @@ -390,33 +378,6 @@ public class GisLayerGridJob extends ContentPanel{ } - /** - * Save error job. - */ - private void saveErrorJob() { - - BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); - - if(baseModelData!=null){ - - String load = baseModelData.get(JobGisLayerModel.STATUS).toString(); - - if(load.compareTo(DownloadState.COMPLETED.toString())==0 || load.compareTo(DownloadState.SAVED.toString())==0 || load.compareTo(DownloadState.FAILED.toString())==0){ - - String jobIdentifier = baseModelData.get(JobGisLayerModel.JOBINDENTIFIER); - JobGisLayerModel jobModel = baseModelData.get(jobIdentifier); - eventBus.fireEvent(new SaveJobErrorEvent(jobIdentifier, jobModel.getJobName(), jobModel, SearchResultType.GIS_LAYER_POINT)); - } - - else{ - String name = baseModelData.get(JobGisLayerModel.JOBNAME); - MessageBox.alert(ConstantsSpeciesDiscovery.ALERT, "The error file "+ name+ " " +ConstantsSpeciesDiscovery.IS_NOT_COMPLETED, null); - } - } - - } - - /** * Resubmit job. */ @@ -515,19 +476,33 @@ public class GisLayerGridJob extends ContentPanel{ } }); + + buttonOpenGisViewerApp = new Button(OPEN_GIS_LAYER); + buttonOpenGisViewerApp.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGlobe16())); + buttonOpenGisViewerApp.setScale(ButtonScale.MEDIUM); + buttonOpenGisViewerApp.addListener(Events.OnClick, new Listener() { + + @Override + public void handleEvent(BaseEvent be) { + + openLayerSelectedWithGisViewerApp(); + + } + }); + toolBar.add(buttonInfo); toolBar.add(new SeparatorToolItem()); toolBar.add(buttonSave); toolBar.add(new SeparatorToolItem()); - toolBar.add(buttonSaveError); - toolBar.add(new SeparatorToolItem()); - toolBar.add(buttonCancel); toolBar.add(new SeparatorToolItem()); - toolBar.add(buttonReSubmit); + //toolBar.add(buttonReSubmit); + //toolBar.add(new SeparatorToolItem()); + + toolBar.add(buttonOpenGisViewerApp); toolBar.add(new SeparatorToolItem()); toolBar.add(new FillToolItem()); @@ -539,6 +514,25 @@ public class GisLayerGridJob extends ContentPanel{ enableButtonOnClick(false); } + + + /** + * Open layer selected with gis viewer app. + */ + private void openLayerSelectedWithGisViewerApp(){ + + BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); + + if(baseModelData!=null){ + String url = baseModelData.get(JobGisLayerModel.GISVIEWERAPPLINK); + if(url==null){ + Window.alert("The task '" +baseModelData.get(JobGisLayerModel.JOBNAME) +"' does not contain a valid GisViewer App link, Is it completed?"); + return; + } + Window.open(url, "", ""); + } + } + /** * Enable tool bar. * @@ -565,7 +559,6 @@ public class GisLayerGridJob extends ContentPanel{ this.buttonInfo.setEnabled(bool); this.buttonSave.setEnabled(bool); this.buttonReSubmit.setEnabled(bool); - this.buttonSaveError.setEnabled(bool); } /** @@ -575,31 +568,20 @@ public class GisLayerGridJob extends ContentPanel{ MenuItem menuOpenWithGis = new MenuItem(); menuOpenWithGis.setText(OPEN_GIS_LAYER); - menuOpenWithGis.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGlobe())); + menuOpenWithGis.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGlobe16())); menuOpenWithGis.addSelectionListener(new SelectionListener() { @Override public void componentSelected(MenuEvent ce) { - BaseModelData baseModelData = grid.getSelectionModel().getSelectedItem(); - - if(baseModelData!=null){ - String url = baseModelData.get(JobGisLayerModel.GISVIEWERAPPLINK); - if(url==null){ - Window.alert("The task '" +baseModelData.get(JobGisLayerModel.JOBNAME) +"' does not contain a valid GisViewer App link, Is it completed?"); - return; - } - Window.open(url, "", ""); - } + openLayerSelectedWithGisViewerApp(); } }); menu.add(menuOpenWithGis); - - MenuItem menuInfo = new MenuItem(); menuInfo.setText(INFO); menuInfo.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getInfoIcon())); @@ -659,7 +641,7 @@ public class GisLayerGridJob extends ContentPanel{ }); - menu.add(menuResubmit); + //menu.add(menuResubmit); grid.setContextMenu(menu); } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java index 83c1aeb..7495e2b 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/Resources.java @@ -175,12 +175,11 @@ public interface Resources extends ClientBundle { @Source("help.html") TextResource help(); - /** - * @return - */ + @Source("gislayer/globe24.png") + ImageResource getGlobe24(); - @Source("globe24.png") - ImageResource getGisLayerLogo(); + @Source("gislayer/globe16.png") + ImageResource getGlobe16(); @Source("gislayer/globe.png") ImageResource getGlobe(); diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gislayer/globe16.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gislayer/globe16.png new file mode 100644 index 0000000000000000000000000000000000000000..b62706e13657d55e721a58f7b298c4f7cc0dc91f GIT binary patch literal 879 zcmV-#1CacQP)&4wiwi8A&YUz@Po_PjEf@~Y|1`3jTbZ$ zFY$)K>|)%);vL*H+gzF@=v-*Vm$3`&07pv;=d>1RPfvS1JtTO+=gXTnd7j_%{GSWK z3v5IEht_|sZ`3dpp^-=?Qv(BmZ?AWCH?@57@yIMdS!++VXI`pHvgKRNnJ7wgf!YcuR4Ua>0!fm< zas23oFE7@9+SK^l48Xnn)*^dR@$YVvWHyjVY$?>Ez?KV&qCm(qMIw{Qz~}Rg9cepW zb-DAK|E2-Q`>&Pc8#kJDNz~8bP&nTPwOS3Dre^`NCI|u!wI054@WB3!WZ`>XxHToq z|15SJNDccCc9!6w$e>gs!fBcVlVPqRBMZt($XYs`Mn^}7)cwPqB9hnq%TCs6ZF4&f zC}SfaIvs{HvV?d*fo&?a&r~9cqVi?|&HIjFGBWrPG3~g0iZPkrFI%L+2@efMcD_F< zAU-9)s!HG`doFwd4!NuZpPxfo6j0^RVejcqAo=Jt(Qp0k9AhxQyQL_NUA0Au_H3iF zS%!jPL?;BORT6&e3*zd75WV}S1%;jKUxvY8n9&=H z#qgCk0H;2UUjG;_{yG9KJOc4i7<4KMaVq{9p;k7nB<2FIr$CEcuUla>niPmut5q7t z^E}RW_aPn`M&|<_d^8G7$P1a^WeG74A+EJVa;@_bih0Fh(IMZ$;_YQNtg3P&Cnrad z5)1}$>HGU=>-t9ylmQ7&o@M+G@PYE_AurzUfm;6)7%dHog~Ou3*E?Q?)3HF2xlXAT1;sQ^j{#|NK-PK8oCg2^002ovPDHLk FV1j-(ooN67 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gislayer/globe24.png b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/resources/gislayer/globe24.png new file mode 100644 index 0000000000000000000000000000000000000000..9167a20f33a480ce861a2ccad1494949e9460a8b GIT binary patch literal 1616 zcmV-W2Cw;vP)3$g7(L&-_hx->#!hESr!(zT3Jp*e>w>$23PezFH)>pdxPW4eL5QMJ;~Ez*5>P-~ zK*crv0YQ|g6cG`qqE(Q^%Crz@r|mGEeR*%L_r6lpV8t)Fc{lI9`%zf98xUr*1td!1#sR@4q%&Sa8S|lntvBJO)`SiW?_ae$G}ZgUuJ@9yCtE$l6` z!&QvpVoMYg8-{VtZD!@is_(CgPLytdF1`yaT=+_Rq~p-258hvuHUAv;LhEeFtuAV) z(a6E+amgt*)748>n;jC@)2+J5YPCX96ai$4{BJuD6J6I?Q&SUtvw6$?@4WryV)JGA zxu1V>d9|^1VU21K!*yCO>tQz9WU0a_sctreW$FBY6CSsQQ`{QkK!XAl3I(=y?ONK{ z+}yfq<;rnXJ@?Cyp_aG1yebV1s_3kpWY`q)y1;rW+OaVS~jB+e!rh_G0o~kr94Q0#g4`W(cHEY z{oa{mYkrDRGMPe4dzu-!Bo$LJTr-l`fkR#N`OYJ#Ew|1l*NrQ0BD=a;RyB6^kSslM znICm^b*A?R4w0Z+0PO4N#HyA!yQ9%XPMgH~`ub??k6rlm$2cow5)_Me!BR-DdLPkm zktmo^xS8xTUOSB`j-9g0&Bg~y^yHKZghC;vsw(~cbfdAuLwk0W?~O&gR#96?7GAMNDHiW#1q1LXSp=X$P(k1CS}n)KpgvZ?p-lIiME z3eG;&#fDcp$*nq3UhZQakB0<^uw}7WWbt^M_WjYpV$s9Y^g|3^>=sq0hz|}BXDIR= z7=d_CI)uw3$V9XH)BSR@*TTUdc9&7ES*kM>#jZQ+Gjo^R?I;uaK?qEwzf9**wXbRla5_&hgl*i0Q4`ymSm^UUv~BPSKHQFTM26de*Z0fao9Vcrl#w z<{kf*W^jOk7=DGH3o(H!H@2>-%ztXYi*3KObtf~qR$g&4Pu%@q%l`yxPubxSJn6## O0000 getListGisLayerJob() throws Exception; + boolean saveGisLayerAsWsLink( + JobGisLayerModel jobGisLayer, String destinationFolderId, String fileName) throws Exception; + + boolean changeStatusGisLayerJob(String jobId, DownloadState state); + + boolean cancelGisLayerJob(String jobIdentifier) throws Exception; + + JobGisLayerModel resubmitGisLayerJob(String jobIdentifier) throws Exception; + } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java index 48b35d6..5ccc757 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/rpc/TaxonomySearchServiceAsync.java @@ -171,4 +171,36 @@ public interface TaxonomySearchServiceAsync { void getListGisLayerJob(AsyncCallback> callback); + /** + * @param jobGisLayer + * @param id + * @param fileName + * @param asyncCallback + */ + public void saveGisLayerAsWsLink( + JobGisLayerModel jobGisLayer, String id, String fileName, + AsyncCallback asyncCallback); + + /** + * @param jobId + * @param state + * @param asyncCallback + */ + public void changeStatusGisLayerJob( + String jobId, DownloadState state, AsyncCallback asyncCallback); + + /** + * @param jobIdentifier + * @param asyncCallback + */ + public void cancelGisLayerJob( + String jobIdentifier, AsyncCallback asyncCallback); + + /** + * @param jobIdentifier + * @param asyncCallback + */ + public void resubmitGisLayerJob( + String jobIdentifier, AsyncCallback asyncCallback); + } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/windowdetail/ViewDetailsWindow.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/windowdetail/ViewDetailsWindow.java index b878e9a..b5b8378 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/windowdetail/ViewDetailsWindow.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/client/windowdetail/ViewDetailsWindow.java @@ -333,7 +333,7 @@ public class ViewDetailsWindow extends Window { ToolBar toolbar = new ToolBar(); Button btnShowInGisViewer = new Button(ConstantsSpeciesDiscovery.CREATE_GIS_LAYER_TITLE); - btnShowInGisViewer.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGisProducts())); + btnShowInGisViewer.setIcon(AbstractImagePrototype.create(Resources.INSTANCE.getGlobe16())); btnShowInGisViewer.setToolTip(new ToolTipConfig(ConstantsSpeciesDiscovery.CREATE_GIS_LAYER_TITLE, ConstantsSpeciesDiscovery.CREATE_GIS_LAYER_TEXT)); btnShowInGisViewer.setScale(ButtonScale.SMALL); btnShowInGisViewer.setIconAlign(IconAlign.TOP); @@ -342,7 +342,7 @@ public class ViewDetailsWindow extends Window { @Override public void componentSelected(ButtonEvent ce) { - SearchController.eventBus.fireEvent(new CreateGisLayerJobEvent(lastSearchEvent.getSearchTerm() + " occurrences Layer", "Gis Layer generated from SPD Portlet by gCube Framework", count)); + SearchController.eventBus.fireEvent(new CreateGisLayerJobEvent(lastSearchEvent.getSearchTerm() + " occurrences layer", ConstantsSpeciesDiscovery.GIS_LAYER_EVENT_TEXT, count)); } }); diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java index cefd2b0..955ddc2 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/TaxonomySearchServiceImpl.java @@ -109,8 +109,8 @@ import com.google.gwt.user.server.rpc.RemoteServiceServlet; /** * The server side implementation of the RPC service. - * @author "Federico De Faveri defaveri@isti.cnr.it" - * @author "Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it" + * @author "Federico De Faveri defaveri@isti.cnr.it" - */ public class TaxonomySearchServiceImpl extends RemoteServiceServlet implements TaxonomySearchService { @@ -2123,4 +2123,123 @@ public class TaxonomySearchServiceImpl extends RemoteServiceServlet implements T return cluster; } + + /* (non-Javadoc) + * @see org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchService#saveGisLayerAsWsLink(org.gcube.portlets.user.speciesdiscovery.shared.JobGisLayerModel, java.lang.String, java.lang.String) + */ + @Override + public boolean saveGisLayerAsWsLink(JobGisLayerModel jobGisLayer, String destinationFolderId, String fileName) throws Exception{ + + try { + + Workspace workspace = GetWorkspaceUtil.getWorskspace(getASLSession()); + logger.info("input stream is not null"); + WorkspaceFolder folder = (WorkspaceFolder) workspace.getItem(destinationFolderId); + fileName = WorkspaceUtil.getUniqueName(fileName, folder); + workspace.createExternalUrl(fileName, jobGisLayer.getLayerDescription() + "- Layer UUID: "+jobGisLayer.getLayerUUID(), jobGisLayer.getGisViewerAppLink(), destinationFolderId); +// System.out.println("input stream is not null"); + logger.info("Saving External link "+fileName +" completed"); + return true; + + } catch (Exception e) { + logger.error("Sorry, an error occurred saving the file '"+fileName+"' in your Workspace, try again",e); + throw new Exception(e.getMessage()); + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchService#changeStatusGisLayerJob(java.lang.String, org.gcube.portlets.user.speciesdiscovery.shared.DownloadState) + */ + @Override + public boolean changeStatusGisLayerJob(String jobId, DownloadState state) { + + GisLayerJobPersistence gisLayerDAO; + try { + gisLayerDAO = DaoSession.getGisLayersJobDAO(getASLSession()); + + int count = GisLayerJobUtil.changetStatusGisLayerJob(jobId, state, gisLayerDAO); + + if(count==1) + return true; + + return false; + } + catch (Exception e) { + logger.error("An error occured in changeStatusGisLayerJob for jobId: "+jobId); + return false; + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchService#cancelGisLayerJob(java.lang.String) + */ + @Override + public boolean cancelGisLayerJob(String jobIdentifier) throws Exception { + + try{ + SpeciesService speciesService = getSpeciesService(); + //REMOVE JOB ON THE SERVICE + speciesService.cancelGisLayerByJobId(jobIdentifier); + GisLayerJobPersistence gisLayerDao = DaoSession.getGisLayersJobDAO(getASLSession()); + int count = GisLayerJobUtil.deleteGisLayerJobById(jobIdentifier, gisLayerDao); + if(count==1) + return true; + + }catch (Exception e) { + logger.error("Erroron deleting gis layer job ", e); + throw new Exception("Sorry, an error occurred deleting gis layer job", e); + } + + return false; + } + + /* (non-Javadoc) + * @see org.gcube.portlets.user.speciesdiscovery.client.rpc.TaxonomySearchService#resubmitGisLayerJob(java.lang.String) + */ + @Override + public JobGisLayerModel resubmitGisLayerJob(String jobIdentifier) throws Exception { + + //TODO + return null; + +// logger.info("Resubmit gis layer job by id: " + jobIdentifier); +// JobGisLayerModel jobGisLayerModel = null; +// GisLayerJobPersistence gisLayerJobDAO = DaoSession.getGisLayersJobDAO(getASLSession()); +// +// CriteriaBuilder queryBuilder = gisLayerJobDAO.getCriteriaBuilder(); +// CriteriaQuery cq = queryBuilder.createQuery(); +// Predicate pr1 = queryBuilder.equal(gisLayerJobDAO.rootFrom(cq).get(GisLayerJob.ID_FIELD), jobIdentifier); +// cq.where(pr1); +// +// Iterator iterator = gisLayerJobDAO.executeCriteriaQuery(cq).iterator(); +// +// GisLayerJob gisLayerJob; +// +// if(iterator.hasNext()) +// gisLayerJob = iterator.next(); +// else +// return jobGisLayerModel; +// +// SpeciesService speciesService = getSpeciesService(); +// +// //recover taxomyId +// String speciesJobId = speciesService.generateGisLayerFromOccurrenceKeys(occurrenceKeys, layerTitle, layerDescr, author, credits) +// +// long submitTime = Calendar.getInstance().getTimeInMillis(); +// +// String name = RESUBMIT + ": " +NormalizeString.lowerCaseUpFirstChar(gisLayerJob.getDescriptiveName()); +// +// //STORE INTO DAO +// TaxonomyJob speciesJob = new TaxonomyJob(speciesJobId, DownloadState.PENDING.toString(), name, gisLayerJob.getDescriptiveName(), gisLayerJob.getDataSourceName(), gisLayerJob.getRank(), 0, submitTime, 0, gisLayerJob.getTaxonomyId()); +// gisLayerJobDAO.insert(speciesJob); +// +// jobGisLayerModel = new JobTaxonomyModel(speciesJob.getId(), speciesJob.getDescriptiveName(), DownloadState.PENDING, null, gisLayerJob.getDescriptiveName(), gisLayerJob.getDataSourceName(), gisLayerJob.getRank()); +// +// Date submit = DateUtil.millisecondsToDate(speciesJob.getSubmitTime()); +//// jobSpeciesModel.setStartTime(DateUtil.dateToDateFormatString(start)); +// jobGisLayerModel.setSubmitTime(submit); +// jobGisLayerModel.setEndTime(null); +// +// return jobGisLayerModel; + } } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/GisLayerJobUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/GisLayerJobUtil.java index f7a2bac..74f1f6e 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/GisLayerJobUtil.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/job/GisLayerJobUtil.java @@ -5,8 +5,13 @@ package org.gcube.portlets.user.speciesdiscovery.server.job; import java.util.Calendar; import java.util.Date; +import java.util.Iterator; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; + import org.apache.log4j.Logger; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.data.spd.model.service.types.CompleteJobStatus; @@ -18,6 +23,7 @@ import org.gcube.portlets.user.speciesdiscovery.server.util.DateUtil; import org.gcube.portlets.user.speciesdiscovery.shared.DownloadState; import org.gcube.portlets.user.speciesdiscovery.shared.GisLayerJob; import org.gcube.portlets.user.speciesdiscovery.shared.JobGisLayerModel; +import org.gcube.portlets.user.speciesdiscovery.shared.OccurrencesJob; /** @@ -225,4 +231,40 @@ public class GisLayerJobUtil { } + + /** + * @param jobId + * @param state + * @param gisLayerDAO + * @return + */ + public static int changetStatusGisLayerJob(String jobId, DownloadState state, GisLayerJobPersistence gisLayerDAO) { + logger.trace("Changing status for Gis Layer job id: " + jobId); +// System.out.println("Delete job id: " + jobIdentifier); + int result = 0; + try{ + + CriteriaBuilder queryBuilder = gisLayerDAO.getCriteriaBuilder(); + CriteriaQuery cq = queryBuilder.createQuery(); + Predicate pr1 = queryBuilder.equal(gisLayerDAO.rootFrom(cq).get(OccurrencesJob.ID_FIELD), jobId); + cq.where(pr1); + + Iterator iterator = gisLayerDAO.executeCriteriaQuery(cq).iterator(); + GisLayerJob job; + if(iterator.hasNext()) + job = iterator.next(); + else + return 0; + + job.setState(state.toString()); + gisLayerDAO.update(job); + + }catch (Exception e) { + logger.error("An error occured in updating status for jobId: " + jobId + " exception: "+e, e ); + } + + return result; + } + + } diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java index 1ffcab3..33943e2 100644 --- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java +++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/SpeciesService.java @@ -501,8 +501,8 @@ public class SpeciesService { * * @param serverJobId the server job id * @return the gis layer by job id - * @throws SearchServiceException the search service exception - * @throws InvalidJobIdException + * @throws InvalidJobIdException the invalid job id exception + * @throws Exception the exception */ public CompleteJobStatus getGisLayerByJobId(String serverJobId) throws InvalidJobIdException, Exception{ @@ -527,7 +527,7 @@ public class SpeciesService { * * @param serverJobId the server job id * @return the gis layer result link by job id - * @throws SearchServiceException the search service exception + * @throws InvalidJobIdException the invalid job id exception */ public String getGisLayerResultLinkByJobId(String serverJobId) throws InvalidJobIdException { @@ -543,14 +543,13 @@ public class SpeciesService { } } + /** - * Removes the gis layer by job id. + * Cancel gis layer by job id. * * @param serverJobId the server job id - * @return the string - * @throws SearchServiceException the search service exception */ - public void removeGisLayerByJobId(String serverJobId) { + public void cancelGisLayerByJobId(String serverJobId) { try { ExecutorClient creator = AbstractPlugin.executor().build(); @@ -893,13 +892,7 @@ public class SpeciesService { InputStream is = null; try { - String url = this.executorCall.getResultLink(jobIdentifier); // CHANGE - // INTO - // OCCURRENCE - // JOB - // ************************************************************************************** - // ** - // //TODO + String url = this.executorCall.getResultLink(jobIdentifier); logger.trace("URL returned by species service is: " + url); if (url == null || url.isEmpty()) { logger.error("URL returned by species service is: " + url); diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index b3c99c1..a3fc5f3 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -35,39 +35,6 @@ /speciesdiscovery/TaxonomyRowTable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - workspaceExplorer org.gcube.portlets.widgets.wsexplorer.server.WorkspaceExplorerServiceImpl