From 091b0ef5303a534a20336149e45e2b3d6a8b0d83 Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Mon, 30 Sep 2019 16:40:46 +0000 Subject: [PATCH] ref 11711: SAI - Add a simple text viewer so that log files created by Data Miner algorithms can be directly viewed in the browser https://support.d4science.org/issues/11711 Added service info[ticket #12594] Added support to show log information [ticket #11711] Added support to show files html, json, pdf, txt [ticket #17106] Updated information show to the user when a computation is submitted [ticket #17030] git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/data-miner-manager@181871 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../ComputationValueFilePanel.java | 2 +- .../client/experiments/WorkflowPanel.java | 14 +-- .../client/info/ServiceInfoData.java | 48 --------- .../info/ServiceInfoDataProperties.java | 4 +- .../client/info/ServiceInfoPanel.java | 98 ++++++++++++++----- .../client/widgets/FileViewer.java | 9 +- .../client/widgets/ImageViewer.java | 20 ++-- .../TestInformationSystemRequests.java | 8 +- 8 files changed, 111 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoData.java diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationValueFilePanel.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationValueFilePanel.java index f842cdc..264f047 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationValueFilePanel.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/computations/ComputationValueFilePanel.java @@ -92,7 +92,7 @@ public class ComputationValueFilePanel extends SimpleContainer { if (fileName != null && !fileName.isEmpty()) { String fileNameLowerCase = fileName.toLowerCase(); if (fileNameLowerCase.endsWith(".html") || fileNameLowerCase.endsWith(".htm") - || fileNameLowerCase.endsWith(".log") || fileNameLowerCase.endsWith(".json") + || fileNameLowerCase.endsWith(".pdf")|| fileNameLowerCase.endsWith(".log") || fileNameLowerCase.endsWith(".json") || fileNameLowerCase.endsWith(".txt")) { buttonsContainer.add(showFileButton, buttonBoxLayoutData); } diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/experiments/WorkflowPanel.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/experiments/WorkflowPanel.java index ad579ab..99a92d0 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/experiments/WorkflowPanel.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/experiments/WorkflowPanel.java @@ -21,9 +21,11 @@ import com.sencha.gxt.widget.core.client.TabPanel; * */ public class WorkflowPanel extends TabPanel { - - public static final String DEFAULT_OPERATOR = "AQUAMAPS_SUITABLE"; - + private static final String OPERATOR = "Operator"; + private static final String COMPUTATIONS_EXECUTION = "Computations Execution"; + private static final String SERVICE_INFO = "Service Profile"; + + private ComputationExecutionPanel computationExecutionPanel; private ComputationPanel computationPanel; private ServiceInfoPanel environmentPanel; @@ -45,7 +47,7 @@ public class WorkflowPanel extends TabPanel { private void create() { - TabItemConfig tabWorkFlowLcItemConf = new TabItemConfig("Operator", + TabItemConfig tabWorkFlowLcItemConf = new TabItemConfig(OPERATOR, false); tabWorkFlowLcItemConf.setIcon(DataMinerManager.resources .folderExplore()); @@ -63,14 +65,14 @@ public class WorkflowPanel extends TabPanel { add(computationPanel, tabWorkFlowLcItemConf); TabItemConfig tabComputationPanelItemConf = new TabItemConfig( - "Computations Execution", false); + COMPUTATIONS_EXECUTION, false); tabComputationPanelItemConf.setIcon(DataMinerManager.resources .folderExplore()); computationExecutionPanel = new ComputationExecutionPanel(); add(computationExecutionPanel, tabComputationPanelItemConf); TabItemConfig tabEnvironmentPanelItemConf = new TabItemConfig( - "Service Info", false); + SERVICE_INFO, false); tabEnvironmentPanelItemConf.setIcon(DataMinerManager.resources .folderExplore()); environmentPanel = new ServiceInfoPanel(); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoData.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoData.java deleted file mode 100644 index e1a48b2..0000000 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoData.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.gcube.portlets.user.dataminermanager.client.info; - -import java.io.Serializable; - -/** - * - * @author Giancarlo Panichi - * - * - */ -public class ServiceInfoData implements Serializable { - - private static final long serialVersionUID = 4732143678328978038L; - private String key; - private String value; - - public ServiceInfoData() { - super(); - } - - public ServiceInfoData(String key, String value) { - super(); - this.key = key; - this.value = value; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "ServiceInfoData [key=" + key + ", value=" + value + "]"; - } - -} diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoDataProperties.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoDataProperties.java index cf9f071..bdcf5fb 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoDataProperties.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoDataProperties.java @@ -1,5 +1,7 @@ package org.gcube.portlets.user.dataminermanager.client.info; +import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfoData; + import com.google.gwt.editor.client.Editor.Path; import com.sencha.gxt.core.client.ValueProvider; import com.sencha.gxt.data.shared.ModelKeyProvider; @@ -17,6 +19,6 @@ public interface ServiceInfoDataProperties extends PropertyAccess key(); ValueProvider value(); - + ValueProvider category(); } diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoPanel.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoPanel.java index cfd3f8b..bebf056 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoPanel.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/info/ServiceInfoPanel.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfo; +import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfoData; import org.gcube.portlets.user.dataminermanager.client.common.EventBusProvider; import org.gcube.portlets.user.dataminermanager.client.events.ServiceInfoEvent; import org.gcube.portlets.user.dataminermanager.client.events.ServiceInfoRequestEvent; @@ -24,6 +25,7 @@ import com.sencha.gxt.widget.core.client.form.FieldSet; import com.sencha.gxt.widget.core.client.grid.ColumnConfig; import com.sencha.gxt.widget.core.client.grid.ColumnModel; import com.sencha.gxt.widget.core.client.grid.Grid; +import com.sencha.gxt.widget.core.client.grid.GroupingView; /** * @@ -33,6 +35,8 @@ import com.sencha.gxt.widget.core.client.grid.Grid; */ public class ServiceInfoPanel extends FramedPanel { + private static final String RUNTIME_FEATURE = "Runtime features"; + private static final String SERVICE_INFO_TITLE = "Service Profile"; private static final ServiceInfoDataProperties props = GWT.create(ServiceInfoDataProperties.class); private VerticalLayoutContainer v; private VerticalLayoutContainer environmentVBox; @@ -55,7 +59,7 @@ public class ServiceInfoPanel extends FramedPanel { setBodyStyle("backgroundColor:white;"); setHeaderVisible(false); setResize(true); - setHeadingText("Service Info"); + setHeadingText(SERVICE_INFO_TITLE); setBodyStyle("backgroundColor:white;"); } @@ -90,17 +94,23 @@ public class ServiceInfoPanel extends FramedPanel { private void createView() { SimpleContainer sectionTitle = new SimpleContainer(); + SimpleContainer sectionSubTitle = new SimpleContainer(); + // title HtmlLayoutContainer title = new HtmlLayoutContainer( - "
Service Info
"); + "
" + SERVICE_INFO_TITLE + "
"); sectionTitle.add(title, new MarginData()); sectionTitle.getElement().getStyle().setMarginRight(20, Unit.PX); - // v.add(sectionTitle, new VerticalLayoutData(1, -1, new - // Margins(0))); v.add(sectionTitle, new VerticalLayoutData(-1, -1, new Margins(10))); - FieldSet environmentFieldSet = environmentView(); - v.add(environmentFieldSet, new VerticalLayoutData(-1, -1, new Margins(10))); + // subtitle + HtmlLayoutContainer subtitle = new HtmlLayoutContainer( + "

