/* 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.util.ArrayList;
import java.util.Arrays;
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.history.HistoricIdentityLink;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceBuilder;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Tom Baeyens
* @author Joram Barrez
*/
public class HistoricProcessInstanceTest extends PluggableActivitiTestCase {
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricDataCreatedForProcessExecution() {
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.YEAR, 2010);
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DAY_OF_MONTH, 30);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date noon = calendar.getTime();
processEngineConfiguration.getClock().setCurrentTime(noon);
final ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", "myBusinessKey");
assertEquals(1, historyService.createHistoricProcessInstanceQuery().unfinished().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finished().count());
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(historicProcessInstance);
assertEquals(processInstance.getId(), historicProcessInstance.getId());
assertEquals(processInstance.getBusinessKey(), historicProcessInstance.getBusinessKey());
assertEquals(processInstance.getProcessDefinitionId(), historicProcessInstance.getProcessDefinitionId());
assertEquals(noon, historicProcessInstance.getStartTime());
assertNull(historicProcessInstance.getEndTime());
assertNull(historicProcessInstance.getDurationInMillis());
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
assertEquals(1, tasks.size());
// in this test scenario we assume that 25 seconds after the process start, the
// user completes the task (yes! he must be almost as fast as me)
Date twentyFiveSecsAfterNoon = new Date(noon.getTime() + 25*1000);
processEngineConfiguration.getClock().setCurrentTime(twentyFiveSecsAfterNoon);
taskService.complete(tasks.get(0).getId());
historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(historicProcessInstance);
assertEquals(processInstance.getId(), historicProcessInstance.getId());
assertEquals(processInstance.getProcessDefinitionId(), historicProcessInstance.getProcessDefinitionId());
assertEquals(noon, historicProcessInstance.getStartTime());
assertEquals(twentyFiveSecsAfterNoon, historicProcessInstance.getEndTime());
assertEquals(new Long(25*1000), historicProcessInstance.getDurationInMillis());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().unfinished().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().finished().count());
}
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testDeleteProcessInstanceHistoryCreated() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
assertNotNull(processInstance);
// delete process instance should not delete the history
runtimeService.deleteProcessInstance(processInstance.getId(), "cancel");
HistoricProcessInstance historicProcessInstance =
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(historicProcessInstance.getEndTime());
}
/*@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricProcessInstanceVariables() {
Map<String,Object> vars = new HashMap<String,Object>();
vars.put("foo", "bar");
vars.put("baz", "boo");
runtimeService.startProcessInstanceByKey("oneTaskProcess", vars);
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processVariableEquals("foo", "bar").count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processVariableEquals("baz", "boo").count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processVariableEquals("foo", "bar").processVariableEquals("baz", "boo").count());
}*/
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricProcessInstanceQuery() {
Calendar startTime = Calendar.getInstance();
processEngineConfiguration.getClock().setCurrentTime(startTime.getTime());
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", "businessKey123");
runtimeService.addUserIdentityLink(processInstance.getId(), "kermit", "someType");
runtimeService.setProcessInstanceName(processInstance.getId(), "The name");
Calendar hourAgo = Calendar.getInstance();
hourAgo.add(Calendar.HOUR_OF_DAY, -1);
Calendar hourFromNow = Calendar.getInstance();
hourFromNow.add(Calendar.HOUR_OF_DAY, 1);
// Name and name like
assertEquals("The name", historyService.createHistoricProcessInstanceQuery().processInstanceName("The name").singleResult().getName());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceName("The name").count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().processInstanceName("Other name").count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceNameLike("% name").count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().processInstanceNameLike("%nope").count());
// Query after update name
runtimeService.setProcessInstanceName(processInstance.getId(), "New name");
assertEquals("New name", historyService.createHistoricProcessInstanceQuery().processInstanceName("New name").singleResult().getName());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceName("New name").count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().processInstanceName("The name").count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceNameLike("New %").count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().processInstanceNameLike("The %").count());
// Start/end dates
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finishedBefore(hourAgo.getTime()).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finishedBefore(hourFromNow.getTime()).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finishedAfter(hourAgo.getTime()).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finishedAfter(hourFromNow.getTime()).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().startedBefore(hourFromNow.getTime()).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().startedBefore(hourAgo.getTime()).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().startedAfter(hourAgo.getTime()).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().startedAfter(hourFromNow.getTime()).count());
// General fields
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finished().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processDefinitionId(processInstance.getProcessDefinitionId()).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processDefinitionKey("oneTaskProcess").count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processDefinitionKeyIn(Arrays.asList("oneTaskProcess")).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processDefinitionKeyIn(Arrays.asList("undefined", "oneTaskProcess")).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().processDefinitionKeyIn(Arrays.asList("undefined1", "undefined2")).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey("businessKey123").count());
List<String> exludeIds = new ArrayList<String>();
exludeIds.add("unexistingProcessDefinition");
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processDefinitionKeyNotIn(exludeIds).count());
exludeIds.add("oneTaskProcess");
assertEquals(0, historyService.createHistoricProcessInstanceQuery().processDefinitionKeyNotIn(exludeIds).count());
// After finishing process
taskService.complete(taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult().getId());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().finished().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finishedBefore(hourAgo.getTime()).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().finishedBefore(hourFromNow.getTime()).count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().finishedAfter(hourAgo.getTime()).count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().finishedAfter(hourFromNow.getTime()).count());
// Check identity links
assertEquals(1, historyService.createHistoricProcessInstanceQuery().involvedUser("kermit").count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().involvedUser("gonzo").count());
}
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricProcessInstanceOrQuery() {
Calendar startTime = Calendar.getInstance();
processEngineConfiguration.getClock().setCurrentTime(startTime.getTime());
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", "businessKey123");
runtimeService.addUserIdentityLink(processInstance.getId(), "kermit", "someType");
runtimeService.setProcessInstanceName(processInstance.getId(), "The name");
Calendar hourAgo = Calendar.getInstance();
hourAgo.add(Calendar.HOUR_OF_DAY, -1);
Calendar hourFromNow = Calendar.getInstance();
hourFromNow.add(Calendar.HOUR_OF_DAY, 1);
// Name and name like
assertEquals("The name", historyService.createHistoricProcessInstanceQuery().or().processInstanceName("The name").processDefinitionId("undefined").endOr().singleResult().getName());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processInstanceName("The name").processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().processInstanceName("Other name").processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processInstanceNameLike("% name").processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().processInstanceNameLike("%nope").processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery()
.or()
.processInstanceName("The name")
.processDefinitionId("undefined")
.endOr()
.or()
.processInstanceNameLike("% name")
.processDefinitionId("undefined")
.endOr()
.count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery()
.or()
.processInstanceName("The name")
.processDefinitionId("undefined")
.endOr()
.or()
.processInstanceNameLike("undefined")
.processDefinitionId("undefined")
.endOr()
.count());
// Query after update name
runtimeService.setProcessInstanceName(processInstance.getId(), "New name");
assertEquals("New name", historyService.createHistoricProcessInstanceQuery().or().processInstanceName("New name").processDefinitionId("undefined").endOr().singleResult().getName());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processInstanceName("New name").processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().processInstanceName("The name").processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processInstanceNameLike("New %").processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().processInstanceNameLike("The %").processDefinitionId("undefined").endOr().count());
// Start/end dates
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finishedBefore(hourAgo.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finishedBefore(hourFromNow.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finishedAfter(hourAgo.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finishedAfter(hourFromNow.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().startedBefore(hourFromNow.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().startedBefore(hourAgo.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().startedAfter(hourAgo.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().startedAfter(hourFromNow.getTime()).processDefinitionId("undefined").endOr().count());
// General fields
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finished().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processInstanceId(processInstance.getId()).processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processDefinitionId(processInstance.getProcessDefinitionId()).processDefinitionKey("undefined").count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processDefinitionId("undefined").processDefinitionKeyIn(Arrays.asList("undefined", "oneTaskProcess")).endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().processDefinitionId("undefined").processDefinitionKeyIn(Arrays.asList("undefined1", "undefined2")).endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processDefinitionKey("oneTaskProcess").processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processInstanceBusinessKey("businessKey123").processDefinitionId("undefined").endOr().count());
List<String> exludeIds = new ArrayList<String>();
exludeIds.add("unexistingProcessDefinition");
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().processDefinitionKeyNotIn(exludeIds).processDefinitionId("undefined").endOr().count());
exludeIds.add("oneTaskProcess");
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().processDefinitionKeyNotIn(exludeIds).processDefinitionId("undefined").endOr().count());
// After finishing process
taskService.complete(taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult().getId());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().finished().processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finishedBefore(hourAgo.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().finishedBefore(hourFromNow.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().finishedAfter(hourAgo.getTime()).processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().finishedAfter(hourFromNow.getTime()).processDefinitionId("undefined").endOr().count());
// Check identity links
assertEquals(1, historyService.createHistoricProcessInstanceQuery().or().involvedUser("kermit").processDefinitionId("undefined").endOr().count());
assertEquals(0, historyService.createHistoricProcessInstanceQuery().or().involvedUser("gonzo").processDefinitionId("undefined").endOr().count());
}
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricProcessInstanceSorting() {
ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("oneTaskProcess");
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().asc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().asc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().asc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().asc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().asc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().asc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().desc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().desc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().desc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().desc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().desc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().desc().list().size());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().asc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().asc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().asc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().asc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().asc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().asc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().desc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().desc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().desc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().desc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().desc().count());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().desc().count());
ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("oneTaskProcess");
// First complete process instance 2
for (Task task : taskService.createTaskQuery().processInstanceId(processInstance2.getId()).list()) {
taskService.complete(task.getId());
}
// Then process instance 1
for (Task task : taskService.createTaskQuery().processInstanceId(processInstance1.getId()).list()) {
taskService.complete(task.getId());
}
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().asc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().asc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().asc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().asc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().asc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().asc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().desc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().desc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().desc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().desc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().desc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().desc().list().size());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().asc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().asc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().asc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().asc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().asc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().asc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().desc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().desc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().desc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceDuration().desc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessDefinitionId().desc().count());
assertEquals(2, historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceBusinessKey().desc().count());
// Verify orderByProcessInstanceEndTime
List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().desc().list();
assertEquals(processInstance1.getId(), historicProcessInstances.get(0).getId());
assertEquals(processInstance2.getId(), historicProcessInstances.get(1).getId());
// Verify again, with variables included (bug reported on that)
historicProcessInstances = historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceEndTime().desc().includeProcessVariables().list();
assertEquals(processInstance1.getId(), historicProcessInstances.get(0).getId());
assertEquals(processInstance2.getId(), historicProcessInstances.get(1).getId());
}
public void testInvalidSorting() {
try {
historyService.createHistoricProcessInstanceQuery().asc();
fail();
} catch (ActivitiIllegalArgumentException e) {
}
try {
historyService.createHistoricProcessInstanceQuery().desc();
fail();
} catch (ActivitiIllegalArgumentException e) {
}
try {
historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceId().list();
fail();
} catch (ActivitiIllegalArgumentException e) {
}
}
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
// ACT-1098
public void testDeleteReason() {
if(processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
final String deleteReason = "some delete reason";
ProcessInstance pi = runtimeService.startProcessInstanceByKey("oneTaskProcess");
runtimeService.deleteProcessInstance(pi.getId(), deleteReason);
HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(pi.getId()).singleResult();
assertEquals(deleteReason, hpi.getDeleteReason());
}
}
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricIdenityLinksOnProcessInstance() {
if(processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("oneTaskProcess");
runtimeService.addUserIdentityLink(pi.getId(), "kermit", "myType");
// Check historic links
List<HistoricIdentityLink> historicLinks = historyService.getHistoricIdentityLinksForProcessInstance(pi.getId());
assertEquals(1, historicLinks.size());
assertEquals("myType", historicLinks.get(0).getType());
assertEquals("kermit", historicLinks.get(0).getUserId());
assertNull(historicLinks.get(0).getGroupId());
assertEquals(pi.getId(), historicLinks.get(0).getProcessInstanceId());
// When process is ended, link should remain
taskService.complete(taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult().getId());
assertNull(runtimeService.createProcessInstanceQuery().processInstanceId(pi.getId()).singleResult());
assertEquals(1, historyService.getHistoricIdentityLinksForProcessInstance(pi.getId()).size());
// When process is deleted, identitylinks shouldn't exist anymore
historyService.deleteHistoricProcessInstance(pi.getId());
assertEquals(0, historyService.getHistoricIdentityLinksForProcessInstance(pi.getId()).size());
}
}
/**
* Validation for ACT-821
*/
@Deployment(resources= {
"org/activiti/engine/test/history/HistoricProcessInstanceTest.testDeleteHistoricProcessInstanceWithCallActivity.bpmn20.xml",
"org/activiti/engine/test/history/HistoricProcessInstanceTest.testDeleteHistoricProcessInstanceWithCallActivity-subprocess.bpmn20.xml"
})
public void testDeleteHistoricProcessInstanceWithCallActivity() {
if(processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("callSimpleSubProcess");
runtimeService.deleteProcessInstance(pi.getId(), "testing");
// The parent and child process should be present in history
assertEquals(2L, historyService.createHistoricProcessInstanceQuery().count());
// Deleting the parent process should cascade the child-process
historyService.deleteHistoricProcessInstance(pi.getId());
assertEquals(0L, historyService.createHistoricProcessInstanceQuery().count());
}
}
@Deployment(resources = {"org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml"})
public void testHistoricProcessInstanceName() {
String piName = "Customized Process Instance Name";
ProcessInstanceBuilder builder = runtimeService.createProcessInstanceBuilder();
builder.processDefinitionKey("oneTaskProcess");
builder.processInstanceName(piName);
ProcessInstance processInstance1 = builder.start();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance1.getProcessInstanceId()).singleResult();
assertEquals(piName, historicProcessInstance.getName());
assertEquals(1, historyService.createHistoricProcessInstanceQuery().processInstanceName(piName).list().size());
}
/**
* Validation for https://activiti.atlassian.net/browse/ACT-2182
*/
public void testNameAndTenantIdSetWhenFetchingVariables() {
String tenantId = "testTenantId";
String processInstanceName = "myProcessInstance";
String deploymentId = repositoryService.createDeployment()
.addClasspathResource("org/activiti/engine/test/history/oneTaskProcess.bpmn20.xml")
.tenantId(tenantId)
.deploy()
.getId();
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("name", "Kermit");
vars.put("age", 60);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKeyAndTenantId("oneTaskProcess", vars, tenantId);
runtimeService.setProcessInstanceName(processInstance.getId(), processInstanceName);
// Verify name and tenant id (didnt work on mssql and db2) on process instance
List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().includeProcessVariables().list();
assertEquals(1, processInstances.size());
processInstance = processInstances.get(0);
assertEquals(processInstanceName, processInstance.getName());
assertEquals(tenantId, processInstance.getTenantId());
Map<String, Object> processInstanceVars = processInstance.getProcessVariables();
assertEquals(2, processInstanceVars.size());
assertEquals("Kermit", processInstanceVars.get("name"));
assertEquals(60, processInstanceVars.get("age"));
// Verify name and tenant id (didnt work on mssql and db2) on historic process instance
List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().list();
assertEquals(1, historicProcessInstances.size());
HistoricProcessInstance historicProcessInstance = historicProcessInstances.get(0);
// Verify name and tenant id (didnt work on mssql and db2) on process instance
assertEquals(processInstanceName, historicProcessInstance.getName());
assertEquals(tenantId, historicProcessInstance.getTenantId());
Map<String, Object> historicProcessInstanceVars = historicProcessInstance.getProcessVariables();
assertEquals(2, historicProcessInstanceVars.size());
assertEquals("Kermit", historicProcessInstanceVars.get("name"));
assertEquals(60, historicProcessInstanceVars.get("age"));
// cleanup
repositoryService.deleteDeployment(deploymentId, true);
}
}