diff --git a/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/dmservice/SClient4WPS.java b/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/dmservice/SClient4WPS.java index 7d246c5..3b0e2ce 100644 --- a/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/dmservice/SClient4WPS.java +++ b/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/dmservice/SClient4WPS.java @@ -23,6 +23,7 @@ import org.gcube.data.analysis.dataminermanagercl.server.dmservice.wps.WPS2DM; import org.gcube.data.analysis.dataminermanagercl.server.dmservice.wps.computationsvalue.ComputationValueBuilder; import org.gcube.data.analysis.dataminermanagercl.server.is.InformationSystemUtils; import org.gcube.data.analysis.dataminermanagercl.server.storage.StorageUtil; +import org.gcube.data.analysis.dataminermanagercl.server.uriresolver.UriResolverUtils; import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; import org.gcube.data.analysis.dataminermanagercl.shared.Constants; import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; @@ -47,6 +48,7 @@ import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorCategory; import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfo; +import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfoData; import org.n52.wps.client.ExecuteRequestBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -214,7 +216,7 @@ public class SClient4WPS extends SClient { @Override public ServiceInfo getServiceInfo() throws ServiceException { try { - LinkedHashMap serviceProperties = new LinkedHashMap<>(); + ArrayList serviceProperties = new ArrayList<>(); if (discoveredByIS) { logger.info("DataMiner Service discovered by IS"); serviceProperties = InformationSystemUtils.retrieveServiceProperties( @@ -222,10 +224,11 @@ public class SClient4WPS extends SClient { serviceCredentials.getScope()); } else { logger.info("DataMiner Service not discovered by IS no properties available"); - serviceProperties.put("Address", serviceAddress); + serviceProperties + .add(new ServiceInfoData("Address", serviceAddress, Constants.DEFAULT_SERVICE_INFO_CATEGORY)); } - ServiceInfo serviceInfo=new ServiceInfo(serviceProperties); + ServiceInfo serviceInfo = new ServiceInfo(serviceProperties); logger.info("Service Info retrieved: " + serviceInfo); return serviceInfo; @@ -772,7 +775,7 @@ public class SClient4WPS extends SClient { */ } - // TODO + // @Override public List getInputParameters(Operator operator) throws ServiceException { try { @@ -1171,6 +1174,7 @@ public class SClient4WPS extends SClient { } } + // TODO private void readOutputOfTypeData(Map outputParameters, Map outputResource, OutputDataType out, String outputID) { String value = ""; @@ -1198,10 +1202,10 @@ public class SClient4WPS extends SClient { paramComplexData.getDescription(), paramComplexData.getValue()); outputResource.put(outputID, resource); } - } else + } else { // remove the element name, which is not useful outputParameters.remove(outputID); - + } ComplexDataType cdt = out.getData().getComplexData(); LinkedHashMap urls = retrieveURLsFromWPSResponse(cdt); @@ -1214,88 +1218,7 @@ public class SClient4WPS extends SClient { logger.debug("ObjectParameter: " + objP); outputParameters.put(key, objP); if (responseWPS != null && responseWPS.getMimeType() != null) { - Resource resource; - switch (responseWPS.getMimeType()) { - case "image/bmp": - case "image/gif": - case "image/jpeg": - case "image/png": - resource = new ImageResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), responseWPS.getMimeType()); - outputResource.put(key, resource); - break; - case "text/csv": - if (responseWPS.getData() != null && !responseWPS.getData().isEmpty()) { - if (responseWPS.getData().startsWith("http:") - || responseWPS.getData().startsWith("https:") - || responseWPS.getData().startsWith("smp:")) { - - Parameter complexParameter = outputParameters.get(outputID); - if (complexParameter instanceof FileParameter) { - FileParameter fileParameter = (FileParameter) complexParameter; - if (fileParameter.isNetcdf()) { - resource = new FileResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), - responseWPS.getMimeType(), true); - } else { - resource = new FileResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), - responseWPS.getMimeType(), false); - } - } else { - resource = new FileResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), - responseWPS.getMimeType(), false); - } - outputResource.put(key, resource); - } else { - resource = new ObjectResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData()); - outputResource.put(key, resource); - } - } else { - resource = new ObjectResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData()); - outputResource.put(key, resource); - } - - break; - default: - if (responseWPS.getData() != null && !responseWPS.getData().isEmpty()) { - if (responseWPS.getData().startsWith("http:") - || responseWPS.getData().startsWith("https:") - || responseWPS.getData().startsWith("smp:")) { - Parameter complexParameter = outputParameters.get(outputID); - if (complexParameter instanceof FileParameter) { - FileParameter fileParameter = (FileParameter) complexParameter; - if (fileParameter.isNetcdf()) { - resource = new FileResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), - responseWPS.getMimeType(), true); - } else { - resource = new FileResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), - responseWPS.getMimeType(), false); - } - } else { - resource = new FileResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData(), - responseWPS.getMimeType(), false); - } - outputResource.put(key, resource); - } else { - resource = new ObjectResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData()); - outputResource.put(key, resource); - } - } else { - resource = new ObjectResource(key, responseWPS.getDescription(), - responseWPS.getDescription(), responseWPS.getData()); - outputResource.put(key, resource); - } - break; - } - + extractFileResource(outputParameters, outputResource, outputID, key, responseWPS); } } } else { @@ -1306,6 +1229,98 @@ public class SClient4WPS extends SClient { } } + private void extractFileResource(Map outputParameters, Map outputResource, + String outputID, String key, ResponseWPS responseWPS) { + Resource resource; + UriResolverUtils uriResolverUtils = new UriResolverUtils(); + + switch (responseWPS.getMimeType()) { + case "image/bmp": + case "image/gif": + case "image/jpeg": + case "image/png": + resource = new ImageResource(key, responseWPS.getDescription(), responseWPS.getDescription(), + responseWPS.getData(), responseWPS.getMimeType()); + outputResource.put(key, resource); + break; + case "text/csv": + if (responseWPS.getData() != null && !responseWPS.getData().isEmpty()) { + if (responseWPS.getData().startsWith("http:") || responseWPS.getData().startsWith("https:") + || responseWPS.getData().startsWith("smp:")) { + String fileName = null; + try { + fileName = uriResolverUtils.getFileName(responseWPS.getData()); + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + fileName = responseWPS.getDescription(); + } + Parameter complexParameter = outputParameters.get(outputID); + if (complexParameter instanceof FileParameter) { + FileParameter fileParameter = (FileParameter) complexParameter; + if (fileParameter.isNetcdf()) { + resource = new FileResource(key, fileName, responseWPS.getDescription(), + responseWPS.getData(), responseWPS.getMimeType(), true); + } else { + resource = new FileResource(key, fileName, responseWPS.getDescription(), + responseWPS.getData(), responseWPS.getMimeType(), false); + } + } else { + resource = new FileResource(key, fileName, responseWPS.getDescription(), responseWPS.getData(), + responseWPS.getMimeType(), false); + } + outputResource.put(key, resource); + } else { + resource = new ObjectResource(key, responseWPS.getDescription(), responseWPS.getDescription(), + responseWPS.getData()); + outputResource.put(key, resource); + } + } else { + resource = new ObjectResource(key, responseWPS.getDescription(), responseWPS.getDescription(), + responseWPS.getData()); + outputResource.put(key, resource); + } + + break; + default: + if (responseWPS.getData() != null && !responseWPS.getData().isEmpty()) { + if (responseWPS.getData().startsWith("http:") || responseWPS.getData().startsWith("https:") + || responseWPS.getData().startsWith("smp:")) { + String fileName = null; + try { + fileName = uriResolverUtils.getFileName(responseWPS.getData()); + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + fileName = responseWPS.getDescription(); + } + Parameter complexParameter = outputParameters.get(outputID); + if (complexParameter instanceof FileParameter) { + FileParameter fileParameter = (FileParameter) complexParameter; + if (fileParameter.isNetcdf()) { + resource = new FileResource(key, fileName, responseWPS.getDescription(), + responseWPS.getData(), responseWPS.getMimeType(), true); + } else { + resource = new FileResource(key, fileName, responseWPS.getDescription(), + responseWPS.getData(), responseWPS.getMimeType(), false); + } + } else { + resource = new FileResource(key, fileName, responseWPS.getDescription(), responseWPS.getData(), + responseWPS.getMimeType(), false); + } + outputResource.put(key, resource); + } else { + resource = new ObjectResource(key, responseWPS.getDescription(), responseWPS.getDescription(), + responseWPS.getData()); + outputResource.put(key, resource); + } + } else { + resource = new ObjectResource(key, responseWPS.getDescription(), responseWPS.getDescription(), + responseWPS.getData()); + outputResource.put(key, resource); + } + break; + } + } + @Override public String cancelComputation(ComputationId computationId) throws ServiceException { SClient4WPSSession wpsClient = null; diff --git a/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/is/InformationSystemUtils.java b/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/is/InformationSystemUtils.java index 223489c..fa64a0d 100644 --- a/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/is/InformationSystemUtils.java +++ b/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/is/InformationSystemUtils.java @@ -1,6 +1,6 @@ package org.gcube.data.analysis.dataminermanagercl.server.is; -import java.util.LinkedHashMap; +import java.util.ArrayList; import java.util.List; import org.gcube.common.resources.gcore.ServiceEndpoint; @@ -9,6 +9,7 @@ import org.gcube.common.resources.gcore.ServiceEndpoint.Property; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.data.analysis.dataminermanagercl.shared.Constants; import org.gcube.data.analysis.dataminermanagercl.shared.exception.ServiceException; +import org.gcube.data.analysis.dataminermanagercl.shared.service.ServiceInfoData; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.resources.discovery.icclient.ICFactory; @@ -23,6 +24,7 @@ import org.slf4j.LoggerFactory; */ public class InformationSystemUtils { + private static Logger logger = LoggerFactory.getLogger(InformationSystemUtils.class); public static String retrieveServiceAddress(String category, String name, String scope) throws Exception { @@ -50,12 +52,12 @@ public class InformationSystemUtils { String address = addresses.get(0); int wpsWebProcessingServiceIndex = address.indexOf(Constants.WPSWebProcessingService); - String serviceAddress=null; + String serviceAddress = null; if (wpsWebProcessingServiceIndex > 0) { serviceAddress = address.substring(0, wpsWebProcessingServiceIndex); } else { - logger.error("Invalid DataMiner service url retrieved: "+address); - throw new ServiceException("Invalid DataMiner service url retrieved: "+address); + logger.error("Invalid DataMiner service url retrieved: " + address); + throw new ServiceException("Invalid DataMiner service url retrieved: " + address); } logger.info("DataMiner service address found: " + serviceAddress); return serviceAddress; @@ -67,11 +69,11 @@ public class InformationSystemUtils { } } - public static LinkedHashMap retrieveServiceProperties(String category, String name, String scope) + public static ArrayList retrieveServiceProperties(String category, String name, String scope) throws Exception { try { logger.debug("Retrieve Service Properties"); - LinkedHashMap serviceProperties = new LinkedHashMap<>(); + ArrayList serviceProperties = new ArrayList<>(); if (scope == null || scope.length() == 0) return serviceProperties; @@ -86,20 +88,32 @@ public class InformationSystemUtils { if (accessPointList != null && !accessPointList.isEmpty()) { AccessPoint accessPoint = accessPointList.get(0); - if(accessPoint.address()!=null&&!accessPoint.address().isEmpty()){ - String accessPointAddress=accessPoint.address(); + if (accessPoint.address() != null && !accessPoint.address().isEmpty()) { + String accessPointAddress = accessPoint.address(); int wpsWebProcessingServiceIndex = accessPointAddress.indexOf(Constants.WPSWebProcessingService); if (wpsWebProcessingServiceIndex > 0) { String address = accessPointAddress.substring(0, wpsWebProcessingServiceIndex); - serviceProperties.put("Address", address); + serviceProperties.add(new ServiceInfoData("Address", address, Constants.DEFAULT_SERVICE_INFO_CATEGORY)); } } - - + if (accessPoint.properties() != null && !accessPoint.propertyMap().isEmpty()) { for (String key : accessPoint.propertyMap().keySet()) { Property property = accessPoint.propertyMap().get(key); - serviceProperties.put(property.name(), property.value()); + if (property != null&&property.name() != null && !property.name().isEmpty()){ + if(property.name().contains(":")) { + String[] propertyWithCategory=property.name().split(":"); + if(propertyWithCategory.length>=2){ + serviceProperties.add(new ServiceInfoData(propertyWithCategory[1],property.value(),propertyWithCategory[0])); + } else { + serviceProperties.add(new ServiceInfoData(property.name(), property.value(), Constants.DEFAULT_SERVICE_INFO_CATEGORY)); + } + } else { + serviceProperties.add(new ServiceInfoData(property.name(), property.value(), Constants.DEFAULT_SERVICE_INFO_CATEGORY)); + } + } + + } } diff --git a/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/uriresolver/UriResolverUtils.java b/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/uriresolver/UriResolverUtils.java new file mode 100644 index 0000000..1839077 --- /dev/null +++ b/src/main/java/org/gcube/data/analysis/dataminermanagercl/server/uriresolver/UriResolverUtils.java @@ -0,0 +1,64 @@ +package org.gcube.data.analysis.dataminermanagercl.server.uriresolver; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class UriResolverUtils { + private static Logger logger = LoggerFactory.getLogger(UriResolverUtils.class); + + public String getFileName(String publicLink) throws ServiceException { + logger.info("Public Link: " + publicLink); + try { + + URL urlObj = new URL(publicLink); + HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); + connection.setRequestMethod("HEAD"); + connection.setDoOutput(true); + logger.info("Response Code:" + connection.getResponseCode()); + + String fileName = null; + List contentDisposition = connection.getHeaderFields().get("Content-Disposition"); + logger.info("Content-Disposition: " + contentDisposition); + if (contentDisposition != null && !contentDisposition.isEmpty()) { + for (String value : contentDisposition) { + if (value != null && !value.isEmpty() && value.startsWith("attachment; filename=")) { + fileName = value.substring(21); + if (fileName != null && !fileName.isEmpty()) { + fileName = fileName.replace("\"", ""); + logger.info("File name: " + fileName); + break; + } + } + } + + } + + if (fileName == null || fileName.isEmpty()) { + logger.error("Error retrieving filename from URI Resolver for public link: " + publicLink); + throw new ServiceException( + "Error retrieving filename from URI Resolver for public link: " + publicLink); + } + return fileName; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving filename from URI Resolver for public link: " + publicLink); + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException("Error retrieving filename from URI Resolver for url: " + publicLink, e); + } + } + +} diff --git a/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/Constants.java b/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/Constants.java index d179601..3d38a5a 100644 --- a/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/Constants.java +++ b/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/Constants.java @@ -14,9 +14,15 @@ public class Constants { public final static String DEFAULT_SCOPE = "/gcube/devNext/NextNext"; public final static String DEFAULT_TOKEN = ""; + public static final String DEFAULT_ROLE = "OrganizationMember"; + + //Data Miner Service Endpoint public static final String DATAMINER_SERVICE_CATEGORY = "DataAnalysis"; public static final String DATA_MINER_SERVICE_NAME = "DataMiner"; - + + //Default Service Info Category + public static final String DEFAULT_SERVICE_INFO_CATEGORY = "Generic"; + // WPS Data Miner public static final String WPSWebProcessingService = "WebProcessingService"; public static final String WPSCancelComputationServlet = "CancelComputationServlet"; diff --git a/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfo.java b/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfo.java index d360f48..2cd3f4b 100644 --- a/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfo.java +++ b/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfo.java @@ -1,7 +1,7 @@ package org.gcube.data.analysis.dataminermanagercl.shared.service; import java.io.Serializable; -import java.util.LinkedHashMap; +import java.util.ArrayList; /** * @@ -12,22 +12,22 @@ import java.util.LinkedHashMap; public class ServiceInfo implements Serializable { private static final long serialVersionUID = 9046784925213335261L; - private LinkedHashMap serviceProperties; + private ArrayList serviceProperties; public ServiceInfo() { super(); } - public ServiceInfo(LinkedHashMap serviceProperties) { + public ServiceInfo(ArrayList serviceProperties) { super(); this.serviceProperties = serviceProperties; } - public LinkedHashMap getServiceProperties() { + public ArrayList getServiceProperties() { return serviceProperties; } - public void setServiceProperties(LinkedHashMap serviceProperties) { + public void setServiceProperties(ArrayList serviceProperties) { this.serviceProperties = serviceProperties; } diff --git a/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfoData.java b/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfoData.java new file mode 100644 index 0000000..89da98d --- /dev/null +++ b/src/main/java/org/gcube/data/analysis/dataminermanagercl/shared/service/ServiceInfoData.java @@ -0,0 +1,58 @@ +package org.gcube.data.analysis.dataminermanagercl.shared.service; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ServiceInfoData implements Serializable { + + private static final long serialVersionUID = 4732143678328978038L; + private String key; + private String value; + private String category; + + public ServiceInfoData() { + super(); + } + + public ServiceInfoData(String key, String value, String category) { + super(); + this.key = key; + this.value = value; + this.category = category; + } + + 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; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + @Override + public String toString() { + return "ServiceInfoData [key=" + key + ", value=" + value + ", category=" + category + "]"; + } + +} diff --git a/src/test/java/org/gcube/data/analysis/dataminermanagercl/test/URIResolverQueryTest.java b/src/test/java/org/gcube/data/analysis/dataminermanagercl/test/URIResolverQueryTest.java new file mode 100644 index 0000000..da429c7 --- /dev/null +++ b/src/test/java/org/gcube/data/analysis/dataminermanagercl/test/URIResolverQueryTest.java @@ -0,0 +1,43 @@ +package org.gcube.data.analysis.dataminermanagercl.test; + +import org.gcube.data.analysis.dataminermanagercl.server.uriresolver.UriResolverUtils; +import org.gcube.data.analysis.dataminermanagercl.shared.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import junit.framework.TestCase; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class URIResolverQueryTest extends TestCase { + private static Logger logger = LoggerFactory.getLogger(URIResolverQueryTest.class); + + public void testUriResolver() { + + if (Constants.TEST_ENABLE) { + logger.info("Test URI Resolver"); + try { + + String publicLink = "https://data-dev.d4science.net/CyUd"; + + logger.debug("PublicLink: " + publicLink); + + UriResolverUtils uriResolverUtils = new UriResolverUtils(); + uriResolverUtils.getFileName(publicLink); + assertTrue("Success", true); + + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + assertTrue("Error", false); + } + + } else { + assertTrue("Success", true); + } + } + +}