This page reports information on the DataMiner " + + "service instance serving this working environment giving an up to date " + + "picture of its capacities and capabilities.

"); + sectionSubTitle.add(subtitle, new MarginData()); + sectionSubTitle.getElement().getStyle().setMarginRight(20, Unit.PX); + v.add(sectionSubTitle, new VerticalLayoutData(-1, -1, new Margins(10))); } @@ -109,7 +119,7 @@ public class ServiceInfoPanel extends FramedPanel { environmentVBox = new VerticalLayoutContainer(); FieldSet configurationFieldSet = new FieldSet(); - configurationFieldSet.setHeadingText("Environment"); + configurationFieldSet.setHeadingText(RUNTIME_FEATURE); configurationFieldSet.setCollapsible(true); configurationFieldSet.add(environmentVBox); configurationFieldSet.getElement().getStyle().setMarginRight(20, Unit.PX); @@ -120,20 +130,55 @@ public class ServiceInfoPanel extends FramedPanel { } } + private void showAddress(ServiceInfoData address) { + // address + SimpleContainer sectionServerAddress = new SimpleContainer(); + + HtmlLayoutContainer addressHtml = new HtmlLayoutContainer( + "

The base url of the service instance is " + "" + + address.getValue() + ".

"); + sectionServerAddress.add(addressHtml, new MarginData()); + sectionServerAddress.getElement().getStyle().setMarginRight(20, Unit.PX); + v.add(sectionServerAddress, new VerticalLayoutData(-1, -1, new Margins(10))); + + } + private void showServiceInfo(ServiceInfo serviceInfo) { if (serviceInfo != null && serviceInfo.getServiceProperties() != null && !serviceInfo.getServiceProperties().isEmpty()) { - ArrayList serviceInfoDataList = new ArrayList<>(); - for (String key : serviceInfo.getServiceProperties().keySet()) { - ServiceInfoData serviceInfoData = new ServiceInfoData(key, serviceInfo.getServiceProperties().get(key)); - serviceInfoDataList.add(serviceInfoData); + + ServiceInfoData address=null; + ArrayList properties=serviceInfo.getServiceProperties(); + for(ServiceInfoData serviceInfoData:properties) { + if(serviceInfoData.getKey().compareTo("Address")==0){ + address = serviceInfoData; + break; + } } + + if(address!=null){ + properties.remove(address); + showAddress(address); + } + + FieldSet environmentFieldSet = environmentView(); + v.add(environmentFieldSet, new VerticalLayoutData(-1, -1, new Margins(10))); - Grid grid = createInfoGrid(serviceInfoDataList); - environmentVBox.add(grid, new VerticalLayoutData(1, -1, new Margins(0, 4, 0, 4))); + if (!properties.isEmpty()) { + Grid grid = createInfoGrid(properties); + environmentVBox.add(grid, new VerticalLayoutData(1, -1, new Margins(0, 4, 0, 4))); + } else { + HtmlLayoutContainer emptyInfoContainer = new HtmlLayoutContainer( + "

