From 5f2858c986cc5394b1055303fbb384b99a038e0c Mon Sep 17 00:00:00 2001 From: Gavin Cornwell Date: Thu, 2 Sep 2010 21:17:57 +0000 Subject: [PATCH] Performance improvement for GET workflow-instances REST API. Added "priority" and "dueDate" to WorkflowInstance object, which means a query for the workflow start task is no longer required to retrieve this information. A query was previously being done for every row in the results. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22210 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repository/workflow/task.lib.ftl | 2 +- .../workflow/WorkflowInstancesGet.java | 16 ++++----- .../workflow/WorkflowModelBuilder.java | 35 ++++++------------- 3 files changed, 19 insertions(+), 34 deletions(-) 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 7d5a16840c..470396cbe3 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 @@ -111,8 +111,8 @@ "description": "${workflowInstance.description}", "message": "${workflowInstance.message}", "isActive": ${workflowInstance.isActive?string}, - "priority": ${workflowInstance.priority?c}, "startDate": "${workflowInstance.startDate}", + "priority": <#if workflowInstance.priority??>${workflowInstance.priority?c}<#else>0, "endDate": <#if workflowInstance.endDate??>"${workflowInstance.endDate}"<#else>null, "dueDate": <#if workflowInstance.dueDate??>"${workflowInstance.dueDate}"<#else>null, "context": <#if workflowInstance.context??>"${workflowInstance.context}"<#else>null, diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java index 0c97044c3c..62484c6969 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java @@ -25,11 +25,9 @@ import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; -import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowInstance; -import org.alfresco.service.cmr.workflow.WorkflowTask; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; @@ -165,8 +163,7 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript } else if (key.equals(PARAM_DUE_BEFORE)) { - WorkflowTask startTask = modelBuilder.getStartTaskForWorkflow(workflowInstance); - Date dueDate = (Date)startTask.getProperties().get(WorkflowModel.PROP_WORKFLOW_DUE_DATE); + Date dueDate = workflowInstance.getDueDate(); if (!isDateMatchForFilter(dueDate, filterValue, true)) { @@ -176,8 +173,7 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript } else if (key.equals(PARAM_DUE_AFTER)) { - WorkflowTask startTask = modelBuilder.getStartTaskForWorkflow(workflowInstance); - Date dueDate = (Date)startTask.getProperties().get(WorkflowModel.PROP_WORKFLOW_DUE_DATE); + Date dueDate = workflowInstance.getDueDate(); if (!isDateMatchForFilter(dueDate, filterValue, false)) { @@ -246,9 +242,13 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript } else if (key.equals(PARAM_PRIORITY)) { - WorkflowTask startTask = modelBuilder.getStartTaskForWorkflow(workflowInstance); + String priority = "0"; + if (workflowInstance.getPriority() != null) + { + priority = workflowInstance.getPriority().toString(); + } - if (startTask == null || !filterValue.equals(startTask.getProperties().get(WorkflowModel.PROP_WORKFLOW_PRIORITY).toString())) + if (!filterValue.equals(priority)) { result = false; break; 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 22f795d392..b4940379e0 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java @@ -22,7 +22,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -236,6 +235,7 @@ public class WorkflowModelBuilder model.put(TASK_WORKFLOW_INSTANCE_TITLE, workflowInstance.getDefinition().getTitle()); model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.getDefinition().getDescription()); model.put(TASK_WORKFLOW_INSTANCE_IS_ACTIVE, workflowInstance.isActive()); + model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, workflowInstance.getPriority()); model.put(TASK_WORKFLOW_INSTANCE_DEFINITION_URL, getUrl(workflowInstance.getDefinition())); if (workflowInstance.getWorkflowPackage() != null) @@ -256,6 +256,15 @@ public class WorkflowModelBuilder { model.put(TASK_WORKFLOW_INSTANCE_START_DATE, ISO8601DateFormat.format(workflowInstance.getStartDate())); } + + if (workflowInstance.getDueDate() == null) + { + model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, workflowInstance.getDueDate()); + } + else + { + model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, ISO8601DateFormat.format(workflowInstance.getDueDate())); + } if (workflowInstance.getEndDate() == null) { @@ -275,10 +284,6 @@ public class WorkflowModelBuilder model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, getPersonModel(nodeService.getProperty(workflowInstance.initiator, ContentModel.PROP_USERNAME))); } - // TODO: Try and retrieve these from the workflow instance to save the need to - // do an extra query which makes things slow - model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, 2); - model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, null); String message = workflowInstance.getDescription(); if (message != null && message.length() > 0) { @@ -302,31 +307,11 @@ public class WorkflowModelBuilder { Map model = buildSimple(workflowInstance); - Serializable dueDate = null; - Serializable priority = null; Serializable startTaskId = null; - WorkflowTask startTask = getStartTaskForWorkflow(workflowInstance); - if (startTask != null) { startTaskId = startTask.id; - dueDate = startTask.properties.get(WorkflowModel.PROP_WORKFLOW_DUE_DATE); - priority = startTask.properties.get(WorkflowModel.PROP_WORKFLOW_PRIORITY); - } - - if (dueDate != null) - { - model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, ISO8601DateFormat.format((Date) dueDate)); - } - else - { - model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, dueDate); - } - - if (priority != null) - { - model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, priority); } model.put(TASK_WORKFLOW_INSTANCE_START_TASK_INSTANCE_ID, startTaskId);