mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
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:
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user