Merged BRANCHES/DEV/BELARUS/HEAD_2010_09_07 to HEAD:

22354: ALF-4637 : The sort order of the My Tasks dashlet and lists are confusing
               ALF-4640: The code to implement paging in workflow REST API needs re-factoring

Also added default due date ordering to the workflow instances REST API.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22375 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gavin Cornwell
2010-09-10 08:37:26 +00:00
parent c1074cf17c
commit 642e12d0bd
4 changed files with 77 additions and 12 deletions

View File

@@ -261,18 +261,15 @@ public abstract class AbstractWorkflowWebscript extends DeclarativeWebScript
List<Map<String, Object>> pagingResults = new ArrayList<Map<String,Object>>(results.size()); List<Map<String, Object>> pagingResults = new ArrayList<Map<String,Object>>(results.size());
// TODO: Revisit the logic below i.e. calculate start and end positions rather than relying on exceptions! int endPosition = results.size();
if (skipCount + maxItems <= endPosition)
for (int i = skipCount; i < (maxItems == DEFAULT_MAX_ITEMS ? results.size() : skipCount + maxItems); i++)
{ {
try endPosition = skipCount + maxItems;
{ }
pagingResults.add(results.get(i));
} for (int i = skipCount; i < endPosition; i++)
catch (IndexOutOfBoundsException e) {
{ pagingResults.add(results.get(i));
break;
}
} }
return pagingResults; return pagingResults;

View File

@@ -20,6 +20,8 @@ package org.alfresco.repo.web.scripts.workflow;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; 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.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery; import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState; 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.Cache;
import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptException;
@@ -41,6 +44,7 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
* *
* @author Nick Smith * @author Nick Smith
* @author Gavin Cornwell * @author Gavin Cornwell
* @since 3.4
*/ */
public class TaskInstancesGet extends AbstractWorkflowWebscript 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 PARAM_POOLED_TASKS = "pooledTasks";
public static final String VAR_WORKFLOW_INSTANCE_ID = "workflow_instance_id"; public static final String VAR_WORKFLOW_INSTANCE_ID = "workflow_instance_id";
private WorkflowTaskDueAscComparator taskComparator = new WorkflowTaskDueAscComparator();
@Override @Override
protected Map<String, Object> buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache) protected Map<String, Object> buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache)
{ {
@@ -94,6 +100,7 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript
taskQuery.setActive(null); taskQuery.setActive(null);
taskQuery.setProcessId(workflowInstanceId); taskQuery.setProcessId(workflowInstanceId);
taskQuery.setTaskState(state); taskQuery.setTaskState(state);
taskQuery.setOrderBy(new OrderBy[]{OrderBy.TaskDue_Asc});
if (authority != null) if (authority != null)
{ {
@@ -137,6 +144,9 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript
allTasks.addAll(tasks); allTasks.addAll(tasks);
allTasks.addAll(pooledTasks); allTasks.addAll(pooledTasks);
} }
// sort tasks by due date
Collections.sort(allTasks, taskComparator);
} }
else else
{ {
@@ -144,6 +154,7 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript
WorkflowTaskQuery taskQuery = new WorkflowTaskQuery(); WorkflowTaskQuery taskQuery = new WorkflowTaskQuery();
taskQuery.setTaskState(state); taskQuery.setTaskState(state);
taskQuery.setActive(null); taskQuery.setActive(null);
taskQuery.setOrderBy(new OrderBy[] { OrderBy.TaskDue_Asc });
allTasks = workflowService.queryTasks(taskQuery); allTasks = workflowService.queryTasks(taskQuery);
} }
} }
@@ -299,4 +310,25 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript
return result; return result;
} }
/**
* Comparator to sort workflow tasks by due date in ascending order.
*/
class WorkflowTaskDueAscComparator implements Comparator<WorkflowTask>
{
@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);
}
}
} }

View File

@@ -19,6 +19,8 @@
package org.alfresco.repo.web.scripts.workflow; package org.alfresco.repo.web.scripts.workflow;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; 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_COMPLETED_AFTER = "completedAfter";
public static final String PARAM_DEFINITION_ID = "definitionId"; public static final String PARAM_DEFINITION_ID = "definitionId";
public static final String VAR_DEFINITION_ID = "workflow_definition_id"; public static final String VAR_DEFINITION_ID = "workflow_definition_id";
private WorkflowInstanceDueAscComparator workflowComparator = new WorkflowInstanceDueAscComparator();
@Override @Override
protected Map<String, Object> buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache) protected Map<String, Object> buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache)
@@ -101,6 +105,9 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript
workflows.addAll(workflowService.getWorkflows(workflowDefinition.getId())); workflows.addAll(workflowService.getWorkflows(workflowDefinition.getId()));
} }
} }
// sort workflows by due date
Collections.sort(workflows, workflowComparator);
// filter result // filter result
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(workflows.size()); List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(workflows.size());
@@ -285,4 +292,25 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript
return null; return null;
} }
} }
/**
* Comparator to sort workflow instances by due date in ascending order.
*/
class WorkflowInstanceDueAscComparator implements Comparator<WorkflowInstance>
{
@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);
}
}
} }

View File

@@ -117,6 +117,10 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
// Check USER2 now has one task. // Check USER2 now has one task.
List<WorkflowTask> tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); List<WorkflowTask> tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS);
WorkflowTask task = tasks.get(0); WorkflowTask task = tasks.get(0);
Map<QName, Serializable> updateParams = new HashMap<QName, Serializable>(1);
updateParams.put(WorkflowModel.PROP_DUE_DATE, new Date());
workflowService.updateTask(task.getId(), updateParams, null, null);
personManager.setUser(USER2); personManager.setUser(USER2);
response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); 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 + "?dueAfter=" + ISO8601DateFormat.format(dueDate));
checkFiltering(URL_TASKS + "?dueBefore=" + ISO8601DateFormat.format(dueDate)); checkFiltering(URL_TASKS + "?dueBefore=" + ISO8601DateFormat.format(new Date()));
// paging // paging
int maxItems = 3; int maxItems = 3;
for (int skipCount = 0; skipCount < totalItems; skipCount += maxItems) 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); 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 // check the exclude filtering
String exclude = "wf:submitAdhocTask"; String exclude = "wf:submitAdhocTask";
response = sendRequest(new GetRequest(URL_TASKS + "?exclude=" + exclude), 200); response = sendRequest(new GetRequest(URL_TASKS + "?exclude=" + exclude), 200);