From 321ecc49d13656df968e41437acace38dff64366 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 7 Jun 2018 09:32:36 +0000 Subject: [PATCH] Added the method getOutuput git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/Common/workspace-task-executor-library@167910 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../dataminer/DMConverter.java | 93 ++++++++++++++++ .../dataminer/DataMinerAccessPoint.java | 93 +++++++++++----- .../WorkspaceDataMinerTaskExecutor.java | 18 ++++ .../shared/BaseTaskOutput.java | 32 ++++++ .../shared/TaskOutput.java | 101 ++++++++++++++++++ 5 files changed, 312 insertions(+), 25 deletions(-) create mode 100644 src/main/java/org/gcube/common/workspacetaskexecutor/shared/BaseTaskOutput.java create mode 100644 src/main/java/org/gcube/common/workspacetaskexecutor/shared/TaskOutput.java diff --git a/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DMConverter.java b/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DMConverter.java index 9c9ec0e..358ad35 100644 --- a/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DMConverter.java +++ b/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DMConverter.java @@ -3,14 +3,22 @@ */ package org.gcube.common.workspacetaskexecutor.dataminer; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.gcube.common.workspacetaskexecutor.shared.TaskOperator; import org.gcube.common.workspacetaskexecutor.shared.TaskParameter; import org.gcube.common.workspacetaskexecutor.shared.TaskParameterType; import org.gcube.common.workspacetaskexecutor.shared.dataminer.TaskComputation; import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ImageResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.TableResource; import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ColumnListParameter; import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ColumnParameter; import org.gcube.data.analysis.dataminermanagercl.shared.parameters.DateParameter; @@ -249,4 +257,89 @@ public class DMConverter { return null; } } + + + /** + * Append output. + * + * @param builder the builder + * @param key the key + * @param res the res + */ + public static void appendOutput(StringBuilder builder, String key, Resource res){ + + switch (res.getResourceType()) { + case FILE: + FileResource fileResource = (FileResource) res; + String fileName=retrieveFileName(fileResource.getUrl()); + logger.debug("Entry: " + key + " = "+ fileResource+", FileName="+fileName); + builder.append("Entry: " + key + " = "+fileResource+", FileName="+fileName); + break; + case IMAGE: + ImageResource imageResource = (ImageResource) res; + String imageName=retrieveFileName(imageResource.getLink()); + logger.debug("Entry: " + key + " = "+ imageResource+", ImageName="+imageName); + builder.append("Entry: " + key + " = "+ imageResource+", ImageName="+imageName); + break; + case MAP: + logger.debug("Entry: " + key + " = "+ res); + builder.append("Entry: " + key + " = "+ res); + break; + case OBJECT: + logger.debug("Entry: " + key + " = "+ res); + builder.append("Entry: " + key + " = "+ res); + break; + case TABULAR: + TableResource tableResource = (TableResource) res; + String tableName=retrieveFileName(tableResource.getResourceId()); + logger.debug("Entry: " + key + " = "+ tableResource+", TableName="+tableName); + builder.append("Entry: " + key + " = "+tableResource+", TableName="+tableName); + break; + default: + logger.debug("Entry: " + key + " = "+ res); + builder.append("Entry: " + key + " = "+ res); + break; + + } + + } + + /** + * Retrieve file name. + * provided by Giancarlo + * @param url the url + * @return the string + */ + private static String retrieveFileName(String url) { + String fileName = "output"; + + try { + + URL urlObj; + urlObj = new URL(url); + + HttpURLConnection connection = (HttpURLConnection) urlObj + .openConnection(); + connection.setRequestMethod("GET"); + String contentDisposition = connection + .getHeaderField("Content-Disposition"); + Pattern regex = Pattern.compile("(?<=filename=\").*?(?=\")"); + Matcher regexMatcher = regex.matcher(contentDisposition); + if (regexMatcher.find()) { + fileName = regexMatcher.group(); + } + + if (fileName == null || fileName.isEmpty()) { + fileName = "output"; + } + + return fileName; + } catch (Throwable e) { + logger.error( + "Error retrieving file name: " + e.getLocalizedMessage(), e); + return fileName; + } + + } + } diff --git a/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DataMinerAccessPoint.java b/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DataMinerAccessPoint.java index ffe6aed..7a93304 100644 --- a/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DataMinerAccessPoint.java +++ b/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/DataMinerAccessPoint.java @@ -11,6 +11,7 @@ import java.util.Map; import org.gcube.common.workspacetaskexecutor.shared.BaseTaskConfiguration; import org.gcube.common.workspacetaskexecutor.shared.TaskOperator; +import org.gcube.common.workspacetaskexecutor.shared.TaskOutput; import org.gcube.common.workspacetaskexecutor.shared.TaskParameter; import org.gcube.common.workspacetaskexecutor.shared.TaskParameterType; import org.gcube.common.workspacetaskexecutor.shared.TaskStatus; @@ -183,16 +184,17 @@ public class DataMinerAccessPoint { TaskExecutionStatus tes = loadTaskExecutionStatus(taskConfiguration, taskComputation); - switch (tes.getStatus()) { - case COMPLETED: - case CANCELLED: - case FAILED: - logger.info("Removing "+tes+ "from memory"); - removeTaskFromMemory(tes.getTaskConfiguration()); - break; - default: - break; - } + //MOVED INTO METHOD getOutput +// switch (tes.getStatus()) { +// case COMPLETED: +// case CANCELLED: +// case FAILED: +// logger.info("Removing "+tes+ "from memory"); +// removeTaskFromMemory(tes.getTaskConfiguration()); +// break; +// default: +// break; +// } return tes; } @@ -297,43 +299,83 @@ public class DataMinerAccessPoint { } + /** + * Gets the output. + * + * @param taskConfiguration the task configuration + * @param taskComputation the task computation + * @return the output + * @throws TaskErrorException the task error exception + * @throws TaskNotExecutableException the task not executable exception + */ + public TaskOutput getOutput(TaskConfiguration taskConfiguration, TaskComputation taskComputation) throws TaskErrorException, TaskNotExecutableException { + + TaskExecutionStatus tes = monitorStatus(taskConfiguration, taskComputation); + + SClient sClient; + ComputationId computationId = DMConverter.toComputationId(taskComputation); + try { + String token = EncrypterUtil.decryptString(taskConfiguration.getMaskedToken()); + sClient = dataMinerService.getClient(token); + } + catch (Exception e) { + logger.error("Error on get DM client", e); + throw new TaskErrorException("Error on getting DataMiner client, Try later"); + } + + String outputMessage = retrieveOutput(computationId, sClient); + + //REMOVING THE TASK FROM MEMORY + switch (tes.getStatus()) { + case COMPLETED: + case CANCELLED: + case FAILED: + logger.info("Removing "+tes+ "from memory"); + removeTaskFromMemory(tes.getTaskConfiguration()); + break; + default: + break; + } + + return new TaskOutput(tes, outputMessage); + } + /** * Retrieve output. + * provided by Giancarlo * * @param computationId the computation id * @param sClient the s client * @return the string + * @throws TaskErrorException the task error exception */ - private String retrieveOutput(ComputationId computationId, SClient sClient) { - StringBuilder builder = new StringBuilder(); + private String retrieveOutput(ComputationId computationId, SClient sClient) throws TaskErrorException { try { - + StringBuilder builder = new StringBuilder(); OutputData output = sClient.getOutputDataByComputationId(computationId); logger.debug("Output: " + output); - builder.append("Output: " + output); Resource resource = output.getResource(); + if (resource.isMap()) { MapResource mapResource = (MapResource) resource; for (String key : mapResource.getMap().keySet()) { - logger.debug("Entry: " + key + " = "+ mapResource.getMap().get(key)); - builder.append("Entry: " + key + " = "+ mapResource.getMap().get(key)); + Resource res = mapResource.getMap().get(key); + DMConverter.appendOutput(builder, key, res); } - - } else { - + }else{ + DMConverter.appendOutput(builder, "", resource); } - + return builder.toString(); } catch (Exception e) { - logger.error(e.getLocalizedMessage()); - e.printStackTrace(); + logger.error("Error on retrieve the output for computationId: "+computationId, e); + throw new TaskErrorException("Error on retrieve the output for computationId: "+computationId); } - - return builder.toString(); - } + + /** * Adds the parameters to operator. * @@ -422,4 +464,5 @@ public class DataMinerAccessPoint { } + } diff --git a/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/WorkspaceDataMinerTaskExecutor.java b/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/WorkspaceDataMinerTaskExecutor.java index a340d09..4334f07 100644 --- a/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/WorkspaceDataMinerTaskExecutor.java +++ b/src/main/java/org/gcube/common/workspacetaskexecutor/dataminer/WorkspaceDataMinerTaskExecutor.java @@ -8,6 +8,7 @@ import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.workspacetaskexecutor.shared.ExecutableItem; import org.gcube.common.workspacetaskexecutor.shared.ExecutableTask; import org.gcube.common.workspacetaskexecutor.shared.TaskOperator; +import org.gcube.common.workspacetaskexecutor.shared.TaskOutput; import org.gcube.common.workspacetaskexecutor.shared.TaskParameterType; import org.gcube.common.workspacetaskexecutor.shared.dataminer.TaskComputation; import org.gcube.common.workspacetaskexecutor.shared.dataminer.TaskConfiguration; @@ -401,4 +402,21 @@ public class WorkspaceDataMinerTaskExecutor implements ExecutableTask