No Info Available.

"); + environmentVBox.add(emptyInfoContainer, new VerticalLayoutData(1, -1, new Margins(0, 4, 0, 4))); + + } } else { + FieldSet environmentFieldSet = environmentView(); + v.add(environmentFieldSet, new VerticalLayoutData(-1, -1, new Margins(10))); + HtmlLayoutContainer emptyInfoContainer = new HtmlLayoutContainer( "

No Info Available.

"); @@ -144,31 +189,40 @@ public class ServiceInfoPanel extends FramedPanel { } - private Grid createInfoGrid(ArrayList serviceInfoDataList) { + private Grid createInfoGrid(ArrayList properties) { ColumnConfig keyCol = new ColumnConfig(props.key(), 100, "Key"); ColumnConfig valueCol = new ColumnConfig(props.value(), 100, "Value"); + ColumnConfig categoryCol = new ColumnConfig(props.category(), + 100,"Category"); List> columns = new ArrayList>(); columns.add(keyCol); columns.add(valueCol); + columns.add(categoryCol); ColumnModel cm = new ColumnModel(columns); ListStore store = new ListStore(props.id()); - store.addAll(serviceInfoDataList); + store.addAll(properties); + + final GroupingView groupingView = new GroupingView(); + groupingView.setShowGroupedColumn(false); + groupingView.groupBy(categoryCol); + groupingView.setForceFit(true); + groupingView.setAutoExpandColumn(valueCol); + groupingView.setEmptyText("No info retrieved"); + + // grid.getView().setAutoFill(true); + // groupingView.setStripeRows(true); + // groupingView.setColumnLines(true); + + Grid grid = new Grid(store, cm, groupingView); - Grid grid = new Grid(store, cm); - grid.setAllowTextSelection(false); - grid.getView().setAutoFill(true); - grid.getView().setAutoExpandColumn(valueCol); - grid.getView().setEmptyText("No info retrieved"); grid.setAllowTextSelection(true); - grid.getView().setStripeRows(true); - grid.getView().setColumnLines(true); grid.setBorders(false); grid.setColumnReordering(false); diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/FileViewer.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/FileViewer.java index 7ea5e88..704f5b7 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/FileViewer.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/FileViewer.java @@ -55,9 +55,14 @@ public class FileViewer extends SimpleContainer { private void create() { VerticalLayoutContainer lc = new VerticalLayoutContainer(); final String fileName = fileResource.getName(); + String fileDescription = fileResource.getDescription(); final String fileUrl = fileResource.getUrl(); + + if(fileDescription==null||fileDescription.isEmpty()){ + fileDescription="Unknow"; + } HtmlLayoutContainer fileNameHtml = new HtmlLayoutContainer("

" - + new SafeHtmlBuilder().appendEscaped(fileName).toSafeHtml().asString() + "

"); + + new SafeHtmlBuilder().appendEscaped(fileDescription).toSafeHtml().asString() + "

