ALF-8140 Created unit test in AbstractWorkflowServiceIntegrationTest to test the number of results returned by queryTasks() can be limited. Implemented this functionality for ActivitiWorkflowEngine.queryTasks().

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28357 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
N Smith
2011-06-13 09:01:27 +00:00
parent 17909c806c
commit 08835a782e
4 changed files with 235 additions and 159 deletions

View File

@@ -73,6 +73,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
protected final static String USER3 = "WFUser3" + GUID.generate(); protected final static String USER3 = "WFUser3" + GUID.generate();
protected final static String GROUP = "WFGroup" + GUID.generate(); protected final static String GROUP = "WFGroup" + GUID.generate();
protected final static String SUB_GROUP = "WFSubGroup" + GUID.generate(); protected final static String SUB_GROUP = "WFSubGroup" + GUID.generate();
protected final static QName customStringProp = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "customStringProp");
protected WorkflowService workflowService; protected WorkflowService workflowService;
protected AuthenticationComponent authenticationComponent; protected AuthenticationComponent authenticationComponent;
@@ -576,26 +577,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
WorkflowDefinition workflowDef = deployDefinition(getAdhocDefinitionPath()); WorkflowDefinition workflowDef = deployDefinition(getAdhocDefinitionPath());
assertNotNull(workflowDef); assertNotNull(workflowDef);
// Create params String workflowInstanceId = startAdhocWorkflow(workflowDef, USER2);
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
Serializable wfPackage = workflowService.createPackage(null);
params.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
Date dueDate = new Date();
params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate);
params.put(WorkflowModel.PROP_WORKFLOW_PRIORITY, 1);
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "Test workflow description");
QName customStringProp = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "customStringProp");
params.put(customStringProp, "stringValue");
// Assign to USER2
NodeRef assignee = personManager.get(USER2);
params.put(WorkflowModel.ASSOC_ASSIGNEE, assignee);
// Start a workflow instance
WorkflowPath path = workflowService.startWorkflow(workflowDef.getId(), params);
assertNotNull(path);
assertTrue(path.isActive());
String workflowInstanceId = path.getInstance().getId();
// End start task to progress workflow // End start task to progress workflow
WorkflowTask startTask = workflowService.getStartTask(workflowInstanceId); WorkflowTask startTask = workflowService.getStartTask(workflowInstanceId);
@@ -605,30 +587,54 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
WorkflowTask theTask = getNextTaskForWorkflow(workflowInstanceId); WorkflowTask theTask = getNextTaskForWorkflow(workflowInstanceId);
// Set some custom properties on the task // Set some custom properties on the task
params = new HashMap<QName, Serializable>(); HashMap<QName, Serializable> params = new HashMap<QName, Serializable>();
params.put(customStringProp, "stringValue"); params.put(customStringProp, "stringValue");
workflowService.updateTask(theTask.getId(), params, null, null); workflowService.updateTask(theTask.getId(), params, null, null);
// Test all query features for running tasks // Test all query features for running tasks
testTaskQueryInProgress(workflowInstanceId, theTask); checkTaskQueryInProgress(workflowInstanceId, theTask);
// Test all query features for the start-task // Test all query features for the start-task
testTaskQueryStartTaskCompleted(workflowInstanceId, startTask); checkTaskQueryStartTaskCompleted(workflowInstanceId, startTask);
// Finish the task adhoc-task // Finish the task adhoc-task
workflowService.endTask(theTask.getId(), null); workflowService.endTask(theTask.getId(), null);
// Test all query features for completed tasks // Test all query features for completed tasks
testTaskQueryTaskCompleted(workflowInstanceId, theTask, startTask); checkTaskQueryTaskCompleted(workflowInstanceId, theTask, startTask);
// Finally end the workflow and check the querying isActive == false // Finally end the workflow and check the querying isActive == false
WorkflowTask lastTask = getNextTaskForWorkflow(workflowInstanceId); WorkflowTask lastTask = getNextTaskForWorkflow(workflowInstanceId);
workflowService.endTask(lastTask.getId(), null); workflowService.endTask(lastTask.getId(), null);
testQueryTasksInactiveWorkflow(workflowInstanceId); checkQueryTasksInactiveWorkflow(workflowInstanceId);
} }
protected void testQueryTasksInactiveWorkflow(String workflowInstanceId) { public void testQueryTaskLimit() throws Exception
{
WorkflowDefinition workflowDef = deployDefinition(getAdhocDefinitionPath());
// execute 5 instances of the adhoc workflow
for (int x = 0; x < 5; x++)
{
executeAdhocWorkflow(workflowDef);
}
// ensure there more than 5 tasks returned.
WorkflowTaskQuery query = new WorkflowTaskQuery();
query.setActive(false);
query.setActorId(USER3);
query.setTaskState(WorkflowTaskState.COMPLETED);
List<WorkflowTask> tasks = workflowService.queryTasks(query);
assertTrue(tasks.size()>5);
// limit the results and ensure we get the correct number of results back
query.setLimit(5);
tasks = workflowService.queryTasks(query);
assertEquals(5, tasks.size());
}
protected void checkQueryTasksInactiveWorkflow(String workflowInstanceId) {
WorkflowTaskQuery taskQuery = createWorkflowTaskQuery(WorkflowTaskState.COMPLETED); WorkflowTaskQuery taskQuery = createWorkflowTaskQuery(WorkflowTaskState.COMPLETED);
taskQuery.setActive(false); taskQuery.setActive(false);
@@ -641,7 +647,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
checkNoTasksFoundUsingQuery(taskQuery); checkNoTasksFoundUsingQuery(taskQuery);
} }
protected void testTaskQueryTaskCompleted(String workflowInstanceId, protected void checkTaskQueryTaskCompleted(String workflowInstanceId,
WorkflowTask theTask, WorkflowTask startTask) WorkflowTask theTask, WorkflowTask startTask)
{ {
List<String> expectedTasks = Arrays.asList(theTask.getId(), startTask.getId()); List<String> expectedTasks = Arrays.asList(theTask.getId(), startTask.getId());
@@ -661,7 +667,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
checkTaskPropsQuery(expectedTasks, WorkflowTaskState.COMPLETED, null); checkTaskPropsQuery(expectedTasks, WorkflowTaskState.COMPLETED, null);
} }
protected void testTaskQueryInProgress(String workflowInstanceId, WorkflowTask expectedTask) protected void checkTaskQueryInProgress(String workflowInstanceId, WorkflowTask expectedTask)
{ {
List<String> expectedTasks = Arrays.asList(expectedTask.getId()); List<String> expectedTasks = Arrays.asList(expectedTask.getId());
@@ -676,7 +682,7 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
checkProcessPropsQuery(expectedTasks, WorkflowTaskState.IN_PROGRESS); checkProcessPropsQuery(expectedTasks, WorkflowTaskState.IN_PROGRESS);
} }
protected void testTaskQueryStartTaskCompleted(String workflowInstanceId, WorkflowTask startTask) { protected void checkTaskQueryStartTaskCompleted(String workflowInstanceId, WorkflowTask startTask) {
List<String> expectedTasks = Arrays.asList(startTask.getId()); List<String> expectedTasks = Arrays.asList(startTask.getId());
checkProcessIdQuery(workflowInstanceId, expectedTasks, WorkflowTaskState.COMPLETED); checkProcessIdQuery(workflowInstanceId, expectedTasks, WorkflowTaskState.COMPLETED);
@@ -928,7 +934,6 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
String optionalProcessId) String optionalProcessId)
{ {
WorkflowTaskQuery taskQuery = createWorkflowTaskQuery(state); WorkflowTaskQuery taskQuery = createWorkflowTaskQuery(state);
QName customStringProp = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "customStringProp");
Map<QName, Object> taskProps = new HashMap<QName, Object>(); Map<QName, Object> taskProps = new HashMap<QName, Object>();
taskProps.put(customStringProp, "stringValue"); taskProps.put(customStringProp, "stringValue");
@@ -1070,6 +1075,52 @@ public abstract class AbstractWorkflowServiceIntegrationTest extends BaseSpringT
assertEquals(expDef.getVersion(), actualDef.getVersion()); assertEquals(expDef.getVersion(), actualDef.getVersion());
} }
private void executeAdhocWorkflow(WorkflowDefinition workflowDef)
{
personManager.setUser(USER3);
String workflowId = startAdhocWorkflow(workflowDef, USER3);
// End start task to progress workflow
WorkflowTask startTask = workflowService.getStartTask(workflowId);
String startTaskId = startTask.getId();
workflowService.endTask(startTaskId, null);
// finish the adhoc task
WorkflowTask adhocTask = getNextTaskForWorkflow(workflowId);
workflowService.endTask(adhocTask.getId(), null);
// finish the workflow
WorkflowTask lastTask = getNextTaskForWorkflow(workflowId);
workflowService.endTask(lastTask.getId(), null);
// ensure the workflow has completed
assertFalse(workflowService.getWorkflowById(workflowId).isActive());
}
private String startAdhocWorkflow(WorkflowDefinition workflowDef, String assigneeId)
{
// Create params
Map<QName, Serializable> params = new HashMap<QName, Serializable>();
Serializable wfPackage = workflowService.createPackage(null);
params.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
Date dueDate = new Date();
params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate);
params.put(WorkflowModel.PROP_WORKFLOW_PRIORITY, 1);
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "Test workflow description");
params.put(customStringProp, "stringValue");
// Assign to USER2
NodeRef assignee = personManager.get(assigneeId);
params.put(WorkflowModel.ASSOC_ASSIGNEE, assignee);
// Start a workflow instance
WorkflowPath path = workflowService.startWorkflow(workflowDef.getId(), params);
assertNotNull(path);
assertTrue(path.isActive());
return path.getInstance().getId();
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
protected void onSetUpInTransaction() throws Exception protected void onSetUpInTransaction() throws Exception

