You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ch...@apache.org on 2014/02/21 23:15:29 UTC

git commit: adding more methods to registry cpi impl AIRAVATA-1006

Repository: airavata
Updated Branches:
  refs/heads/master 16d6d176a -> 84622574a


adding more methods to registry cpi impl AIRAVATA-1006


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/84622574
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/84622574
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/84622574

Branch: refs/heads/master
Commit: 84622574a8013dea0e302f2a24f86bd3a58a7bf8
Parents: 16d6d17
Author: chathuri <ch...@apache.org>
Authored: Fri Feb 21 17:15:23 2014 -0500
Committer: chathuri <ch...@apache.org>
Committed: Fri Feb 21 17:15:23 2014 -0500

----------------------------------------------------------------------
 .../registry/jpa/impl/ExperimentRegistry.java   | 207 ++++++++++++++++++-
 .../registry/jpa/impl/RegistryImpl.java         |  37 ++--
 .../jpa/resources/JobDetailResource.java        |   2 +
 .../jpa/resources/TaskDetailResource.java       |  10 +
 .../resources/WorkflowNodeDetailResource.java   |   4 +
 5 files changed, 234 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/84622574/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
index 6906028..17e4d7b 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
@@ -95,7 +95,7 @@ public class ExperimentRegistry {
             configData.setAiravataAutoSchedule(configurationData.isAiravataAutoSchedule());
             configData.setOverrideManualParams(configurationData.isOverrideManualScheduledParams());
             configData.setShareExp(configurationData.isShareExperimentPublicly());
-
+            configData.save();
             ComputationalResourceScheduling resourceScheduling = configurationData.getComputationalResourceScheduling();
             if (resourceScheduling != null) {
                 addComputationScheduling(resourceScheduling, experiment);
@@ -114,7 +114,6 @@ public class ExperimentRegistry {
             if (qosParams != null) {
                 addQosParams(qosParams,experiment);
             }
-            configData.save();
         } catch (ApplicationSettingsException e) {
             logger.error("Unable to read airavata-server properties", e.getMessage());
         }catch (Exception e){
@@ -220,7 +219,7 @@ public class ExperimentRegistry {
         }
     }
 
-    public String addExpOuputs (List<DataObjectType> exOutput, String expId ) {
+    public String addExpOutputs(List<DataObjectType> exOutput, String expId) {
         try {
             gatewayRegistry = new GatewayRegistry();
             GatewayResource gateway = gatewayRegistry.getDefaultGateway();
@@ -240,6 +239,49 @@ public class ExperimentRegistry {
         return expId;
     }
 
+    public String addNodeOutputs (List<DataObjectType> wfOutputs, CompositeIdentifier ids ) {
+        try {
+            gatewayRegistry = new GatewayRegistry();
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = gateway.getExperiment((String)ids.getTopLevelIdentifier());
+            WorkflowNodeDetailResource workflowNode = experiment.getWorkflowNode((String) ids.getSecondLevelIdentifier());
+            for (DataObjectType output : wfOutputs) {
+                NodeOutputResource resource = (NodeOutputResource) workflowNode.create(ResourceType.NODE_OUTPUT);
+                resource.setNodeDetailResource(workflowNode);
+                resource.setOutputKey(output.getKey());
+                resource.setValue(output.getValue());
+                resource.setOutputType(output.getType());
+                resource.setMetadata(output.getMetaData());
+                resource.save();
+            }
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server properties", e.getMessage());
+        }
+        return (String)ids.getSecondLevelIdentifier();
+    }
+
+    public String addApplicationOutputs (List<DataObjectType> appOutputs, CompositeIdentifier ids ) {
+        try {
+            gatewayRegistry = new GatewayRegistry();
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = (ExperimentResource)gateway.create(ResourceType.EXPERIMENT);
+            WorkflowNodeDetailResource workflowNode = experiment.getWorkflowNode((String) ids.getTopLevelIdentifier());
+            TaskDetailResource taskDetail = workflowNode.getTaskDetail((String) ids.getSecondLevelIdentifier());
+            for (DataObjectType output : appOutputs) {
+                ApplicationOutputResource resource = (ApplicationOutputResource) taskDetail.create(ResourceType.APPLICATION_OUTPUT);
+                resource.setTaskDetailResource(taskDetail);
+                resource.setOutputKey(output.getKey());
+                resource.setValue(output.getValue());
+                resource.setOutputType(output.getType());
+                resource.setMetadata(output.getMetaData());
+                resource.save();
+            }
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server properties", e.getMessage());
+        }
+        return (String)ids.getSecondLevelIdentifier();
+    }
+
     public String updateExperimentStatus (ExperimentStatus experimentStatus, String expId){
         try{
             gatewayRegistry = new GatewayRegistry();
@@ -260,17 +302,102 @@ public class ExperimentRegistry {
         return expId;
     }
 
-    public void addWorkflowNodeStatus(WorkflowNodeStatus status, String nodeId) {
+    public String addWorkflowNodeStatus(WorkflowNodeStatus status, CompositeIdentifier ids) {
+        try {
+            gatewayRegistry = new GatewayRegistry();
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = gateway.getExperiment((String)ids.getTopLevelIdentifier());
+            WorkflowNodeDetailResource workflowNode = experiment.getWorkflowNode((String) ids.getSecondLevelIdentifier());
+            StatusResource statusResource = (StatusResource)experiment.create(ResourceType.STATUS);
+            statusResource.setExperimentResource(experiment);
+            statusResource.setWorkflowNodeDetail(workflowNode);
+            statusResource.setStatusType(StatusType.WORKFLOW_NODE.toString());
+            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setState(status.getWorkflowNodeState().toString());
+            statusResource.save();
+            return String.valueOf(statusResource.getStatusId());
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server properties", e.getMessage());
+        }
+        return null;
+    }
+
+    public String addTaskStatus(TaskStatus status, CompositeIdentifier ids) {
         try {
             gatewayRegistry = new GatewayRegistry();
             GatewayResource gateway = gatewayRegistry.getDefaultGateway();
-//            ExperimentResource experiment = gateway.getExperiment(expId);
-//            StatusResource resource = (StatusResource)experiment.create(ResourceType.STATUS);
+            ExperimentResource experiment = (ExperimentResource)gateway.create(ResourceType.EXPERIMENT);
+            WorkflowNodeDetailResource workflowNode = experiment.getWorkflowNode((String) ids.getTopLevelIdentifier());
+            TaskDetailResource taskDetail = workflowNode.getTaskDetail((String) ids.getSecondLevelIdentifier());
+            StatusResource statusResource = (StatusResource)workflowNode.create(ResourceType.STATUS);
+            statusResource.setExperimentResource(workflowNode.getExperimentResource());
+            statusResource.setWorkflowNodeDetail(workflowNode);
+            statusResource.setTaskDetailResource(taskDetail);
+            statusResource.setStatusType(StatusType.TASK.toString());
+            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setState(status.getExecutionState().toString());
+            statusResource.save();
+            return String.valueOf(statusResource.getStatusId());
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server properties", e.getMessage());
+        }
+        return null;
+    }
 
+    /**
+     * composite id will contain taskid and jobid
+     * @param status
+     * @param ids
+     * @return
+     */
+    public String addJobStatus(JobStatus status, CompositeIdentifier ids) {
+        try {
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = (ExperimentResource)gateway.create(ResourceType.EXPERIMENT);
+            WorkflowNodeDetailResource workflowNode = (WorkflowNodeDetailResource)experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
+            TaskDetailResource taskDetail = workflowNode.getTaskDetail((String) ids.getTopLevelIdentifier());
+            JobDetailResource jobDetail = taskDetail.getJobDetail((String) ids.getSecondLevelIdentifier());
+            StatusResource statusResource = (StatusResource)jobDetail.create(ResourceType.STATUS);
+            statusResource.setExperimentResource(taskDetail.getWorkflowNodeDetailResource().getExperimentResource());
+            statusResource.setWorkflowNodeDetail(taskDetail.getWorkflowNodeDetailResource());
+            statusResource.setTaskDetailResource(taskDetail);
+            statusResource.setStatusType(StatusType.JOB.toString());
+            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setState(status.getJobState().toString());
+            statusResource.save();
+            return String.valueOf(statusResource.getStatusId());
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server properties", e.getMessage());
+        }
+        return null;
+    }
 
+    /**
+     * composite id will contain taskid and jobid
+     * @param status
+     * @param ids
+     * @return
+     */
+    public String addApplicationStatus(ApplicationStatus status, CompositeIdentifier ids) {
+        try {
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = (ExperimentResource)gateway.create(ResourceType.EXPERIMENT);
+            WorkflowNodeDetailResource workflowNode = (WorkflowNodeDetailResource)experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
+            TaskDetailResource taskDetail = workflowNode.getTaskDetail((String) ids.getTopLevelIdentifier());
+            JobDetailResource jobDetail = taskDetail.getJobDetail((String) ids.getSecondLevelIdentifier());
+            StatusResource statusResource = (StatusResource)jobDetail.create(ResourceType.STATUS);
+            statusResource.setExperimentResource(taskDetail.getWorkflowNodeDetailResource().getExperimentResource());
+            statusResource.setWorkflowNodeDetail(taskDetail.getWorkflowNodeDetailResource());
+            statusResource.setTaskDetailResource(taskDetail);
+            statusResource.setStatusType(StatusType.APPLICATION.toString());
+            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setState(status.getApplicationState());
+            statusResource.save();
+            return String.valueOf(statusResource.getStatusId());
         } catch (ApplicationSettingsException e) {
             logger.error("Unable to read airavata-server properties", e.getMessage());
         }
+        return null;
     }
 
     public String addWorkflowNodeDetails (WorkflowNodeDetails nodeDetails, String expId) {
@@ -284,6 +411,10 @@ public class ExperimentRegistry {
             resource.setCreationTime(getTime(nodeDetails.getCreationTime()));
             resource.setNodeInstanceId(getNodeInstanceID(nodeDetails.getNodeName()));
             resource.save();
+            List<DataObjectType> nodeInputs = nodeDetails.getNodeInputs();
+            if (nodeInputs != null){
+                addWorkflowInputs (nodeDetails.getNodeInputs(), resource);
+            }
             return resource.getNodeInstanceId();
         } catch (ApplicationSettingsException e) {
             e.printStackTrace();
@@ -291,6 +422,19 @@ public class ExperimentRegistry {
         return null;
     }
 
+
+    public void addWorkflowInputs (List<DataObjectType> wfInputs, WorkflowNodeDetailResource nodeDetailResource ){
+        for (DataObjectType input : wfInputs){
+            NodeInputResource resource = (NodeInputResource)nodeDetailResource.create(ResourceType.NODE_INPUT);
+            resource.setNodeDetailResource(nodeDetailResource);
+            resource.setInputKey(input.getKey());
+            resource.setValue(input.getValue());
+            resource.setInputType(input.getType());
+            resource.setMetadata(input.getMetaData());
+            resource.save();
+        }
+    }
+
     public String addTaskDetails (TaskDetails taskDetails, String nodeId) {
         try {
             gatewayRegistry = new GatewayRegistry();
@@ -303,6 +447,7 @@ public class ExperimentRegistry {
             taskDetail.setApplicationId(taskDetails.getApplicationId());
             taskDetail.setApplicationVersion(taskDetails.getApplicationVersion());
             taskDetail.setCreationTime(getTime(taskDetails.getCreationTime()));
+            taskDetail.save();
             List<DataObjectType> applicationInputs = taskDetails.getApplicationInputs();
             if (applicationInputs != null){
                 addAppInputs(applicationInputs, taskDetail);
@@ -338,6 +483,52 @@ public class ExperimentRegistry {
         }
     }
 
+    public String addJobDetails (JobDetails jobDetails, CompositeIdentifier ids) {
+        try {
+            gatewayRegistry = new GatewayRegistry();
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = (ExperimentResource)gateway.create(ResourceType.EXPERIMENT);
+            WorkflowNodeDetailResource workflowNode = (WorkflowNodeDetailResource)experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
+            TaskDetailResource taskDetail = workflowNode.getTaskDetail((String) ids.getTopLevelIdentifier());
+            JobDetailResource jobDetail = taskDetail.createJobDetail((String) ids.getSecondLevelIdentifier());
+            jobDetail.setTaskDetailResource(taskDetail);
+            jobDetail.setJobDescription(jobDetails.getJobDescription());
+            jobDetail.setCreationTime(getTime(jobDetails.getCreationTime()));
+            jobDetail.setComputeResourceConsumed(jobDetails.getComputeResourceConsumed());
+            jobDetail.save();
+            return jobDetail.getJobId();
+        } catch (ApplicationSettingsException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     *
+     * @param transferDetails
+     * @param taskId
+     * @return
+     */
+    public String addDataTransferDetails (DataTransferDetails transferDetails, String taskId) {
+        try {
+            gatewayRegistry = new GatewayRegistry();
+            GatewayResource gateway = gatewayRegistry.getDefaultGateway();
+            ExperimentResource experiment = (ExperimentResource)gateway.create(ResourceType.EXPERIMENT);
+            WorkflowNodeDetailResource workflowNode = (WorkflowNodeDetailResource)experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
+            TaskDetailResource taskDetail = workflowNode.getTaskDetail(taskId);
+            DataTransferDetailResource resource = (DataTransferDetailResource)taskDetail.create(ResourceType.DATA_TRANSFER_DETAIL);
+            resource.setTaskDetailResource(taskDetail);
+            resource.setTransferId(getDataTransferID(taskId));
+            resource.setTransferDescription(transferDetails.getTransferDescription());
+            resource.setCreationTime(getTime(transferDetails.getCreationTime()));
+            resource.save();
+            return resource.getTransferId();
+        } catch (ApplicationSettingsException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     public String getNodeInstanceID(String nodeName) {
         return nodeName + "_" + UUID.randomUUID();
     }
@@ -350,6 +541,10 @@ public class ExperimentRegistry {
         return nodeName + "_" + UUID.randomUUID();
     }
 
+    public String getDataTransferID (String taskId){
+        return taskId + "_" + UUID.randomUUID();
+    }
+
     public void updateExperimentField(String expID, String fieldName, Object value) {
         try {
             GatewayResource gateway = gatewayRegistry.getDefaultGateway();

http://git-wip-us.apache.org/repos/asf/airavata/blob/84622574/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
index 7787668..7d5c185 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
@@ -22,10 +22,7 @@
 package org.apache.airavata.persistance.registry.jpa.impl;
 
 import org.apache.airavata.model.workspace.experiment.*;
-import org.apache.airavata.registry.cpi.ChildDataType;
-import org.apache.airavata.registry.cpi.DataType;
-import org.apache.airavata.registry.cpi.ParentDataType;
-import org.apache.airavata.registry.cpi.Registry;
+import org.apache.airavata.registry.cpi.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,31 +70,31 @@ public class RegistryImpl implements Registry {
             case EXPERIMENT_CONFIGURATION_DATA:
                 return experimentRegistry.addUserConfigData((UserConfigurationData) newObjectToAdd, (String)dependentIdentifier);
             case EXPERIMENT_OUTPUT:
-                return experimentRegistry.addExpOuputs((List<DataObjectType>)newObjectToAdd, (String)dependentIdentifier);
+                return experimentRegistry.addExpOutputs((List<DataObjectType>) newObjectToAdd, (String) dependentIdentifier);
             case EXPERIMENT_STATUS:
                 return experimentRegistry.updateExperimentStatus((ExperimentStatus)newObjectToAdd, (String)dependentIdentifier);
             case WORKFLOW_NODE_DETAIL:
                 return experimentRegistry.addWorkflowNodeDetails((WorkflowNodeDetails)newObjectToAdd, (String)dependentIdentifier);
+            case WORKFLOW_NODE_STATUS:
+                return experimentRegistry.addWorkflowNodeStatus((WorkflowNodeStatus)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
+            case NODE_OUTPUT:
+                return experimentRegistry.addNodeOutputs((List<DataObjectType>)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
             case TASK_DETAIL:
                 return experimentRegistry.addTaskDetails((TaskDetails)newObjectToAdd, (String)dependentIdentifier);
-            case WORKFLOW_NODE_STATUS:
-                // no thrift model yet
-                break;
             case APPLICATION_OUTPUT:
-                // no thrift model yet
-                break;
-            case NODE_INPUT:
-                // no thrift model yet
-                break;
+                return experimentRegistry.addApplicationOutputs((List<DataObjectType>)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
+            case TASK_STATUS:
+                return experimentRegistry.addTaskStatus((TaskStatus)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
             case JOB_DETAIL:
-                // no thrift model yet
-                break;
+                return experimentRegistry.addJobDetails((JobDetails)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
+            case JOB_STATUS:
+                return experimentRegistry.addJobStatus((JobStatus)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
+            case APPLICATION_STATUS:
+                return experimentRegistry.addApplicationStatus((ApplicationStatus)newObjectToAdd, (CompositeIdentifier)dependentIdentifier);
             case DATA_TRANSFER_DETAIL:
-                // no thrift model yet
-                break;
-            case ADVANCE_INPUT_DATA_HANDLING:
-                // no thrift model yet
-                break;
+                return experimentRegistry.addDataTransferDetails((DataTransferDetails)newObjectToAdd, (String)dependentIdentifier);
+            case TRANSFER_STATUS:
+
             case COMPUTATIONAL_RESOURCE_SCHEDULING:
                 // no thrift model yet
                 break;

http://git-wip-us.apache.org/repos/asf/airavata/blob/84622574/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/JobDetailResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/JobDetailResource.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/JobDetailResource.java
index cf9be66..6bdebb9 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/JobDetailResource.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/JobDetailResource.java
@@ -270,4 +270,6 @@ public class JobDetailResource extends AbstractResource {
         }
         return errorDetailResources;
     }
+
+
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/84622574/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/TaskDetailResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/TaskDetailResource.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/TaskDetailResource.java
index d64c05c..60c3651 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/TaskDetailResource.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/TaskDetailResource.java
@@ -521,4 +521,14 @@ public class TaskDetailResource extends AbstractResource {
         return  (AdvancedOutputDataHandlingResource)get(ResourceType.ADVANCE_OUTPUT_DATA_HANDLING, taskId);
     }
 
+    public JobDetailResource createJobDetail (String jobId){
+        JobDetailResource resource = (JobDetailResource)create(ResourceType.JOB_DETAIL);
+        resource.setJobId(jobId);
+        return resource;
+    }
+
+    public JobDetailResource getJobDetail (String jobId){
+        return (JobDetailResource)get(ResourceType.JOB_DETAIL, jobId);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/84622574/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/WorkflowNodeDetailResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/WorkflowNodeDetailResource.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/WorkflowNodeDetailResource.java
index 240a1a3..62e2965 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/WorkflowNodeDetailResource.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/WorkflowNodeDetailResource.java
@@ -377,4 +377,8 @@ public class WorkflowNodeDetailResource extends AbstractResource {
         }
         return errorDetails;
     }
+
+    public TaskDetailResource getTaskDetail(String taskId){
+        return (TaskDetailResource)get(ResourceType.TASK_DETAIL, taskId);
+    }
 }