"); lc.add(fileNameHtml, new VerticalLayoutData(-1, -1, new Margins(0))); TextButton showFileButton = new TextButton("Show"); @@ -100,7 +105,7 @@ public class FileViewer extends SimpleContainer { if (fileName != null && !fileName.isEmpty()) { String fileNameLowerCase = fileName.toLowerCase(); if (fileNameLowerCase.endsWith(".html") || fileNameLowerCase.endsWith(".htm") - || fileNameLowerCase.endsWith(".log") || fileNameLowerCase.endsWith(".json") + || fileNameLowerCase.endsWith(".pdf")|| fileNameLowerCase.endsWith(".log") || fileNameLowerCase.endsWith(".json") || fileNameLowerCase.endsWith(".txt")) { buttonsContainer.add(showFileButton, buttonBoxLayoutData); } diff --git a/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/ImageViewer.java b/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/ImageViewer.java index 3687b4a..e3d6c81 100644 --- a/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/ImageViewer.java +++ b/src/main/java/org/gcube/portlets/user/dataminermanager/client/widgets/ImageViewer.java @@ -25,19 +25,19 @@ public class ImageViewer extends SimpleContainer { protected static final String SAVE_OK_TITLE = "Saving operation was successful"; protected static final String SAVE_FAIL_TITLE = "Error"; protected static final String SAVE_FAIL_MESSAGE = "Error in saving images."; - private ImageResource imagesResource; + private ImageResource imageResource; // private ComputationId computationId; /** * * @param computationId * computation id - * @param imagesResource + * @param imageResource * image resource */ - public ImageViewer(ComputationId computationId, ImageResource imagesResource) { + public ImageViewer(ComputationId computationId, ImageResource imageResource) { super(); - this.imagesResource = imagesResource; + this.imageResource = imageResource; // this.computationId = computationId; create(); } @@ -45,23 +45,27 @@ public class ImageViewer extends SimpleContainer { private void create() { VerticalLayoutContainer v = new VerticalLayoutContainer(); add(v); - if (imagesResource == null || imagesResource.getLink() == null || imagesResource.getLink().isEmpty()) + if (imageResource == null || imageResource.getLink() == null || imageResource.getLink().isEmpty()) v.add(new HtmlLayoutContainer("No image found."), new VerticalLayoutData(-1, -1, new Margins(0))); else { - v.add(new HtmlLayoutContainer(imagesResource.getName()), new VerticalLayoutData(-1, -1, new Margins(0))); + String imageName="Unknow"; + if(imageResource.getName()!=null&&!imageResource.getName().isEmpty()){ + imageName=imageResource.getName(); + } + v.add(new HtmlLayoutContainer(imageName), new VerticalLayoutData(-1, -1, new Margins(0))); TextButton saveImageBtn = new TextButton("Download Image"); saveImageBtn.setIcon(DataMinerManager.resources.download()); saveImageBtn.addSelectHandler(new SelectEvent.SelectHandler() { @Override public void onSelect(SelectEvent event) { - com.google.gwt.user.client.Window.open(imagesResource.getLink(), imagesResource.getName(), ""); + com.google.gwt.user.client.Window.open(imageResource.getLink(), imageResource.getName(), ""); } }); v.add(saveImageBtn, new VerticalLayoutData(-1, -1, new Margins(0))); - final Image img = new Image(imagesResource.getLink()); + final Image img = new Image(imageResource.getLink()); v.add(img, new VerticalLayoutData(1, -1, new Margins(0))); } diff --git a/src/test/java/org/gcube/portlets/user/dataminermanager/TestInformationSystemRequests.java b/src/test/java/org/gcube/portlets/user/dataminermanager/TestInformationSystemRequests.java index 30edb51..583d67c 100644 --- a/src/test/java/org/gcube/portlets/user/dataminermanager/TestInformationSystemRequests.java +++ b/src/test/java/org/gcube/portlets/user/dataminermanager/TestInformationSystemRequests.java @@ -4,11 +4,11 @@ import static org.gcube.common.authorization.client.Constants.authorizationServi import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.gcube.common.authorization.library.provider.UserInfo; import org.gcube.data.analysis.dataminermanagercl.server.is.InformationSystemUtils; import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfoData; import org.gcube.portlets.user.dataminermanager.shared.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +64,7 @@ public class TestInformationSystemRequests extends TestCase { } - Map serviceProperties = InformationSystemUtils.retrieveServiceProperties( + ArrayList serviceProperties = InformationSystemUtils.retrieveServiceProperties( Constants.DATAMINER_SERVICE_CATEGORY, Constants.DATA_MINER_SERVICE_NAME, serviceCredentials.getScope()); logger.debug("Service Properties retrieved:" + serviceProperties); if (serviceProperties == null || serviceProperties.isEmpty()) { @@ -72,8 +72,8 @@ public class TestInformationSystemRequests extends TestCase { throw new Exception("No DataMiner service properties available!"); } else { logger.info("DataMiner service properties found: "); - for (String key : serviceProperties.keySet()) { - logger.debug("Property: " + key + "=" + serviceProperties.get(key)); + for (ServiceInfoData serviceInfoData : serviceProperties) { + logger.debug("Property: " + serviceInfoData); } }