diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instance.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instance.get.desc.xml
new file mode 100644
index 0000000000..79b0864287
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instance.get.desc.xml
@@ -0,0 +1,8 @@
+
+ Gets Workflow Task Instance
+ Gets the details of a task.
+ /api/task-instances/{task_instance_id}
+
+ user
+ required
+
\ No newline at end of file
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instance.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instance.get.json.ftl
new file mode 100644
index 0000000000..557cbd0d2d
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instance.get.json.ftl
@@ -0,0 +1,6 @@
+<#-- Workflow Task Instance in details -->
+
+<#import "task.lib.ftl" as taskLib />
+{
+ "data": <@taskLib.taskJSON task=workflowTask detailed=true/>
+}
\ No newline at end of file
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instances.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instances.get.json.ftl
index ecbe22df49..7bd20c283c 100644
--- a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instances.get.json.ftl
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task-instances.get.json.ftl
@@ -5,7 +5,7 @@
"data":
[
<#list taskInstances as task>
- <@taskLib.taskJSON task=task />
+ <@taskLib.taskJSON task=task detailed=false />
<#if task_has_next>,#if>
#list>
]
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl
index cb983462ae..8c2ab048d5 100644
--- a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/task.lib.ftl
@@ -1,5 +1,6 @@
<#-- Renders a task instance. -->
-<#macro taskJSON task >
+<#macro taskJSON task detailed=false>
+<#escape x as jsonUtils.encodeJSONString(x)>
{
"id": "${task.id}",
"url": "${task.url}",
@@ -17,20 +18,57 @@
"lastName": "${task.owner.lastName}"
},
<#else>
- null,
+ null,
#if>
"properties":
<@propertiesJSON properties=task.properties />
- }
+ <#if detailed>,
+ "path": "${task.path}",
+ "definition":
+ {
+ "id": "${task.definition.id}",
+ "url": "${task.definition.url}",
+ "type":
+ {
+ "name": "${shortQName(task.definition.type.name?string)}",
+ "title": "${task.definition.type.title}",
+ "description": "${task.definition.type.description}",
+ "url": "${task.definition.type.url}"
+ },
+ "node":
+ {
+ "name": "${task.definition.node.name}",
+ "title": "${task.definition.node.title}",
+ "description": "${task.definition.node.description}",
+ "isTaskNode": ${task.definition.node.isTaskNode?string},
+ "transitions":
+ [
+ <#list task.definition.node.transitions as transition>
+ {
+ "id": "${transition.id}",
+ "title": "${transition.title}",
+ "description": "${transition.description}",
+ "isDefault": ${transition.isDefault?string},
+ "isHidden": ${transition.isHidden?string}
+ }
+ <#if transition_has_next>,#if>
+ #list>
+ ]
+ }
+ }
+ #if>
+ }
+#escape>
#macro>
<#-- Renders a map of properties -->
<#macro propertiesJSON properties>
- {
- <#list properties?keys as key>
- "${key}" :
- <#if properties[key]??>
- <#assign val=properties[key]>
+<#escape x as jsonUtils.encodeJSONString(x)>
+ {
+ <#list properties?keys as key>
+ "${key}":
+ <#if properties[key]??>
+ <#assign val=properties[key]>
<#if val?is_boolean == true>
${val?string}
<#elseif val?is_number == true>
@@ -50,4 +88,5 @@
<#if (key_has_next)>,#if>
#list>
}
+#escape>
#macro>
diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml
index 24e3a3a87e..f18f5a79b7 100644
--- a/config/alfresco/web-scripts-application-context.xml
+++ b/config/alfresco/web-scripts-application-context.xml
@@ -789,6 +789,11 @@
parent="abstractWorkflowWebScript">
+
+
+
.
+ */
+package org.alfresco.repo.web.scripts.workflow;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.alfresco.service.cmr.workflow.WorkflowTask;
+import org.springframework.extensions.webscripts.Cache;
+import org.springframework.extensions.webscripts.Status;
+import org.springframework.extensions.webscripts.WebScriptException;
+import org.springframework.extensions.webscripts.WebScriptRequest;
+
+/**
+ * @author unknown
+ *
+ */
+public class TaskInstanceGet extends AbstractWorkflowWebscript
+{
+
+ @Override
+ protected Map buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache)
+ {
+ Map params = req.getServiceMatch().getTemplateVars();
+
+ String taskId = params.get("task_instance_id");
+
+ WorkflowTask workflowTask = workflowService.getTaskById(taskId);
+
+ if (workflowTask == null)
+ {
+ throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Unable to find workflow task with id: " + taskId);
+ }
+
+ Map model = new HashMap();
+ model.put("workflowTask", modelBuilder.buildDetailed(workflowTask));
+
+ return model;
+ }
+
+}
diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java
index f09747e6e8..412e90de97 100644
--- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java
+++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java
@@ -32,12 +32,16 @@ import org.alfresco.model.ContentModel;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
+import org.alfresco.service.cmr.dictionary.TypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
+import org.alfresco.service.cmr.workflow.WorkflowNode;
import org.alfresco.service.cmr.workflow.WorkflowTask;
+import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
+import org.alfresco.service.cmr.workflow.WorkflowTransition;
import org.alfresco.service.namespace.NamespaceException;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
@@ -62,18 +66,42 @@ public class WorkflowModelBuilder
public static final String TASK_URL = "url";
public static final String TASK_IS_POOLED = "isPooled";
public static final String TASK_ID = "id";
-
+ public static final String TASK_PATH = "path";
+ public static final String TASK_DEFINITION = "definition";
+
+ public static final String TASK_DEFINITION_ID = "id";
+ public static final String TASK_DEFINITION_URL = "url";
+ public static final String TASK_DEFINITION_TYPE = "type";
+ public static final String TASK_DEFINITION_NODE = "node";
+
+ public static final String TYPE_DEFINITION_NAME = "name";
+ public static final String TYPE_DEFINITION_TITLE = "title";
+ public static final String TYPE_DEFINITION_DESCRIPTION = "description";
+ public static final String TYPE_DEFINITION_URL = "url";
+
+ public static final String WORKFLOW_NODE_NAME = "name";
+ public static final String WORKFLOW_NODE_TITLE = "title";
+ public static final String WORKFLOW_NODE_DESCRIPTION = "description";
+ public static final String WORKFLOW_NODE_IS_TASK_NODE = "isTaskNode";
+ public static final String WORKFLOW_NODE_TRANSITIONS = "transitions";
+
+ public static final String WORKFLOW_NODE_TRANSITION_ID = "id";
+ public static final String WORKFLOW_NODE_TRANSITION_TITLE = "title";
+ public static final String WORKFLOW_NODE_TRANSITION_DESCRIPTION = "description";
+ public static final String WORKFLOW_NODE_TRANSITION_IS_DEFAULT = "isDefault";
+ public static final String WORKFLOW_NODE_TRANSITION_IS_HIDDEN = "isHidden";
+
public static final String WORKFLOW_DEFINITION_ID = "id";
public static final String WORKFLOW_DEFINITION_URL = "url";
public static final String WORKFLOW_DEFINITION_NAME = "name";
public static final String WORKFLOW_DEFINITION_TITLE = "title";
public static final String WORKFLOW_DEFINITION_DESCRIPTION = "description";
-
+
private static final String PREFIX_SEPARATOR = Character.toString(QName.NAMESPACE_PREFIX);
private final NamespaceService namespaceService;
- private final NodeService nodeService;
- private final PersonService personService;
+ private final NodeService nodeService;
+ private final PersonService personService;
public WorkflowModelBuilder(NamespaceService namespaceService, NodeService nodeService, PersonService personService)
{
@@ -102,11 +130,28 @@ public class WorkflowModelBuilder
model.put(TASK_IS_POOLED, isPooled(task.properties));
Serializable owner = task.properties.get(ContentModel.PROP_OWNER);
model.put(TASK_OWNER, getPersonModel((String) owner));
-
+
model.put(TASK_PROPERTIES, buildProperties(task, propertyFilters));
return model;
}
+ /**
+ * Returns a detailed representation of a {@link WorkflowTask}.
+ * @param workflowTask The task to be represented.
+ * @return
+ */
+ public Map buildDetailed(WorkflowTask workflowTask)
+ {
+ Map model = buildSimple(workflowTask, null);
+
+ model.put(TASK_PATH, getUrl(workflowTask) + "/paths/" + workflowTask.path.id);
+
+ // definition part
+ model.put(TASK_DEFINITION, buildTaskDefinition(workflowTask.definition, workflowTask));
+
+ return model;
+ }
+
/**
* Returns a simple representation of a {@link WorkflowDefinition}.
*
@@ -116,20 +161,20 @@ public class WorkflowModelBuilder
public Map buildSimple(WorkflowDefinition workflowDefinition)
{
HashMap model = new HashMap();
-
+
model.put(WORKFLOW_DEFINITION_ID, workflowDefinition.id);
model.put(WORKFLOW_DEFINITION_URL, getUrl(workflowDefinition));
model.put(WORKFLOW_DEFINITION_NAME, workflowDefinition.name);
model.put(WORKFLOW_DEFINITION_TITLE, workflowDefinition.title);
- model.put(WORKFLOW_DEFINITION_DESCRIPTION, workflowDefinition.description);
-
+ model.put(WORKFLOW_DEFINITION_DESCRIPTION, workflowDefinition.description);
+
return model;
}
private Object isPooled(Map properties)
{
Collection> actors = (Collection>) properties.get(WorkflowModel.ASSOC_POOLED_ACTORS);
- return actors!=null && !actors.isEmpty();
+ return actors != null && !actors.isEmpty();
}
private Map buildProperties(WorkflowTask task, Collection propertyFilters)
@@ -166,18 +211,15 @@ public class WorkflowModelBuilder
private Object convertValue(Object value)
{
- if(value == null
- || value instanceof Boolean
- || value instanceof Number
- || value instanceof String)
+ if (value == null || value instanceof Boolean || value instanceof Number || value instanceof String)
{
return value;
}
- if(value instanceof Collection>)
+ if (value instanceof Collection>)
{
- Collection> collection = (Collection>)value;
+ Collection> collection = (Collection>) value;
ArrayList