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);
+ }
}