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());
|
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;
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user