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());
// 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;

View File

@@ -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<String, Object> 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<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;
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<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()));
}
}
// sort workflows by due date
Collections.sort(workflows, workflowComparator);
// filter result
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(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<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.
List<WorkflowTask> tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS);
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);
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);