Workflow REST API added sorting, tests and paging fix

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@54789 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tijs Rademakers
2013-09-02 15:17:42 +00:00
parent 60af54c1a4
commit 490cf6fc79
5 changed files with 542 additions and 322 deletions

View File

@@ -73,6 +73,7 @@ import org.alfresco.rest.framework.resource.content.FileBinaryResource;
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.Paging;
import org.alfresco.rest.framework.resource.parameters.Parameters;
import org.alfresco.rest.framework.resource.parameters.SortColumn;
import org.alfresco.rest.framework.resource.parameters.where.QueryHelper;
import org.alfresco.rest.workflow.api.Processes;
import org.alfresco.rest.workflow.api.impl.MapBasedQueryWalker.QueryVariableHolder;
@@ -294,6 +295,17 @@ public class ProcessesImpl extends WorkflowRestImpl implements Processes
throw new InvalidArgumentException("Invalid status parameter: " + status);
}
List<SortColumn> sortList = parameters.getSorting();
SortColumn sortColumn = null;
if (sortList != null && sortList.size() > 0)
{
if (sortList.size() != 1)
{
throw new InvalidArgumentException("Only one order by parameter is supported");
}
sortColumn = sortList.get(0);
}
final HistoricProcessInstanceQuery query = activitiProcessEngine
.getHistoryService()
.createHistoricProcessInstanceQuery();
@@ -392,58 +404,48 @@ public class ProcessesImpl extends WorkflowRestImpl implements Processes
query.involvedUser(AuthenticationUtil.getRunAsUser());
}
String sortParam = parameters.getParameter("sort");
if (sortParam != null)
if (sortColumn != null)
{
if (PROCESS_COLLECTION_SORT_PROPERTIES.contains(sortParam))
if (PROCESS_COLLECTION_SORT_PROPERTIES.contains(sortColumn.column))
{
if ("processDefinitionId".equalsIgnoreCase(sortParam))
if ("processDefinitionId".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessDefinitionId();
}
else if ("id".equalsIgnoreCase(sortParam))
else if ("id".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceId();
}
else if ("businessKey".equalsIgnoreCase(sortParam))
else if ("businessKey".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceBusinessKey();
}
else if ("startedAt".equalsIgnoreCase(sortParam))
else if ("startedAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceStartTime();
}
else if ("endedAt".equalsIgnoreCase(sortParam))
else if ("endedAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceEndTime();
}
else if ("durationInMillis".equalsIgnoreCase(sortParam))
else if ("durationInMillis".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceDuration();
}
}
else
{
throw new InvalidArgumentException("sort " + sortParam +
throw new InvalidArgumentException("sort " + sortColumn.column +
" is not supported, supported items are " + PROCESS_COLLECTION_SORT_PROPERTIES.toArray());
}
String sortOrderParam = parameters.getParameter("sortOrder");
if (sortOrderParam != null)
if (sortColumn.asc)
{
if ("asc".equalsIgnoreCase(sortOrderParam))
{
query.asc();
}
else if ("desc".equalsIgnoreCase(sortOrderParam))
{
query.desc();
}
else
{
throw new InvalidArgumentException("sort order " + sortOrderParam +
" is not supported, supported items are asc and desc");
}
query.asc();
}
else
{
query.desc();
}
}
else
@@ -452,6 +454,7 @@ public class ProcessesImpl extends WorkflowRestImpl implements Processes
}
List<HistoricProcessInstance> processInstances = query.listPage(paging.getSkipCount(), paging.getMaxItems());
int totalCount = (int) query.count();
List<ProcessInfo> page = new ArrayList<ProcessInfo>(processInstances.size());
for (HistoricProcessInstance processInstance: processInstances)
@@ -459,7 +462,7 @@ public class ProcessesImpl extends WorkflowRestImpl implements Processes
page.add(createProcessInfo(processInstance));
}
return CollectionWithPagingInfo.asPaged(paging, page, false, page.size());
return CollectionWithPagingInfo.asPaged(paging, page, page.size() != totalCount, totalCount);
}
@Override

View File

