diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java index b91b329dbe..4151ca31dc 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowWebscript.java @@ -261,18 +261,15 @@ public abstract class AbstractWorkflowWebscript extends DeclarativeWebScript List> pagingResults = new ArrayList>(results.size()); - // TODO: Revisit the logic below i.e. calculate start and end positions rather than relying on exceptions! - - for (int i = skipCount; i < (maxItems == DEFAULT_MAX_ITEMS ? results.size() : skipCount + maxItems); i++) + int endPosition = results.size(); + if (skipCount + maxItems <= endPosition) { - try - { - pagingResults.add(results.get(i)); - } - catch (IndexOutOfBoundsException e) - { - break; - } + endPosition = skipCount + maxItems; + } + + for (int i = skipCount; i < endPosition; i++) + { + pagingResults.add(results.get(i)); } return pagingResults; diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java b/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java index d0a541026d..99c0c4e448 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java @@ -20,6 +20,8 @@ package org.alfresco.repo.web.scripts.workflow; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -31,6 +33,7 @@ import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.service.cmr.workflow.WorkflowTaskQuery; import org.alfresco.service.cmr.workflow.WorkflowTaskState; +import org.alfresco.service.cmr.workflow.WorkflowTaskQuery.OrderBy; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptException; @@ -41,6 +44,7 @@ import org.springframework.extensions.webscripts.WebScriptRequest; * * @author Nick Smith * @author Gavin Cornwell + * @since 3.4 */ public class TaskInstancesGet extends AbstractWorkflowWebscript { @@ -53,6 +57,8 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript public static final String PARAM_POOLED_TASKS = "pooledTasks"; public static final String VAR_WORKFLOW_INSTANCE_ID = "workflow_instance_id"; + private WorkflowTaskDueAscComparator taskComparator = new WorkflowTaskDueAscComparator(); + @Override protected Map buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache) { @@ -94,6 +100,7 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript taskQuery.setActive(null); taskQuery.setProcessId(workflowInstanceId); taskQuery.setTaskState(state); + taskQuery.setOrderBy(new OrderBy[]{OrderBy.TaskDue_Asc}); if (authority != null) { @@ -137,6 +144,9 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript allTasks.addAll(tasks); allTasks.addAll(pooledTasks); } + + // sort tasks by due date + Collections.sort(allTasks, taskComparator); } else { @@ -144,6 +154,7 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript WorkflowTaskQuery taskQuery = new WorkflowTaskQuery(); taskQuery.setTaskState(state); taskQuery.setActive(null); + taskQuery.setOrderBy(new OrderBy[] { OrderBy.TaskDue_Asc }); allTasks = workflowService.queryTasks(taskQuery); } } @@ -299,4 +310,25 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript return result; } + + /** + * Comparator to sort workflow tasks by due date in ascending order. + */ + class WorkflowTaskDueAscComparator implements Comparator + { + @Override + public int compare(WorkflowTask o1, WorkflowTask o2) + { + Date date1 = (Date)o1.getProperties().get(WorkflowModel.PROP_DUE_DATE); + Date date2 = (Date)o2.getProperties().get(WorkflowModel.PROP_DUE_DATE); + + long time1 = date1 == null ? Long.MAX_VALUE : date1.getTime(); + long time2 = date2 == null ? Long.MAX_VALUE : date2.getTime(); + + long result = time1 - time2; + + return (result > 0) ? 1 : (result < 0 ? -1 : 0); + } + + } } 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 62484c6969..8cf4299636 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstancesGet.java @@ -19,6 +19,8 @@ package org.alfresco.repo.web.scripts.workflow; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -51,6 +53,8 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript public static final String PARAM_COMPLETED_AFTER = "completedAfter"; public static final String PARAM_DEFINITION_ID = "definitionId"; public static final String VAR_DEFINITION_ID = "workflow_definition_id"; + + private WorkflowInstanceDueAscComparator workflowComparator = new WorkflowInstanceDueAscComparator(); @Override protected Map buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache) @@ -101,6 +105,9 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript workflows.addAll(workflowService.getWorkflows(workflowDefinition.getId())); } } + + // sort workflows by due date + Collections.sort(workflows, workflowComparator); // filter result List> results = new ArrayList>(workflows.size()); @@ -285,4 +292,25 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript return null; } } + + /** + * Comparator to sort workflow instances by due date in ascending order. + */ + class WorkflowInstanceDueAscComparator implements Comparator + { + @Override + public int compare(WorkflowInstance o1, WorkflowInstance o2) + { + Date date1 = (Date)o1.dueDate; + Date date2 = (Date)o2.dueDate; + + long time1 = date1 == null ? Long.MAX_VALUE : date1.getTime(); + long time2 = date2 == null ? Long.MAX_VALUE : date2.getTime(); + + long result = time1 - time2; + + return (result > 0) ? 1 : (result < 0 ? -1 : 0); + } + + } } \ No newline at end of file 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 de64528cc2..f35dfadbf1 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java @@ -117,6 +117,10 @@ public class WorkflowRestApiTest extends BaseWebScriptTest // Check USER2 now has one task. List tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); WorkflowTask task = tasks.get(0); + + Map updateParams = new HashMap(1); + updateParams.put(WorkflowModel.PROP_DUE_DATE, new Date()); + workflowService.updateTask(task.getId(), updateParams, null, null); personManager.setUser(USER2); response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); @@ -161,15 +165,19 @@ public class WorkflowRestApiTest extends BaseWebScriptTest checkFiltering(URL_TASKS + "?dueAfter=" + ISO8601DateFormat.format(dueDate)); - checkFiltering(URL_TASKS + "?dueBefore=" + ISO8601DateFormat.format(dueDate)); + checkFiltering(URL_TASKS + "?dueBefore=" + ISO8601DateFormat.format(new Date())); // paging int maxItems = 3; for (int skipCount = 0; skipCount < totalItems; skipCount += maxItems) { + // one of this should test situation when skipCount + maxItems > totalItems checkPaging(MessageFormat.format(URL_USER_TASKS, USER2) + "&maxItems=" + maxItems + "&skipCount=" + skipCount, totalItems, maxItems, skipCount); } + // testing when skipCount > totalItems + checkPaging(MessageFormat.format(URL_USER_TASKS, USER2) + "&maxItems=" + maxItems + "&skipCount=" + (totalItems + 1), totalItems, maxItems, totalItems + 1); + // check the exclude filtering String exclude = "wf:submitAdhocTask"; response = sendRequest(new GetRequest(URL_TASKS + "?exclude=" + exclude), 200);