diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance-diagram.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance-diagram.get.desc.xml
new file mode 100644
index 0000000000..2b7fee79c7
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance-diagram.get.desc.xml
@@ -0,0 +1,15 @@
+
+ Get Workflow Instance Diagram
+ Streams an image representing the current state of a workflow instance, if one is present
+ /api/workflow-instances/{workflow_instance_id}/diagram
+ argument
+ user
+ required
+ public_api
+
+
+ workflow_instance_id
+ The id of workflow process instance to retrieve a diagram for.
+
+
+
\ No newline at end of file
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.get.desc.xml
index 07db975597..e3ee485ceb 100644
--- a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.get.desc.xml
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.get.desc.xml
@@ -44,6 +44,7 @@
"lastName": string
},
"definitionUrl": string,
+ "diagramUrl": string,
"startTaskInstanceId": string,
"definition":
{
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl
index 916d387a71..be62bf94a9 100644
--- a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl
@@ -125,6 +125,7 @@
null,
#if>
"definitionUrl": "${workflowInstance.definitionUrl}"<#if detailed>,
+ "diagramUrl": <#if workflowInstance.diagramUrl??>"${workflowInstance.diagramUrl}"<#else>null#if>,
"startTaskInstanceId": "${workflowInstance.startTaskInstanceId}",
"definition":
<@workflowDefinitionJSON workflowDefinition=workflowInstance.definition detailed=true/>
diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml
index b1cdf4effb..5d1f971082 100644
--- a/config/alfresco/web-scripts-application-context.xml
+++ b/config/alfresco/web-scripts-application-context.xml
@@ -1046,6 +1046,13 @@
+
+
+
+
+
.
+ */
+package org.alfresco.repo.web.scripts.workflow;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.alfresco.repo.content.MimetypeMap;
+import org.alfresco.service.cmr.workflow.WorkflowInstance;
+import org.alfresco.service.cmr.workflow.WorkflowService;
+import org.springframework.extensions.webscripts.AbstractWebScript;
+import org.springframework.extensions.webscripts.Cache;
+import org.springframework.extensions.webscripts.WebScriptException;
+import org.springframework.extensions.webscripts.WebScriptRequest;
+import org.springframework.extensions.webscripts.WebScriptResponse;
+import org.springframework.util.FileCopyUtils;
+
+/**
+ * Java backed implementation for REST API to retrieve a diagram of a workflow instance.
+ *
+ * @author Gavin Cornwell
+ * @since 4.0
+ */
+public class WorkflowInstanceDiagramGet extends AbstractWebScript
+{
+ protected WorkflowService workflowService;
+
+ public void setWorkflowService(WorkflowService workflowService)
+ {
+ this.workflowService = workflowService;
+ }
+
+ @Override
+ public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException
+ {
+ Map params = req.getServiceMatch().getTemplateVars();
+
+ // getting workflow instance id from request parameters
+ String workflowInstanceId = params.get("workflow_instance_id");
+
+ WorkflowInstance workflowInstance = workflowService.getWorkflowById(workflowInstanceId);
+
+ // workflow instance was not found -> return 404
+ if (workflowInstance == null)
+ {
+ throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Unable to find workflow instance with id: " + workflowInstanceId);
+ }
+
+ // check whether there is a diagram available
+ if (!workflowService.hasWorkflowImage(workflowInstanceId))
+ {
+ throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Unable to find diagram for workflow instance with id: " + workflowInstanceId);
+ }
+
+ // set mimetype for the content and the character encoding + length for the stream
+ res.setContentType(MimetypeMap.MIMETYPE_IMAGE_PNG);
+
+ // set caching (never cache)
+ Cache cache = new Cache();
+ cache.setNeverCache(true);
+ cache.setMustRevalidate(true);
+ cache.setMaxAge(0L);
+ res.setCache(cache);
+
+ // stream image back to client
+ InputStream imageData = workflowService.getWorkflowImage(workflowInstanceId);
+ try
+ {
+ FileCopyUtils.copy(imageData, res.getOutputStream()); // both streams are closed
+ }
+ catch (IOException e)
+ {
+ throw new WebScriptException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error occurred streaming diagram for workflow instance with id '" +
+ workflowInstanceId + "' " + e.getMessage());
+ }
+ }
+}
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 af60c87a64..7c9d3dd19c 100644
--- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java
+++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java
@@ -108,6 +108,7 @@ public class WorkflowModelBuilder
public static final String TASK_WORKFLOW_INSTANCE_DEFINITION = "definition";
public static final String TASK_WORKFLOW_INSTANCE_TASKS = "tasks";
public static final String TASK_WORKFLOW_INSTANCE_DEFINITION_URL = "definitionUrl";
+ public static final String TASK_WORKFLOW_INSTANCE_DIAGRAM_URL = "diagramUrl";
public static final String TASK_WORKFLOW_INSTANCE_INITIATOR_USERNAME = "userName";
public static final String TASK_WORKFLOW_INSTANCE_INITIATOR_FIRSTNAME = "firstName";
@@ -297,6 +298,11 @@ public class WorkflowModelBuilder
startTaskId = startTask.getId();
}
+ if (workflowService.hasWorkflowImage(workflowInstance.getId()))
+ {
+ model.put(TASK_WORKFLOW_INSTANCE_DIAGRAM_URL, getDiagramUrl(workflowInstance));
+ }
+
model.put(TASK_WORKFLOW_INSTANCE_START_TASK_INSTANCE_ID, startTaskId);
model.put(TASK_WORKFLOW_INSTANCE_DEFINITION, buildDetailed(workflowInstance.getDefinition()));
@@ -626,6 +632,11 @@ public class WorkflowModelBuilder
{
return "api/workflow-instances/" + workflowInstance.getId();
}
+
+ private String getDiagramUrl(WorkflowInstance workflowInstance)
+ {
+ return "api/workflow-instances/" + workflowInstance.getId() + "/diagram";
+ }
private String getAvatarUrl(NodeRef avatarRef)
{