/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.test.api.history;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Tijs Rademakers
*/
public class HistoricTaskAndVariablesQueryTest extends PluggableActivitiTestCase {
private List<String> taskIds;
public void setUp() throws Exception {
identityService.saveUser(identityService.newUser("kermit"));
identityService.saveUser(identityService.newUser("gonzo"));
identityService.saveUser(identityService.newUser("fozzie"));
identityService.saveGroup(identityService.newGroup("management"));
identityService.saveGroup(identityService.newGroup("accountancy"));
identityService.createMembership("kermit", "management");
identityService.createMembership("kermit", "accountancy");
identityService.createMembership("fozzie", "management");
taskIds = generateTestTasks();
}
public void tearDown() throws Exception {
identityService.deleteGroup("accountancy");
identityService.deleteGroup("management");
identityService.deleteUser("fozzie");
identityService.deleteUser("gonzo");
identityService.deleteUser("kermit");
taskService.deleteTasks(taskIds, true);
}
@Deployment
public void testQuery() {
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().taskAssignee("gonzo").singleResult();
Map<String, Object> variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals(0, task.getProcessVariables().size());
assertNotNull(variableMap.get("testVar"));
assertEquals("someVariable", variableMap.get("testVar"));
assertNotNull(variableMap.get("testVar2"));
assertEquals(123, variableMap.get("testVar2"));
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().list();
assertEquals(3, tasks.size());
task = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().taskAssignee("gonzo").singleResult();
assertEquals(0, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
Map<String, Object> startMap = new HashMap<String, Object>();
startMap.put("processVar", true);
runtimeService.startProcessInstanceByKey("oneTaskProcess", startMap);
task = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().taskAssignee("kermit").singleResult();
assertEquals(1, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertTrue((Boolean) task.getProcessVariables().get("processVar"));
taskService.setVariable(task.getId(), "anotherProcessVar", 123);
taskService.setVariableLocal(task.getId(), "localVar", "test");
task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().taskAssignee("kermit").singleResult();
assertEquals(0, task.getProcessVariables().size());
assertEquals(1, task.getTaskLocalVariables().size());
assertEquals("test", task.getTaskLocalVariables().get("localVar"));
task = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().taskAssignee("kermit").singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
task = historyService.createHistoricTaskInstanceQuery().taskVariableValueLike("testVar", "someVaria%").singleResult();
assertNotNull(task);
assertEquals("gonzoTask", task.getName());
task = historyService.createHistoricTaskInstanceQuery().taskVariableValueLikeIgnoreCase("testVar", "somevaria%").singleResult();
assertNotNull(task);
assertEquals("gonzoTask", task.getName());
task = historyService.createHistoricTaskInstanceQuery().taskVariableValueLikeIgnoreCase("testVar", "somevaria2%").singleResult();
assertNull(task);
tasks = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().taskInvolvedUser("kermit").orderByTaskCreateTime().asc().list();
assertEquals(3, tasks.size());
assertEquals(1, tasks.get(0).getTaskLocalVariables().size());
assertEquals("test", tasks.get(0).getTaskLocalVariables().get("test"));
assertEquals(0, tasks.get(0).getProcessVariables().size());
tasks = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().taskInvolvedUser("kermit").orderByTaskCreateTime().asc().list();
assertEquals(3, tasks.size());
assertEquals(0, tasks.get(0).getProcessVariables().size());
assertEquals(0, tasks.get(0).getTaskLocalVariables().size());
task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().taskAssignee("kermit").taskVariableValueEquals("localVar", "test").singleResult();
assertEquals(0, task.getProcessVariables().size());
assertEquals(1, task.getTaskLocalVariables().size());
assertEquals("test", task.getTaskLocalVariables().get("localVar"));
task = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().taskAssignee("kermit").taskVariableValueEquals("localVar", "test").singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().includeProcessVariables().taskAssignee("kermit").singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(1, task.getTaskLocalVariables().size());
assertEquals("test", task.getTaskLocalVariables().get("localVar"));
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
task = historyService.createHistoricTaskInstanceQuery().taskAssignee("gonzo").singleResult();
taskService.complete(task.getId());
task = (HistoricTaskInstance) historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().finished().singleResult();
variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals(0, task.getProcessVariables().size());
assertNotNull(variableMap.get("testVar"));
assertEquals("someVariable", variableMap.get("testVar"));
assertNotNull(variableMap.get("testVar2"));
assertEquals(123, variableMap.get("testVar2"));
}
}
@Deployment
public void testOrQuery() {
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
HistoricTaskInstance task = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables()
.or()
.taskAssignee("gonzo")
.endOr()
.singleResult();
Map<String, Object> variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals(0, task.getProcessVariables().size());
assertNotNull(variableMap.get("testVar"));
assertEquals("someVariable", variableMap.get("testVar"));
assertNotNull(variableMap.get("testVar2"));
assertEquals(123, variableMap.get("testVar2"));
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().list();
assertEquals(3, tasks.size());
task = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.or()
.taskAssignee("gonzo")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(0, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
Map<String, Object> startMap = new HashMap<String, Object>();
startMap.put("processVar", true);
runtimeService.startProcessInstanceByKey("oneTaskProcess", startMap);
task = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.or()
.taskAssignee("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(1, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertTrue((Boolean) task.getProcessVariables().get("processVar"));
task = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.or()
.taskAssignee("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.or()
.processDefinitionKey("oneTaskProcess")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertNotNull(task);
assertEquals(1, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertTrue((Boolean) task.getProcessVariables().get("processVar"));
taskService.setVariable(task.getId(), "anotherProcessVar", 123);
taskService.setVariableLocal(task.getId(), "localVar", "test");
task = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables()
.or()
.taskAssignee("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(0, task.getProcessVariables().size());
assertEquals(1, task.getTaskLocalVariables().size());
assertEquals("test", task.getTaskLocalVariables().get("localVar"));
task = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.or()
.taskAssignee("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
task = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables()
.or()
.taskAssignee("nonexisting")
.taskVariableValueLike("testVar", "someVar%")
.endOr()
.singleResult();
assertEquals(2, task.getTaskLocalVariables().size());
assertEquals(0, task.getProcessVariables().size());
assertEquals("someVariable", task.getTaskLocalVariables().get("testVar"));
assertEquals(123, task.getTaskLocalVariables().get("testVar2"));
task = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables()
.or()
.taskAssignee("nonexisting")
.taskVariableValueLikeIgnoreCase("testVar", "somevar%")
.endOr()
.singleResult();
assertEquals(2, task.getTaskLocalVariables().size());
assertEquals(0, task.getProcessVariables().size());
assertEquals("someVariable", task.getTaskLocalVariables().get("testVar"));
assertEquals(123, task.getTaskLocalVariables().get("testVar2"));
task = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables()
.or()
.taskAssignee("nonexisting")
.taskVariableValueLike("testVar", "someVar2%")
.endOr()
.singleResult();
assertNull(task);
tasks = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables()
.or()
.taskInvolvedUser("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.orderByTaskCreateTime().asc().list();
assertEquals(3, tasks.size());
assertEquals(1, tasks.get(0).getTaskLocalVariables().size());
assertEquals("test", tasks.get(0).getTaskLocalVariables().get("test"));
assertEquals(0, tasks.get(0).getProcessVariables().size());
tasks = historyService.createHistoricTaskInstanceQuery().includeProcessVariables()
.or()
.taskInvolvedUser("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.orderByTaskCreateTime().asc().list();
assertEquals(3, tasks.size());
assertEquals(0, tasks.get(0).getProcessVariables().size());
assertEquals(0, tasks.get(0).getTaskLocalVariables().size());
task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables()
.taskAssignee("kermit")
.or()
.taskVariableValueEquals("localVar", "test")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(0, task.getProcessVariables().size());
assertEquals(1, task.getTaskLocalVariables().size());
assertEquals("test", task.getTaskLocalVariables().get("localVar"));
task = historyService.createHistoricTaskInstanceQuery().includeProcessVariables()
.taskAssignee("kermit")
.or()
.taskVariableValueEquals("localVar", "test")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(0, task.getTaskLocalVariables().size());
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables()
.includeProcessVariables()
.or()
.taskAssignee("kermit")
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(1, task.getTaskLocalVariables().size());
assertEquals("test", task.getTaskLocalVariables().get("localVar"));
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
task = historyService.createHistoricTaskInstanceQuery()
.taskAssignee("gonzo")
.singleResult();
taskService.complete(task.getId());
task = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables()
.or()
.finished()
.taskVariableValueEquals("localVar", "nonExisting")
.endOr()
.singleResult();
variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals(0, task.getProcessVariables().size());
assertNotNull(variableMap.get("testVar"));
assertEquals("someVariable", variableMap.get("testVar"));
assertNotNull(variableMap.get("testVar2"));
assertEquals(123, variableMap.get("testVar2"));
}
}
@Deployment
public void testOrQueryMultipleVariableValues() {
Map<String, Object> startMap = new HashMap<String, Object>();
startMap.put("processVar", true);
startMap.put("anotherProcessVar", 123);
runtimeService.startProcessInstanceByKey("oneTaskProcess", startMap);
startMap.put("anotherProcessVar", 999);
runtimeService.startProcessInstanceByKey("oneTaskProcess", startMap);
HistoricTaskInstanceQuery query0 = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().or();
for (int i = 0; i < 20; i++) {
query0 = query0.processVariableValueEquals("anotherProcessVar", i);
}
query0 = query0.endOr();
assertNull(query0.singleResult());
HistoricTaskInstanceQuery query1 = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().or().processVariableValueEquals("anotherProcessVar", 123);
for (int i = 0; i < 20; i++) {
query1 = query1.processVariableValueEquals("anotherProcessVar", i);
}
query1 = query1.endOr();
HistoricTaskInstance task = query1.singleResult();
assertEquals(2, task.getProcessVariables().size());
assertEquals(true, task.getProcessVariables().get("processVar"));
assertEquals(123, task.getProcessVariables().get("anotherProcessVar"));
}
@Deployment
public void testCandidate() {
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("kermit").list();
assertEquals(3, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("gonzo").list();
assertEquals(0, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("fozzie").list();
assertEquals(1, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateGroup("management").list();
assertEquals(1, tasks.size());
List<String> groups = new ArrayList<String>();
groups.add("management");
groups.add("accountancy");
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateGroupIn(groups).list();
assertEquals(1, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("kermit").taskCandidateGroupIn(groups).list();
assertEquals(3, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("gonzo").taskCandidateGroupIn(groups).list();
assertEquals(1, tasks.size());
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.complete(task.getId());
assertEquals(0, taskService.createTaskQuery().processInstanceId(processInstance.getId()).count());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("kermit").list();
assertEquals(3, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("gonzo").list();
assertEquals(0, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("fozzie").list();
assertEquals(1, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateGroup("management").list();
assertEquals(1, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("kermit").taskCandidateGroup("management").list();
assertEquals(3, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("gonzo").taskCandidateGroup("management").list();
assertEquals(1, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateUser("gonzo").taskCandidateGroup("invalid").list();
assertEquals(0, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery().taskCandidateGroupIn(groups).list();
assertEquals(1, tasks.size());
}
}
public void testQueryWithPagingAndVariables() {
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) {
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.includeTaskLocalVariables()
.orderByTaskPriority()
.desc()
.listPage(0, 1);
assertEquals(1, tasks.size());
HistoricTaskInstance task = tasks.get(0);
Map<String, Object> variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals("someVariable", variableMap.get("testVar"));
assertEquals(123, variableMap.get("testVar2"));
tasks = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.includeTaskLocalVariables()
.orderByTaskPriority()
.asc()
.listPage(1, 2);
assertEquals(2, tasks.size());
task = tasks.get(1);
variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals("someVariable", variableMap.get("testVar"));
assertEquals(123, variableMap.get("testVar2"));
tasks = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.includeTaskLocalVariables()
.orderByTaskPriority()
.asc()
.listPage(2, 4);
assertEquals(1, tasks.size());
task = tasks.get(0);
variableMap = task.getTaskLocalVariables();
assertEquals(2, variableMap.size());
assertEquals("someVariable", variableMap.get("testVar"));
assertEquals(123, variableMap.get("testVar2"));
tasks = historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.includeTaskLocalVariables()
.orderByTaskPriority()
.asc()
.listPage(4, 2);
assertEquals(0, tasks.size());
}
}
@Deployment(resources={"org/activiti/engine/test/api/task/TaskQueryTest.testProcessDefinition.bpmn20.xml"})
public void testWithoutDueDateQuery() throws Exception {
if(processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstance.getId()).withoutTaskDueDate().singleResult();
assertNotNull(historicTask);
assertNull(historicTask.getDueDate());
// Set due-date on task
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
Date dueDate = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").parse("01/02/2003 01:12:13");
task.setDueDate(dueDate);
taskService.saveTask(task);
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstance.getId()).withoutTaskDueDate().count());
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
// Clear due-date on task
task.setDueDate(null);
taskService.saveTask(task);
assertEquals(1, historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstance.getId()).withoutTaskDueDate().count());
}
}
// Unit test for https://activiti.atlassian.net/browse/ACT-4152
public void testQueryWithIncludeTaskVariableAndTaskCategory() {
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().taskAssignee("gonzo").list();
for (HistoricTaskInstance task : tasks) {
assertNotNull(task.getCategory());
assertEquals("testCategory", task.getCategory());
}
tasks = historyService.createHistoricTaskInstanceQuery().taskAssignee("gonzo").includeTaskLocalVariables().list();
for (HistoricTaskInstance task : tasks) {
assertNotNull(task.getCategory());
assertEquals("testCategory", task.getCategory());
}
tasks = historyService.createHistoricTaskInstanceQuery().taskAssignee("gonzo").includeProcessVariables().list();
for (HistoricTaskInstance task : tasks) {
assertNotNull(task.getCategory());
assertEquals("testCategory", task.getCategory());
}
}
/**
* Generates some test tasks. - 2 tasks where kermit is a candidate and 1 task
* where gonzo is assignee
*/
private List<String> generateTestTasks() throws Exception {
List<String> ids = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS");
// 2 tasks for kermit
processEngineConfiguration.getClock().setCurrentTime(sdf.parse("01/01/2001 01:01:01.000"));
for (int i = 0; i < 2; i++) {
Task task = taskService.newTask();
task.setName("testTask");
task.setDescription("testTask description");
task.setPriority(3);
taskService.saveTask(task);
ids.add(task.getId());
taskService.setVariableLocal(task.getId(), "test", "test");
taskService.addCandidateUser(task.getId(), "kermit");
}
processEngineConfiguration.getClock().setCurrentTime(sdf.parse("02/02/2002 02:02:02.000"));
// 1 task for gonzo
Task task = taskService.newTask();
task.setName("gonzoTask");
task.setDescription("gonzo description");
task.setPriority(4);
task.setCategory("testCategory");
taskService.saveTask(task);
taskService.setAssignee(task.getId(), "gonzo");
taskService.setVariableLocal(task.getId(), "testVar", "someVariable");
taskService.setVariableLocal(task.getId(), "testVar2", 123);
ids.add(task.getId());
return ids;
}
}