View File

@@ -111,7 +111,6 @@ import org.xml.sax.InputSource;
* @since 3.4.e * @since 3.4.e
* @author Nick Smith * @author Nick Smith
* @author Frederik Heremans * @author Frederik Heremans
*
*/ */
public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
{ {
@@ -1002,7 +1001,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
throw new WorkflowException(msg, ae); throw new WorkflowException(msg, ae);
} }
} }
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@@ -1419,60 +1418,72 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
private List<WorkflowTask> queryRuntimeTasks(WorkflowTaskQuery query) private List<WorkflowTask> queryRuntimeTasks(WorkflowTaskQuery query)
{ {
// Runtime-tasks only exist on process-instances that are active // Runtime-tasks only exist on process-instances that are active
// so no use in querying runtime tasks if not active // so no use in querying runtime tasks if not active
if(!Boolean.FALSE.equals(query.isActive())) if (!Boolean.FALSE.equals(query.isActive()))
{ {
// Add task name // Add task name
TaskQuery taskQuery = taskService.createTaskQuery(); TaskQuery taskQuery = taskService.createTaskQuery();
if(query.getTaskName() != null) { if (query.getTaskName() != null)
// Task 'key' is stored as variable on task {
String formKey = query.getTaskName().toPrefixString(namespaceService); // Task 'key' is stored as variable on task
taskQuery.taskVariableValueEquals(ActivitiConstants.PROP_TASK_FORM_KEY, formKey); String formKey = query.getTaskName().toPrefixString(namespaceService);
} taskQuery.taskVariableValueEquals(ActivitiConstants.PROP_TASK_FORM_KEY, formKey);
}
if(query.getProcessId() != null) {
String processInstanceId = createLocalId(query.getProcessId());
taskQuery.processInstanceId(processInstanceId);
}
if(query.getProcessName() != null) if (query.getProcessId() != null)
{ {
String processName = getProcessNameMTSafe(query.getProcessName()); String processInstanceId = createLocalId(query.getProcessId());
taskQuery.processDefinitionKey(processName); taskQuery.processInstanceId(processInstanceId);
} }
if(query.getActorId() != null) {
taskQuery.taskAssignee(query.getActorId());
}
if(query.getTaskId() != null) {
String taskId = createLocalId(query.getTaskId());
taskQuery.taskId(taskId);
}
// Custom task properties
if(query.getTaskCustomProps() != null)
{
addTaskPropertiesToQuery(query.getTaskCustomProps(), taskQuery);
}
if(query.getProcessCustomProps() != null) if (query.getProcessName() != null)
{ {
addProcessPropertiesToQuery(query.getProcessCustomProps(), taskQuery); String processName = getProcessNameMTSafe(query.getProcessName());
} taskQuery.processDefinitionKey(processName);
// Add ordering }
if (query.getOrderBy() != null)
{ if (query.getActorId() != null)
WorkflowTaskQuery.OrderBy[] orderBy = query.getOrderBy(); {
orderQuery(taskQuery, orderBy); taskQuery.taskAssignee(query.getActorId());
} }
List<WorkflowTask> currentTasks = typeConverter.convert(taskQuery.list()); if (query.getTaskId() != null)
return currentTasks; {
} String taskId = createLocalId(query.getTaskId());
return new ArrayList<WorkflowTask>(); taskQuery.taskId(taskId);
}
// Custom task properties
if (query.getTaskCustomProps() != null)
{
addTaskPropertiesToQuery(query.getTaskCustomProps(), taskQuery);
}
if (query.getProcessCustomProps() != null)
{
addProcessPropertiesToQuery(query.getProcessCustomProps(), taskQuery);
}
// Add ordering
if (query.getOrderBy() != null)
{
WorkflowTaskQuery.OrderBy[] orderBy = query.getOrderBy();
orderQuery(taskQuery, orderBy);
}
List<Task> results;
int limit = query.getLimit();
if (limit > 0)
{
results = taskQuery.listPage(0, limit);
}
else
{
results = taskQuery.list();
}
return typeConverter.convert(results);
}
return new ArrayList<WorkflowTask>();
} }
private void addProcessPropertiesToQuery( private void addProcessPropertiesToQuery(
@@ -1611,78 +1622,87 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
private List<WorkflowTask> queryHistoricTasks(WorkflowTaskQuery query) private List<WorkflowTask> queryHistoricTasks(WorkflowTaskQuery query)
{ {
HistoricTaskInstanceQuery historicQuery = historyService HistoricTaskInstanceQuery historicQuery = historyService.createHistoricTaskInstanceQuery().finished();
.createHistoricTaskInstanceQuery()
.finished(); if (query.getTaskId() != null)
{
if(query.getTaskId() != null) { String taskId = createLocalId(query.getTaskId());
String taskId = createLocalId(query.getTaskId()); historicQuery.taskId(taskId);
historicQuery.taskId(taskId); }
}
if (query.getProcessId() != null)
if(query.getProcessId() != null) {
{ String processInstanceId = createLocalId(query.getProcessId());
String processInstanceId = createLocalId(query.getProcessId()); historicQuery.processInstanceId(processInstanceId);
historicQuery.processInstanceId(processInstanceId); }
}
if (query.getTaskName() != null)
if(query.getTaskName() != null) {
{ historicQuery.taskDefinitionKey(query.getTaskName().toPrefixString());
historicQuery.taskDefinitionKey(query.getTaskName().toPrefixString()); }
}
if (query.getActorId() != null)
if(query.getActorId() != null) {
{ historicQuery.taskAssignee(query.getActorId());
historicQuery.taskAssignee(query.getActorId()); }
}
if (query.getProcessName() != null)
if(query.getProcessName() != null) {
{ String processName = getProcessNameMTSafe(query.getProcessName());
String processName = getProcessNameMTSafe(query.getProcessName()); historicQuery.processDefinitionKey(processName);
historicQuery.processDefinitionKey(processName); }
}
if (query.getTaskCustomProps() != null)
if(query.getTaskCustomProps() != null) {
{ addTaskPropertiesToQuery(query.getTaskCustomProps(), historicQuery);
addTaskPropertiesToQuery(query.getTaskCustomProps(), historicQuery); }
}
if (query.getProcessCustomProps() != null)
if(query.getProcessCustomProps() != null) {
{ addProcessPropertiesToQuery(query.getProcessCustomProps(), historicQuery);
addProcessPropertiesToQuery(query.getProcessCustomProps(), historicQuery); }
}
if (query.isActive() != null)
if(query.isActive() != null) {
{ if (query.isActive())
if(query.isActive()) { {
historicQuery.processUnfinished(); historicQuery.processUnfinished();
} }
else else
{ {
historicQuery.processFinished(); historicQuery.processFinished();
} }
} }
// Order query // Order query
if(query.getOrderBy() != null) if (query.getOrderBy() != null)
{ {
orderQuery(historicQuery, query.getOrderBy()); orderQuery(historicQuery, query.getOrderBy());
} }
List<WorkflowTask> workflowTasks = new ArrayList<WorkflowTask>(); List<HistoricTaskInstance> results;
List<HistoricTaskInstance> historicTasks = historicQuery.list(); int limit = query.getLimit();
if (limit > 0)
for(HistoricTaskInstance historicTask : historicTasks) {
{ results = historicQuery.listPage(0, limit);
WorkflowTask wfTask = typeConverter.convert(historicTask); }
if(wfTask != null) else
{ {
// Converter returns null if the task belongs to deleted/cancelled WF results = historicQuery.list();
workflowTasks.add(wfTask); }
}
} List<WorkflowTask> workflowTasks = new ArrayList<WorkflowTask>();
return workflowTasks; for (HistoricTaskInstance historicTask : results)
{
WorkflowTask wfTask = typeConverter.convert(historicTask);
if (wfTask != null)
{
// Converter returns null if the task belongs to
// deleted/cancelled WF
workflowTasks.add(wfTask);
}
}
return workflowTasks;
} }
private void addTaskPropertiesToQuery(Map<QName, Object> taskCustomProps, private void addTaskPropertiesToQuery(Map<QName, Object> taskCustomProps,

View File

@@ -82,7 +82,8 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ
assertEquals("Approve", outcome); assertEquals("Approve", outcome);
} }
protected void testTaskQueryStartTaskCompleted(String workflowInstanceId, WorkflowTask startTask) @Override
protected void checkTaskQueryStartTaskCompleted(String workflowInstanceId, WorkflowTask startTask)
{ {
// In activiti, start-tasks only show up when the workflowInstanceId or taskId is passed // In activiti, start-tasks only show up when the workflowInstanceId or taskId is passed
List<String> expectedTasks = Arrays.asList(startTask.getId()); List<String> expectedTasks = Arrays.asList(startTask.getId());
@@ -98,7 +99,8 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ
checkTaskPropsQuery(expectedTasks, WorkflowTaskState.COMPLETED, workflowInstanceId); checkTaskPropsQuery(expectedTasks, WorkflowTaskState.COMPLETED, workflowInstanceId);
} }
protected void testTaskQueryTaskCompleted(String workflowInstanceId, @Override
protected void checkTaskQueryTaskCompleted(String workflowInstanceId,
WorkflowTask theTask, WorkflowTask startTask) WorkflowTask theTask, WorkflowTask startTask)
{ {
List<String> bothTasks = Arrays.asList(theTask.getId(), startTask.getId()); List<String> bothTasks = Arrays.asList(theTask.getId(), startTask.getId());
@@ -124,7 +126,8 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ
checkProcessPropsQuery(withoutStartTask, WorkflowTaskState.COMPLETED); checkProcessPropsQuery(withoutStartTask, WorkflowTaskState.COMPLETED);
} }
protected void testQueryTasksInactiveWorkflow(String workflowInstanceId) { @Override
protected void checkQueryTasksInactiveWorkflow(String workflowInstanceId) {
WorkflowTaskQuery taskQuery = createWorkflowTaskQuery(WorkflowTaskState.COMPLETED); WorkflowTaskQuery taskQuery = createWorkflowTaskQuery(WorkflowTaskState.COMPLETED);
taskQuery.setActive(false); taskQuery.setActive(false);

View File

@@ -176,6 +176,7 @@ public class WorkflowTaskQuery
} }
/** /**
* Filters ont he {@link WorkflowInstance} Id.
* @param processId * @param processId
*/ */
public void setProcessId(String processId) public void setProcessId(String processId)
@@ -192,6 +193,7 @@ public class WorkflowTaskQuery
} }
/** /**
* Filters on the {@link WorkflowDefinition} name.
* @param processName * @param processName
*/ */
public void setProcessName(QName processName) public void setProcessName(QName processName)