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 1a8997f844..6760864ded 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 @@ -24,6 +24,28 @@ <@propertiesJSON properties=task.properties /> <#if detailed>, "path": "${task.path}", + "workflowInstance": + { + "id": "${task.workflowInstance.id}", + "url": "${task.workflowInstance.url}", + "name": "${task.workflowInstance.name}", + "title": "${task.workflowInstance.title}", + "description": "${task.workflowInstance.description}", + "isActive": ${task.workflowInstance.isActive?string}, + "startDate": "${task.workflowInstance.startDate}", + "endDate": <#if task.workflowInstance.endDate??>"${task.workflowInstance.endDate}"<#else>null, + "initiator": + <#if task.workflowInstance.initiator??> + { + "userName": "${task.workflowInstance.initiator.userName}", + "firstName": "${task.workflowInstance.initiator.firstName}", + "lastName": "${task.workflowInstance.initiator.lastName}" + }, + <#else> + null, + + "definitionUrl": "${task.workflowInstance.definitionUrl}" + }, "definition": { "id": "${task.definition.id}", 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 7b0213d783..e666ae4812 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java @@ -38,6 +38,7 @@ 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.WorkflowInstance; import org.alfresco.service.cmr.workflow.WorkflowNode; import org.alfresco.service.cmr.workflow.WorkflowPath; import org.alfresco.service.cmr.workflow.WorkflowTask; @@ -46,6 +47,7 @@ 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; +import org.springframework.extensions.surf.util.ISO8601DateFormat; /** * @author Nick Smith @@ -75,6 +77,23 @@ public class WorkflowModelBuilder public static final String TASK_DEFINITION_TYPE = "type"; public static final String TASK_DEFINITION_NODE = "node"; + public static final String TASK_WORKFLOW_INSTANCE = "workflowInstance"; + + public static final String TASK_WORKFLOW_INSTANCE_ID = "id"; + public static final String TASK_WORKFLOW_INSTANCE_URL = "url"; + public static final String TASK_WORKFLOW_INSTANCE_NAME = "name"; + public static final String TASK_WORKFLOW_INSTANCE_TITLE = "title"; + public static final String TASK_WORKFLOW_INSTANCE_DESCRIPTION = "description"; + public static final String TASK_WORKFLOW_INSTANCE_IS_ACTIVE = "isActive"; + public static final String TASK_WORKFLOW_INSTANCE_START_DATE = "startDate"; + public static final String TASK_WORKFLOW_INSTANCE_END_DATE = "endDate"; + public static final String TASK_WORKFLOW_INSTANCE_INITIATOR = "initiator"; + public static final String TASK_WORKFLOW_INSTANCE_DEFINITION_URL = "definitionUrl"; + + public static final String TASK_WORKFLOW_INSTANCE_INITIATOR_USERNAME = "userName"; + public static final String TASK_WORKFLOW_INSTANCE_INITIATOR_FIRSTNAME = "firstName"; + public static final String TASK_WORKFLOW_INSTANCE_INITIATOR_LASTNAME = "lastName"; + public static final String TYPE_DEFINITION_NAME = "name"; public static final String TYPE_DEFINITION_TITLE = "title"; public static final String TYPE_DEFINITION_DESCRIPTION = "description"; @@ -147,6 +166,9 @@ public class WorkflowModelBuilder model.put(TASK_PATH, getUrl(workflowTask, workflowTask.path)); + // workflow instance part + model.put(TASK_WORKFLOW_INSTANCE, buildWorkflowInstance(workflowTask.path.instance)); + // definition part model.put(TASK_DEFINITION, buildTaskDefinition(workflowTask.definition, workflowTask)); @@ -265,6 +287,48 @@ public class WorkflowModelBuilder return model; } + private Map buildWorkflowInstance(WorkflowInstance workflowInstance) + { + Map model = new HashMap(); + + model.put(TASK_WORKFLOW_INSTANCE_ID, workflowInstance.id); + model.put(TASK_WORKFLOW_INSTANCE_URL, getUrl(workflowInstance)); + model.put(TASK_WORKFLOW_INSTANCE_NAME, workflowInstance.definition.name); + model.put(TASK_WORKFLOW_INSTANCE_TITLE, workflowInstance.definition.title); + model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.definition.description); + model.put(TASK_WORKFLOW_INSTANCE_IS_ACTIVE, workflowInstance.active); + + if (workflowInstance.startDate == null) + { + model.put(TASK_WORKFLOW_INSTANCE_START_DATE, workflowInstance.startDate); + } + else + { + model.put(TASK_WORKFLOW_INSTANCE_START_DATE, ISO8601DateFormat.format(workflowInstance.startDate)); + } + + if (workflowInstance.endDate == null) + { + model.put(TASK_WORKFLOW_INSTANCE_END_DATE, workflowInstance.endDate); + } + else + { + model.put(TASK_WORKFLOW_INSTANCE_END_DATE, ISO8601DateFormat.format(workflowInstance.endDate)); + } + + if (workflowInstance.initiator == null) + { + model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, null); + } + else + { + model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, getPersonModel(nodeService.getProperty(workflowInstance.initiator, ContentModel.PROP_USERNAME))); + } + model.put(TASK_WORKFLOW_INSTANCE_DEFINITION_URL, getUrl(workflowInstance.definition)); + + return model; + } + private Map buildTaskDefinition(WorkflowTaskDefinition workflowTaskDefinition, WorkflowTask workflowTask) { Map model = new HashMap(); @@ -354,4 +418,9 @@ public class WorkflowModelBuilder return getUrl(task) + "/paths/" + path.id; } + private String getUrl(WorkflowInstance workflowInstance) + { + return "api/workflow-instances/" + workflowInstance.id; + } + } diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java index 464e84c8ff..36d33d64da 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilderTest.java @@ -39,6 +39,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; +import org.alfresco.service.cmr.workflow.WorkflowInstance; import org.alfresco.service.cmr.workflow.WorkflowNode; import org.alfresco.service.cmr.workflow.WorkflowPath; import org.alfresco.service.cmr.workflow.WorkflowTask; @@ -151,6 +152,12 @@ public class WorkflowModelBuilderTest extends TestCase workflowTask.path = new WorkflowPath(); workflowTask.path.id = "pathId$1"; + workflowTask.path.instance = new WorkflowInstance(); + workflowTask.path.instance.id = ""; + workflowTask.path.instance.active = true; + workflowTask.path.instance.startDate = new Date(); + workflowTask.path.instance.definition = new WorkflowDefinition( + "The Id", "The Name", "1", "The Title", "The Description", null); workflowTask.definition = new WorkflowTaskDefinition(); workflowTask.definition.id = "The Definition Id"; @@ -196,6 +203,15 @@ public class WorkflowModelBuilderTest extends TestCase Map props = (Map) model.get(WorkflowModelBuilder.TASK_PROPERTIES); assertEquals(workflowTask.properties.size(), props.size()); + Map workflowInstance = (Map) model.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE); + + assertEquals(workflowTask.path.instance.id, workflowInstance.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_ID)); + assertEquals(workflowTask.path.instance.definition.name, workflowInstance.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_NAME)); + assertEquals(workflowTask.path.instance.definition.title, workflowInstance.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_TITLE)); + assertEquals(workflowTask.path.instance.definition.description, workflowInstance.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_DESCRIPTION)); + assertEquals(workflowTask.path.instance.active, workflowInstance.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_IS_ACTIVE)); + assertEquals(ISO8601DateFormat.format(workflowTask.path.instance.startDate), workflowInstance.get(WorkflowModelBuilder.TASK_WORKFLOW_INSTANCE_START_DATE)); + Map definition = (Map) model.get(WorkflowModelBuilder.TASK_DEFINITION); assertEquals(workflowTask.definition.id, definition.get(WorkflowModelBuilder.TASK_DEFINITION_ID)); diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java index a5dc0ae996..038c959e74 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java @@ -33,6 +33,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; +import org.alfresco.service.cmr.workflow.WorkflowInstance; import org.alfresco.service.cmr.workflow.WorkflowNode; import org.alfresco.service.cmr.workflow.WorkflowPath; import org.alfresco.service.cmr.workflow.WorkflowService; @@ -167,7 +168,26 @@ public class WorkflowRestApiTest extends BaseWebScriptTest JSONObject properties = result.getJSONObject("properties"); assertNotNull(properties); + + JSONObject instance = result.getJSONObject("workflowInstance"); + WorkflowInstance startInstance = startTask.path.instance; + assertNotNull(instance); + + assertEquals(startInstance.id, instance.getString("id")); + assertTrue(instance.has("url")); + assertEquals(startInstance.definition.name, instance.getString("name")); + assertEquals(startInstance.definition.title, instance.getString("title")); + assertEquals(startInstance.definition.description, instance.getString("description")); + assertEquals(startInstance.active, instance.getBoolean("isActive")); + assertTrue(instance.has("startDate")); + + JSONObject initiator = instance.getJSONObject("initiator"); + + assertEquals(USER1, initiator.getString("userName")); + assertEquals(personManager.getFirstName(USER1), initiator.getString("firstName")); + assertEquals(personManager.getLastName(USER1), initiator.getString("lastName")); + JSONObject definition = result.getJSONObject("definition"); WorkflowTaskDefinition startDefinitiont = startTask.definition;