/* 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.history; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.ActivitiIllegalArgumentException; import org.activiti.engine.ActivitiObjectNotFoundException; import org.activiti.engine.history.HistoricIdentityLink; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.impl.persistence.entity.TaskEntity; 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 Tom Baeyens * @author Frederik Heremans */ public class HistoricTaskInstanceTest extends PluggableActivitiTestCase { @Deployment public void testHistoricTaskInstance() throws Exception { Map<String, Object> varMap = new HashMap<String, Object>(); varMap.put("formKeyVar", "expressionFormKey"); String processInstanceId = runtimeService.startProcessInstanceByKey("HistoricTaskInstanceTest", varMap).getId(); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); // Set priority to non-default value Task runtimeTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); runtimeTask.setPriority(1234); // Set due-date Date dueDate = sdf.parse("01/02/2003 04:05:06"); runtimeTask.setDueDate(dueDate); taskService.saveTask(runtimeTask); String taskId = runtimeTask.getId(); String taskDefinitionKey = runtimeTask.getTaskDefinitionKey(); assertEquals(1, historyService.createHistoricTaskInstanceQuery().count()); HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().singleResult(); assertEquals(taskId, historicTaskInstance.getId()); assertEquals(1234, historicTaskInstance.getPriority()); assertEquals("Clean up", historicTaskInstance.getName()); assertEquals("Schedule an engineering meeting for next week with the new hire.", historicTaskInstance.getDescription()); assertEquals(dueDate, historicTaskInstance.getDueDate()); assertEquals("kermit", historicTaskInstance.getAssignee()); assertEquals(taskDefinitionKey, historicTaskInstance.getTaskDefinitionKey()); assertEquals("expressionFormKey", historicTaskInstance.getFormKey()); assertNull(historicTaskInstance.getEndTime()); assertNull(historicTaskInstance.getDurationInMillis()); assertNull(historicTaskInstance.getWorkTimeInMillis()); runtimeService.setVariable(processInstanceId, "deadline", "yesterday"); taskService.claim(taskId, "kermit"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().count()); historicTaskInstance = historyService.createHistoricTaskInstanceQuery().singleResult(); assertNotNull(historicTaskInstance.getClaimTime()); assertNull(historicTaskInstance.getWorkTimeInMillis()); assertEquals("expressionFormKey", historicTaskInstance.getFormKey()); taskService.complete(taskId); assertEquals(1, historyService.createHistoricTaskInstanceQuery().count()); historicTaskInstance = historyService.createHistoricTaskInstanceQuery().singleResult(); assertEquals(taskId, historicTaskInstance.getId()); assertEquals(1234, historicTaskInstance.getPriority()); assertEquals("Clean up", historicTaskInstance.getName()); assertEquals("Schedule an engineering meeting for next week with the new hire.", historicTaskInstance.getDescription()); assertEquals(dueDate, historicTaskInstance.getDueDate()); assertEquals("kermit", historicTaskInstance.getAssignee()); assertEquals(TaskEntity.DELETE_REASON_COMPLETED, historicTaskInstance.getDeleteReason()); assertEquals(taskDefinitionKey, historicTaskInstance.getTaskDefinitionKey()); assertEquals("expressionFormKey", historicTaskInstance.getFormKey()); assertNotNull(historicTaskInstance.getEndTime()); assertNotNull(historicTaskInstance.getDurationInMillis()); assertNotNull(historicTaskInstance.getClaimTime()); assertNotNull(historicTaskInstance.getWorkTimeInMillis()); historyService.deleteHistoricTaskInstance(taskId); assertEquals(0, historyService.createHistoricTaskInstanceQuery().count()); } public void testDeleteHistoricTaskInstance() throws Exception { // deleting unexisting historic task instance should be silently ignored historyService.deleteHistoricTaskInstance("unexistingId"); } @Deployment public void testHistoricTaskInstanceQuery() throws Exception { Calendar start = Calendar.getInstance(); start.set(Calendar.MILLISECOND, 0); processEngineConfiguration.getClock().setCurrentTime(start.getTime()); // First instance is finished ProcessInstance finishedInstance = runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest", "myBusinessKey"); processEngineConfiguration.getClock().reset(); // Set priority to non-default value Task task = taskService.createTaskQuery().processInstanceId(finishedInstance.getId()).singleResult(); task.setPriority(1234); task.setOwner("fozzie"); Date dueDate = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").parse("01/02/2003 04:05:06"); task.setDueDate(dueDate); taskService.saveTask(task); taskService.addUserIdentityLink(task.getId(), "gonzo", "someType"); // Complete the task String taskId = task.getId(); taskService.complete(taskId); // Task id assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskId(taskId).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskId("unexistingtaskid").count()); // Name assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskName("Clean up").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskName("unexistingname").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskNameLike("Clean u%").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskNameLike("%lean up").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskNameLike("%lean u%").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskNameLike("%unexistingname%").count()); // Description assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescription("Historic task description").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDescription("unexistingdescription").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%task description").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("Historic task %").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%task%").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%unexistingdescripton%").count()); // Execution id assertEquals(1, historyService.createHistoricTaskInstanceQuery().executionId(finishedInstance.getId()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().executionId("unexistingexecution").count()); // Process instance id assertEquals(1, historyService.createHistoricTaskInstanceQuery().processInstanceId(finishedInstance.getId()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processInstanceId("unexistingid").count()); // Process instance business key assertEquals(1, historyService.createHistoricTaskInstanceQuery().processInstanceBusinessKey("myBusinessKey").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processInstanceBusinessKey("unexistingKey").count()); // Process definition id assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionId(finishedInstance.getProcessDefinitionId()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionId("unexistingdefinitionid").count()); // Process definition name assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionName("Historic task query test process").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionName("unexistingdefinitionname").count()); // Process definition key assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionKey("HistoricTaskQueryTest").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionKey("unexistingdefinitionkey").count()); // Process definition key in List<String> includeIds = new ArrayList<String>(); assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionKeyIn(includeIds).count()); includeIds.add("unexistingProcessDefinition"); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionKeyIn(includeIds).count()); includeIds.add("HistoricTaskQueryTest"); assertEquals(1, historyService.createHistoricProcessInstanceQuery().processDefinitionKeyIn(includeIds).count()); // Form key HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() .processInstanceId(finishedInstance.getId()).singleResult(); assertEquals("testFormKey", historicTask.getFormKey()); // Assignee assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssignee("kermit").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskAssignee("johndoe").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("%ermit").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("kermi%").count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("%ermi%").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("%johndoe%").count()); // Delete reason assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDeleteReason(TaskEntity.DELETE_REASON_COMPLETED).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDeleteReason("deleted").count()); // Task definition ID assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDefinitionKey("task").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDefinitionKey("unexistingkey").count()); // Task priority assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskPriority(1234).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskPriority(5678).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskMinPriority(1234).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskMinPriority(1000).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskMinPriority(1300).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskMaxPriority(1234).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskMaxPriority(1300).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskMaxPriority(1000).count()); // Due date Calendar anHourAgo = Calendar.getInstance(); anHourAgo.setTime(dueDate); anHourAgo.add(Calendar.HOUR, -1); Calendar anHourLater = Calendar.getInstance(); anHourLater.setTime(dueDate); anHourLater.add(Calendar.HOUR, 1); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDueDate(dueDate).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueDate(anHourAgo.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueDate(anHourLater.getTime()).count()); // Due date before assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDueBefore(anHourLater.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueBefore(anHourAgo.getTime()).count()); // Due date after assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDueAfter(anHourAgo.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueAfter(anHourLater.getTime()).count()); anHourAgo = new GregorianCalendar(); anHourAgo.setTime(start.getTime()); anHourAgo.add(Calendar.HOUR, -1); anHourLater = Calendar.getInstance(); anHourLater.setTime(start.getTime()); anHourLater.add(Calendar.HOUR, 1); // Start date assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskCreatedOn(start.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskCreatedOn(anHourAgo.getTime()).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskCreatedAfter(anHourAgo.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskCreatedAfter(anHourLater.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskCreatedBefore(anHourAgo.getTime()).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskCreatedBefore(anHourLater.getTime()).count()); // Completed date assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskCompletedAfter(anHourAgo.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskCompletedAfter(anHourLater.getTime()).count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskCompletedBefore(anHourAgo.getTime()).count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskCompletedBefore(anHourLater.getTime()).count()); // Filter based on identity-links // Assignee is involved assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskInvolvedUser("kermit").count()); // Owner is involved assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskInvolvedUser("fozzie").count()); // Manually involved person assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskInvolvedUser("gonzo").count()); // Finished and Unfinished - Add anther other instance that has a running task (unfinished) runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().finished().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().unfinished().count()); } @Deployment public void testHistoricTaskInstanceOrQuery() throws Exception { Calendar start = Calendar.getInstance(); start.set(Calendar.MILLISECOND, 0); processEngineConfiguration.getClock().setCurrentTime(start.getTime()); // First instance is finished ProcessInstance finishedInstance = runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest", "myBusinessKey"); processEngineConfiguration.getClock().reset(); // Set priority to non-default value Task task = taskService.createTaskQuery().processInstanceId(finishedInstance.getId()).singleResult(); task.setPriority(1234); task.setOwner("fozzie"); Date dueDate = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").parse("01/02/2003 04:05:06"); task.setDueDate(dueDate); taskService.saveTask(task); taskService.addUserIdentityLink(task.getId(), "gonzo", "someType"); // Complete the task String taskId = task.getId(); taskService.complete(taskId); // Task id assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskId(taskId).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskId(taskId).or().taskId(taskId).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskId("unexistingtaskid").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskId("unexistingtaskid").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskId(taskId).taskName("Clean up").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskId("unexistingtaskid").taskName("Clean up").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskId("unexistingtaskid").taskName("unexistingname").endOr().count()); // Name assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskName("Clean up").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskName("unexistingname").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskNameLike("Clean u%").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskNameLike("%unexistingname%").endOr().count()); final List<String> taskNameList = new ArrayList<String>(1); taskNameList.add("Clean up"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskNameIn(taskNameList).endOr().count()); taskNameList.clear(); taskNameList.add("unexistingname"); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskNameIn(taskNameList).endOr().count()); taskNameList.clear(); taskNameList.add("clean up"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskNameInIgnoreCase(taskNameList).endOr().count()); taskNameList.clear(); taskNameList.add("unexistingname"); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskNameInIgnoreCase(taskNameList).endOr().count()); taskNameList.clear(); taskNameList.add("clean up"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskName("Clean up").endOr().or().taskNameInIgnoreCase(taskNameList).endOr().count()); taskNameList.clear(); taskNameList.add("unexistingname"); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskName("Clean up").endOr().or().taskNameInIgnoreCase(taskNameList).endOr().count()); // Description assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDescription("Historic task description").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDescription("unexistingdescription").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDescriptionLike("%task description").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDescriptionLike("%task description").taskDescription("unexistingdescription").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%unexistingdescripton%").count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDescriptionLike("%unexistingdescripton%").taskDescription("unexistingdescription").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDescription("Historic task description").endOr().or().taskDescriptionLike("%task description").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDescription("Historic task description").endOr().or().taskDescriptionLike("%task description2").endOr().count()); // Execution id assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().executionId(finishedInstance.getId()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().executionId("unexistingexecution").endOr().count()); // Process instance id assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().processInstanceId(finishedInstance.getId()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processInstanceId("unexistingid").endOr().count()); // Process instance business key assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().processInstanceBusinessKey("myBusinessKey").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processInstanceBusinessKey("unexistingKey").endOr().count()); // Process definition id assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().processDefinitionId(finishedInstance.getProcessDefinitionId()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processDefinitionId("unexistingdefinitionid").endOr().count()); // Process definition name assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().processDefinitionName("Historic task query test process").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processDefinitionName("unexistingdefinitionname").endOr().count()); // Process definition key assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().processDefinitionKey("HistoricTaskQueryTest").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processDefinitionKey("unexistingdefinitionkey").endOr().count()); // Process definition key and ad hoc task Task adhocTask = taskService.newTask(); taskService.saveTask(adhocTask); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskId(adhocTask.getId()).processDefinitionKey("unexistingdefinitionkey").endOr().count()); taskService.deleteTask(adhocTask.getId(), true); // Process definition key in List<String> includeIds = new ArrayList<String>(); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processDefinitionKey("unexistingdefinitionkey").processDefinitionKeyIn(includeIds).endOr().count()); includeIds.add("unexistingProcessDefinition"); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().processDefinitionKey("unexistingdefinitionkey").processDefinitionKeyIn(includeIds).endOr().count()); includeIds.add("unexistingProcessDefinition"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().processDefinitionKey("HistoricTaskQueryTest").processDefinitionKeyIn(includeIds).endOr().count()); includeIds.add("HistoricTaskQueryTest"); assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processDefinitionKey("unexistingdefinitionkey").processDefinitionKeyIn(includeIds).endOr().count()); // Assignee assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskAssignee("kermit").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskAssignee("johndoe").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskAssigneeLike("%ermit").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskAssigneeLike("%johndoe%").endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskAssignee("kermit").endOr().or().taskAssigneeLike("%ermit").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskAssignee("kermit").endOr().or().taskAssigneeLike("%johndoe%").endOr().count()); // Delete reason assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDeleteReason(TaskEntity.DELETE_REASON_COMPLETED).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDeleteReason("deleted").endOr().count()); // Task definition ID assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDefinitionKey("task").endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDefinitionKey("unexistingkey").endOr().count()); // Task priority assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskPriority(1234).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskPriority(5678).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskMinPriority(1234).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskMinPriority(1000).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskMinPriority(1300).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskMaxPriority(1234).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskMaxPriority(1300).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskMaxPriority(1000).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskPriority(1234).endOr().or().taskMinPriority(1234).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskPriority(1234).endOr().or().taskMinPriority(1300).endOr().count()); // Due date Calendar anHourAgo = Calendar.getInstance(); anHourAgo.setTime(dueDate); anHourAgo.add(Calendar.HOUR, -1); Calendar anHourLater = Calendar.getInstance(); anHourLater.setTime(dueDate); anHourLater.add(Calendar.HOUR, 1); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDueDate(dueDate).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDueDate(anHourAgo.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDueDate(anHourLater.getTime()).endOr().count()); // Due date before assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDueBefore(anHourLater.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDueBefore(anHourAgo.getTime()).endOr().count()); // Due date after assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskDueAfter(anHourAgo.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskDueAfter(anHourLater.getTime()).endOr().count()); anHourAgo = new GregorianCalendar(); anHourAgo.setTime(start.getTime()); anHourAgo.add(Calendar.HOUR, -1); anHourLater = Calendar.getInstance(); anHourLater.setTime(start.getTime()); anHourLater.add(Calendar.HOUR, 1); // Start date assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskCreatedOn(start.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskCreatedOn(anHourAgo.getTime()).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskCreatedAfter(anHourAgo.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskCreatedAfter(anHourLater.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskCreatedBefore(anHourAgo.getTime()).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskCreatedBefore(anHourLater.getTime()).endOr().count()); // Completed date assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskCompletedAfter(anHourAgo.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskCompletedAfter(anHourLater.getTime()).endOr().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().or().taskCompletedBefore(anHourAgo.getTime()).endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskCompletedBefore(anHourLater.getTime()).endOr().count()); // Filter based on identity-links // Assignee is involved assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskInvolvedUser("kermit").endOr().count()); // Owner is involved assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskInvolvedUser("fozzie").endOr().count()); // Manually involved person assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().taskInvolvedUser("gonzo").endOr().count()); // Finished and Unfinished - Add anther other instance that has a running task (unfinished) runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest"); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().finished().endOr().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().or().unfinished().endOr().count()); } @Deployment public void testHistoricTaskInstanceQueryProcessFinished() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("TwoTaskHistoricTaskQueryTest"); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); // Running task on running process should be available assertEquals(1, historyService.createHistoricTaskInstanceQuery().processUnfinished().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processFinished().count()); // Finished and running task on running process should be available taskService.complete(task.getId()); assertEquals(2, historyService.createHistoricTaskInstanceQuery().processUnfinished().count()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processFinished().count()); // 2 finished tasks are found for finished process after completing last task of process task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); taskService.complete(task.getId()); assertEquals(0, historyService.createHistoricTaskInstanceQuery().processUnfinished().count()); assertEquals(2, historyService.createHistoricTaskInstanceQuery().processFinished().count()); } @Deployment public void testHistoricTaskInstanceQuerySorting() { ProcessInstance instance = runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest"); String taskId = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult().getId(); taskService.complete(taskId); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByDeleteReason().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByExecutionId().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricActivityInstanceId().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricTaskInstanceStartTime().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessDefinitionId().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessInstanceId().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDescription().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskName().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDefinitionKey().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskPriority().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskAssignee().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskId().asc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByDeleteReason().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByExecutionId().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricActivityInstanceId().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricTaskInstanceStartTime().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessDefinitionId().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessInstanceId().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDescription().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskName().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDefinitionKey().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskPriority().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskAssignee().desc().count()); assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskId().desc().count()); } @Deployment public void testHistoricIdentityLinksOnTask() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("historicIdentityLinks"); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); assertNotNull(task); // Set additional identity-link not coming from process taskService.addUserIdentityLink(task.getId(), "gonzo", "customUseridentityLink"); assertEquals(4, taskService.getIdentityLinksForTask(task.getId()).size()); // Check historic identity-links when task is still active List<HistoricIdentityLink> historicIdentityLinks = historyService.getHistoricIdentityLinksForTask(task.getId()); assertEquals(4, historicIdentityLinks.size()); // Validate all links boolean foundCandidateUser= false, foundCandidateGroup = false, foundAssignee = false, foundCustom = false; for(HistoricIdentityLink link : historicIdentityLinks) { assertEquals(task.getId(), link.getTaskId()); if(link.getGroupId() != null) { assertEquals("sales", link.getGroupId()); foundCandidateGroup = true; } else { if(link.getType().equals("candidate")) { assertEquals("fozzie", link.getUserId()); foundCandidateUser = true; } else if(link.getType().equals("assignee")){ assertEquals("kermit", link.getUserId()); foundAssignee = true; } else if(link.getType().equals("customUseridentityLink")){ assertEquals("gonzo", link.getUserId()); foundCustom = true; } } } assertTrue(foundAssignee); assertTrue(foundCandidateGroup); assertTrue(foundCandidateUser); assertTrue(foundCustom); // Now complete the task and check if links are still there taskService.complete(task.getId()); assertEquals(4, historyService.getHistoricIdentityLinksForTask(task.getId()).size()); // After deleting historic task, exception should be thrown when trying to get links historyService.deleteHistoricTaskInstance(task.getId()); try { historyService.getHistoricIdentityLinksForTask(task.getId()).size(); fail("Exception expected"); } catch(ActivitiObjectNotFoundException aonfe) { assertEquals(HistoricTaskInstance.class, aonfe.getObjectClass()); } } public void testInvalidSorting() { try { historyService.createHistoricTaskInstanceQuery().asc(); fail(); } catch (ActivitiIllegalArgumentException e) { } try { historyService.createHistoricTaskInstanceQuery().desc(); fail(); } catch (ActivitiIllegalArgumentException e) { } try { historyService.createHistoricTaskInstanceQuery().orderByProcessInstanceId().list(); fail(); } catch (ActivitiIllegalArgumentException e) { } } /** * Test to validate fix for ACT-1939: HistoryService loads invalid task local variables for completed task */ @Deployment public void testVariableUpdateOrderHistoricTaskInstance() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("historicTask"); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); assertNotNull(task); // Update task and process-variable 10 times for(int i=0; i<10; i++) { taskService.setVariableLocal(task.getId(), "taskVar", i); runtimeService.setVariable(task.getExecutionId(), "procVar", i); } taskService.complete(task.getId()); // Check if all variables have the value for the latest revision HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery() .taskId(task.getId()) .includeProcessVariables() .singleResult(); Object varValue = taskInstance.getProcessVariables().get("procVar"); assertEquals(9, varValue); taskInstance = historyService.createHistoricTaskInstanceQuery() .taskId(task.getId()) .includeTaskLocalVariables() .singleResult(); varValue = taskInstance.getTaskLocalVariables().get("taskVar"); assertEquals(9, varValue); } }