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, "definitionUrl": "${workflowInstance.definitionUrl}"<#if detailed>, + "diagramUrl": <#if workflowInstance.diagramUrl??>"${workflowInstance.diagramUrl}"<#else>null, "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) {