@@ -53,6 +53,7 @@ import org.alfresco.rest.framework.core.exceptions.UnsupportedResourceOperationE
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.Paging;
import org.alfresco.rest.framework.resource.parameters.Parameters;
import org.alfresco.rest.framework.resource.parameters.SortColumn;
import org.alfresco.rest.framework.resource.parameters.where.QueryHelper;
import org.alfresco.rest.workflow.api.Tasks;
import org.alfresco.rest.workflow.api.impl.MapBasedQueryWalker.QueryVariableHolder;
@@ -183,7 +184,19 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
Date dueAtGreaterThan = propertyWalker.getProperty("dueAt", WhereClauseParser.GREATERTHAN, Date.class);
Date dueAtLessThan = propertyWalker.getProperty("dueAt", WhereClauseParser.LESSTHAN, Date.class);
List<SortColumn> sortList = parameters.getSorting();
SortColumn sortColumn = null;
if (sortList != null && sortList.size() > 0)
{
if (sortList.size() != 1)
{
throw new InvalidArgumentException("Only one order by parameter is supported");
}
sortColumn = sortList.get(0);
}
List<Task> page = null;
int totalCount = 0;
if (status == null || STATUS_ACTIVE.equals(status))
{
TaskQuery query = activitiProcessEngine
@@ -296,10 +309,11 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
query.taskInvolvedUser(AuthenticationUtil.getRunAsUser());
}
query.orderByDueDate().asc();
setSorting(query, sortColumn);
List<org.activiti.engine.task.Task> tasks = query.listPage(paging.getSkipCount(), paging.getMaxItems());
totalCount = (int) query.count();
page = new ArrayList<Task>(tasks.size());
for (org.activiti.engine.task.Task taskInstance: tasks)
{
@@ -411,9 +425,10 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
query.taskInvolvedUser(AuthenticationUtil.getRunAsUser());
}
query.orderByTaskDueDate().asc();
setSorting(query, sortColumn);
List<HistoricTaskInstance> tasks = query.listPage(paging.getSkipCount(), paging.getMaxItems());
totalCount = (int) query.count();
page = new ArrayList<Task>(tasks.size());
for (HistoricTaskInstance taskInstance: tasks)
@@ -427,7 +442,7 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
throw new InvalidArgumentException("Invalid status parameter: " + status);
}
return CollectionWithPagingInfo.asPaged(paging, page, false, page.size());
return CollectionWithPagingInfo.asPaged(paging, page, page.size() != totalCount, totalCount);
}
@Override
@@ -436,9 +451,21 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
Paging paging = parameters.getPaging();
String status = parameters.getParameter("status");
List<SortColumn> sortList = parameters.getSorting();
SortColumn sortColumn = null;
if (sortList != null && sortList.size() > 0)
{
if (sortList.size() != 1)
{
throw new InvalidArgumentException("Only one order by parameter is supported");
}
sortColumn = sortList.get(0);
}
validateIfUserAllowedToWorkWithProcess(processId);
List<Task> page = null;
int totalCount = 0;
if (status == null || STATUS_ACTIVE.equals(status))
{
TaskQuery query = activitiProcessEngine
@@ -446,75 +473,10 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
.createTaskQuery();
query.processInstanceId(processId);
String sortParam = parameters.getParameter("sort");
if (sortParam != null)
{
if (TASK_COLLECTION_RUNNING_SORT_PROPERTIES.contains(sortParam))
{
if ("id".equalsIgnoreCase(sortParam))
{
query.orderByTaskId();
}
else if ("name".equalsIgnoreCase(sortParam))
{
query.orderByTaskName();
}
else if ("description".equalsIgnoreCase(sortParam))
{
query.orderByTaskDescription();
}
else if ("priority".equalsIgnoreCase(sortParam))
{
query.orderByTaskPriority();
}
else if ("processId".equalsIgnoreCase(sortParam))
{
query.orderByProcessInstanceId();
}
else if ("assignee".equalsIgnoreCase(sortParam))
{
query.orderByTaskAssignee();
}
else if ("startedAt".equalsIgnoreCase(sortParam))
{
query.orderByTaskCreateTime();
}
else if ("dueAt".equalsIgnoreCase(sortParam))
{
query.orderByDueDate();
}
}
else
{
throw new InvalidArgumentException("sort " + sortParam +
" is not supported, supported items are " + TASK_COLLECTION_RUNNING_SORT_PROPERTIES.toArray());
}
String sortOrderParam = parameters.getParameter("sortOrder");
if (sortOrderParam != null)
{
if ("asc".equalsIgnoreCase(sortOrderParam))
{
query.asc();
}
else if ("desc".equalsIgnoreCase(sortOrderParam))
{
query.desc();
}
else
{
throw new InvalidArgumentException("sort order " + sortOrderParam +
" is not supported, supported items are asc and desc");
}
}
}
else
{
query.orderByDueDate().asc();
}
setSorting(query, sortColumn);
List<org.activiti.engine.task.Task> tasks = query.listPage(paging.getSkipCount(), paging.getMaxItems());
totalCount = (int) query.count();
page = new ArrayList<Task>(tasks.size());
for (org.activiti.engine.task.Task taskInstance: tasks)
@@ -544,90 +506,10 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
query.taskInvolvedUser(AuthenticationUtil.getRunAsUser());
}
String sortParam = parameters.getParameter("sort");
if (sortParam != null)
{
if (TASK_COLLECTION_HISTORY_SORT_PROPERTIES.contains(sortParam))
{
if ("id".equalsIgnoreCase(sortParam))
{
query.orderByTaskId();
}
else if ("name".equalsIgnoreCase(sortParam))
{
query.orderByTaskName();
}
else if ("description".equalsIgnoreCase(sortParam))
{
query.orderByTaskDescription();
}
else if ("priority".equalsIgnoreCase(sortParam))
{
query.orderByTaskPriority();
}
else if ("processId".equalsIgnoreCase(sortParam))
{
query.orderByProcessInstanceId();
}
else if ("processDefinitionId".equalsIgnoreCase(sortParam))
{
query.orderByProcessDefinitionId();
}
else if ("assignee".equalsIgnoreCase(sortParam))
{
query.orderByTaskAssignee();
}
else if ("owner".equalsIgnoreCase(sortParam))
{
query.orderByTaskOwner();
}
else if ("startedAt".equalsIgnoreCase(sortParam))
{
query.orderByHistoricTaskInstanceStartTime();
}
else if ("endedAt".equalsIgnoreCase(sortParam))
{
query.orderByHistoricTaskInstanceEndTime();
}
else if ("durationInMs".equalsIgnoreCase(sortParam))
{
query.orderByHistoricTaskInstanceDuration();
}
else if ("dueAt".equalsIgnoreCase(sortParam))
{
query.orderByTaskDueDate();
}
}
else
{
throw new InvalidArgumentException("sort " + sortParam +
" is not supported, supported items are " + TASK_COLLECTION_HISTORY_SORT_PROPERTIES.toArray());
}
String sortOrderParam = parameters.getParameter("sortOrder");
if (sortOrderParam != null)
{
if ("asc".equalsIgnoreCase(sortOrderParam))
{
query.asc();
}
else if ("desc".equalsIgnoreCase(sortOrderParam))
{
query.desc();
}
else
{
throw new InvalidArgumentException("sort order " + sortOrderParam +
" is not supported, supported items are asc and desc");
}
}
}
else
{
query.orderByTaskDueDate().asc();
}
setSorting(query, sortColumn);
List<HistoricTaskInstance> tasks = query.listPage(paging.getSkipCount(), paging.getMaxItems());
totalCount = (int) query.count();
page = new ArrayList<Task>(tasks.size());
for (HistoricTaskInstance taskInstance: tasks)
@@ -641,7 +523,7 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
throw new InvalidArgumentException("Invalid status parameter: " + status);
}
return CollectionWithPagingInfo.asPaged(paging, page, false, page.size());
return CollectionWithPagingInfo.asPaged(paging, page, page.size() != totalCount, totalCount);
}
@Override
@@ -1320,6 +1202,142 @@ public class TasksImpl extends WorkflowRestImpl implements Tasks
return taskInstance;
}
protected void setSorting(TaskQuery query, SortColumn sortColumn)
{
if (sortColumn != null)
{
if (TASK_COLLECTION_RUNNING_SORT_PROPERTIES.contains(sortColumn.column))
{
if ("id".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskId();
}
else if ("name".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskName();
}
else if ("description".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskDescription();
}
else if ("priority".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskPriority();
}
else if ("processId".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceId();
}
else if ("assignee".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskAssignee();
}
else if ("startedAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskCreateTime();
}
else if ("dueAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByDueDate();
}
}
else
{
throw new InvalidArgumentException("sort " + sortColumn.column +
" is not supported, supported items are " + TASK_COLLECTION_RUNNING_SORT_PROPERTIES.toArray());
}
if (sortColumn.asc)
{
query.asc();
}
else
{
query.desc();
}
}
else
{
query.orderByDueDate().asc();
}
}
protected void setSorting(HistoricTaskInstanceQuery query, SortColumn sortColumn)
{
if (sortColumn != null)
{
if (TASK_COLLECTION_HISTORY_SORT_PROPERTIES.contains(sortColumn.column))
{
if ("id".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskId();
}
else if ("name".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskName();
}
else if ("description".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskDescription();
}
else if ("priority".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskPriority();
}
else if ("processId".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessInstanceId();
}
else if ("processDefinitionId".equalsIgnoreCase(sortColumn.column))
{
query.orderByProcessDefinitionId();
}
else if ("assignee".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskAssignee();
}
else if ("owner".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskOwner();
}
else if ("startedAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByHistoricTaskInstanceStartTime();
}
else if ("endedAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByHistoricTaskInstanceEndTime();
}
else if ("durationInMs".equalsIgnoreCase(sortColumn.column))
{
query.orderByHistoricTaskInstanceDuration();
}
else if ("dueAt".equalsIgnoreCase(sortColumn.column))
{
query.orderByTaskDueDate();
}
}
else
{
throw new InvalidArgumentException("sort " + sortColumn.column +
" is not supported, supported items are " + TASK_COLLECTION_HISTORY_SORT_PROPERTIES.toArray());
}
if (sortColumn.asc)
{
query.asc();
}
else
{
query.desc();
}
}
else
{
query.orderByTaskDueDate().asc();
}
}
protected WorkflowQNameConverter getQNameConverter()
{
if (qNameConverter == null)