public ActivityInstance getSingleActivityInstance(ActivityInstance tree, String activityId) { ActivityInstance[] activityInstances = tree.getActivityInstances(activityId); if (activityInstances.length == 1) { return activityInstances[0]; } else { throw new RuntimeException("There is not exactly one activity instance for activity " + activityId); } }
@Override public void execute(DelegateExecution execution) throws Exception { RuntimeService runtimeService = engine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ONE_TASK_PROCESS_KEY); // then the wait state is reached immediately after instantiation ActivityInstance activityInstance = runtimeService.getActivityInstance(processInstance.getId()); ActivityInstance[] activityInstances = activityInstance.getActivityInstances("waitState"); Assert.assertEquals(1, activityInstances.length); } }
@Override public void execute(DelegateExecution execution) throws Exception { RuntimeService runtimeService = engine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process"); // then the wait state is reached immediately after instantiation ActivityInstance activityInstance = runtimeService.getActivityInstance(processInstance.getId()); ActivityInstance[] activityInstances = activityInstance.getActivityInstances("waitState"); Assert.assertEquals(1, activityInstances.length); } }
@Deployment(resources = "org/camunda/bpm/engine/test/api/runtime/RuntimeServiceTest.testGetActivityInstancesForActivity.bpmn20.xml") @Test public void testGetInvalidActivityInstancesForActivity() { ProcessInstance instance = runtimeService.startProcessInstanceByKey("miSubprocess"); ActivityInstance tree = runtimeService.getActivityInstance(instance.getId()); try { tree.getActivityInstances(null); fail("exception expected"); } catch (NullValueException e) { // happy path } }
@Deployment @Test public void testGetActivityInstancesForActivity() { // given ProcessInstance instance = runtimeService.startProcessInstanceByKey("miSubprocess"); ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().singleResult(); // when ActivityInstance tree = runtimeService.getActivityInstance(instance.getId()); // then ActivityInstance[] processActivityInstances = tree.getActivityInstances(definition.getId()); assertEquals(1, processActivityInstances.length); assertEquals(tree.getId(), processActivityInstances[0].getId()); assertEquals(definition.getId(), processActivityInstances[0].getActivityId()); assertActivityInstances(tree.getActivityInstances("subProcess#multiInstanceBody"), 1, "subProcess#multiInstanceBody"); assertActivityInstances(tree.getActivityInstances("subProcess"), 3, "subProcess"); assertActivityInstances(tree.getActivityInstances("innerTask"), 3, "innerTask"); ActivityInstance subProcessInstance = tree.getChildActivityInstances()[0].getChildActivityInstances()[0]; assertActivityInstances(subProcessInstance.getActivityInstances("subProcess"), 1, "subProcess"); ActivityInstance[] childInstances = subProcessInstance.getActivityInstances("innerTask"); assertEquals(1, childInstances.length); assertEquals(subProcessInstance.getChildActivityInstances()[0].getId(), childInstances[0].getId()); }
@Deployment public void testParallelUserTasks() { ProcessInstance procInst = runtimeService.startProcessInstanceByKey("miParallelUserTasks"); String procId = procInst.getId(); List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(3, tasks.size()); assertEquals("My Task 0", tasks.get(0).getName()); assertEquals("My Task 1", tasks.get(1).getName()); assertEquals("My Task 2", tasks.get(2).getName()); ActivityInstance processInstance = runtimeService.getActivityInstance(procId); assertEquals(3, processInstance.getActivityInstances("miTasks").length); taskService.complete(tasks.get(0).getId()); processInstance = runtimeService.getActivityInstance(procId); assertEquals(2, processInstance.getActivityInstances("miTasks").length); taskService.complete(tasks.get(1).getId()); processInstance = runtimeService.getActivityInstance(procId); assertEquals(1, processInstance.getActivityInstances("miTasks").length); taskService.complete(tasks.get(2).getId()); assertProcessEnded(procId); }
@Deployment(resources = "org/camunda/bpm/engine/test/api/runtime/RuntimeServiceTest.testGetActivityInstancesForActivity.bpmn20.xml") @Test public void testGetActivityInstancesForNonExistingActivity() { ProcessInstance instance = runtimeService.startProcessInstanceByKey("miSubprocess"); ActivityInstance tree = runtimeService.getActivityInstance(instance.getId()); ActivityInstance[] instances = tree.getActivityInstances("aNonExistingActivityId"); assertNotNull(instances); assertEquals(0, instances.length); }
@Deployment public void testScopeActivityInstanceId() { // given String processInstanceId = runtimeService.startProcessInstanceByKey("process").getId(); ActivityInstance tree = runtimeService.getActivityInstance(processInstanceId); ActivityInstance theTaskInstance = tree.getActivityInstances("theTask")[0]; // when VariableInstance variableInstance = runtimeService .createVariableInstanceQuery() .singleResult(); // then assertEquals(theTaskInstance.getId(), variableInstance.getActivityInstanceId()); }
@Deployment(resources = "org/camunda/bpm/engine/test/api/externaltask/oneExternalTaskProcess.bpmn20.xml") public void testQueryByExecutionId() { // given List<ProcessInstance> processInstances = startInstancesByKey("oneExternalTaskProcess", 3); ProcessInstance firstInstance = processInstances.get(0); ActivityInstance externalTaskActivityInstance = runtimeService .getActivityInstance(firstInstance.getId()) .getActivityInstances("externalTask")[0]; String executionId = externalTaskActivityInstance.getExecutionIds()[0]; // when ExternalTask externalTask = externalTaskService .createExternalTaskQuery() .executionId(executionId) .singleResult(); // then assertNotNull(externalTask); assertEquals(executionId, externalTask.getExecutionId()); }
@Deployment public void testSequentialMultiInstanceSubProcess() { // given a process instance in sequential MI ProcessInstance instance = runtimeService.startProcessInstanceByKey("miSequentialSubprocess"); // when VariableInstance nrOfInstances = runtimeService.createVariableInstanceQuery() .variableName("nrOfInstances").singleResult(); VariableInstance nrOfActiveInstances = runtimeService.createVariableInstanceQuery() .variableName("nrOfActiveInstances").singleResult(); VariableInstance nrOfCompletedInstances = runtimeService.createVariableInstanceQuery() .variableName("nrOfCompletedInstances").singleResult(); VariableInstance loopCounter = runtimeService.createVariableInstanceQuery() .variableName("loopCounter").singleResult(); // then the activity instance ids of the variable instances should be correct ActivityInstance tree = runtimeService.getActivityInstance(instance.getId()); assertEquals(tree.getActivityInstances("miSubProcess#multiInstanceBody")[0].getId(), nrOfInstances.getActivityInstanceId()); assertEquals(tree.getActivityInstances("miSubProcess#multiInstanceBody")[0].getId(), nrOfActiveInstances.getActivityInstanceId()); assertEquals(tree.getActivityInstances("miSubProcess#multiInstanceBody")[0].getId(), nrOfCompletedInstances.getActivityInstanceId()); assertEquals(tree.getActivityInstances("miSubProcess#multiInstanceBody")[0].getId(), loopCounter.getActivityInstanceId()); }
@Deployment public void testParallelSubProcessCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miParallelSubprocessCompletionCondition").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(4, tasks.size()); // get activities of a single subprocess ActivityInstance[] taskActivities = runtimeService.getActivityInstance(procId) .getActivityInstances("miSubProcess")[0] .getChildActivityInstances(); for (ActivityInstance taskActivity : taskActivities) { Task task = taskService.createTaskQuery().activityInstanceIdIn(taskActivity.getId()).singleResult(); taskService.complete(task.getId()); } assertProcessEnded(procId); }
@Deployment(resources = {"org/camunda/bpm/engine/test/api/oneTaskProcess.bpmn20.xml"}) @Test public void testActivityInstanceActivityNameProperty() { // given String processInstanceId = runtimeService.startProcessInstanceByKey("oneTaskProcess").getId(); // when ActivityInstance tree = runtimeService.getActivityInstance(processInstanceId); // then ActivityInstance[] activityInstances = tree.getActivityInstances("theTask"); assertEquals(1, activityInstances.length); ActivityInstance task = activityInstances[0]; assertNotNull(task); assertNotNull(task.getActivityName()); assertEquals("my task", task.getActivityName()); }
public void execute(ProcessEngine engine, String scenarioName) { String processDefinitionId = engine.getRepositoryService().createProcessDefinitionQuery() .processDefinitionKey("oneTaskProcessInstanceModification_710") .singleResult() .getId(); String processInstanceId = engine.getRuntimeService() .startProcessInstanceById(processDefinitionId, "ProcessInstanceModificationScenario").getId(); engine.getRuntimeService().createModification(processDefinitionId) .processInstanceIds(processInstanceId) .startBeforeActivity("userTask2") .execute(); ActivityInstance tree = engine.getRuntimeService().getActivityInstance(processInstanceId); engine.getRuntimeService().createProcessInstanceModification(processInstanceId) .cancelActivityInstance(tree.getActivityInstances("userTask1")[0].getId()) .cancelTransitionInstance(tree.getTransitionInstances("userTask2")[0].getId()) .executeAsync(); } };
@Deployment(resources = SEQUENTIAL_MULTI_INSTANCE_SUBPROCESS_PROCESS) public void testCancelInnerActivitySequentialSubprocess() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miSequentialSubprocess"); completeTasksInOrder("beforeTask"); // when ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); runtimeService .createProcessInstanceModification(processInstance.getId()) .cancelActivityInstance(tree.getActivityInstances("miSubProcess")[0].getId()) .execute(); // then assertProcessEnded(processInstance.getId()); }
@Deployment(resources = SEQUENTIAL_MULTI_INSTANCE_TASK_PROCESS) public void testCancelInnerActivitySequentialTasks() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miSequentialUserTasks"); completeTasksInOrder("beforeTask"); // when ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); runtimeService .createProcessInstanceModification(processInstance.getId()) .cancelActivityInstance(tree.getActivityInstances("miTasks")[0].getId()) .execute(); // then assertProcessEnded(processInstance.getId()); }
@Deployment(resources = SEQUENTIAL_MULTI_INSTANCE_SUBPROCESS_PROCESS) public void testStartBeforeInnerActivitySequentialSubprocess() { // given the mi body is already instantiated ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miSequentialSubprocess"); completeTasksInOrder("beforeTask"); // when ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); try { runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("miSubProcess", tree.getActivityInstances("miSubProcess#multiInstanceBody")[0].getId()) .execute(); fail("expect exception"); } catch (ProcessEngineException e) { assertTextPresent(e.getMessage(), "Concurrent instantiation not possible for activities " + "in scope miSubProcess#multiInstanceBody"); } }
@Deployment(resources = SEQUENTIAL_MULTI_INSTANCE_TASK_PROCESS) public void testStartBeforeInnerActivitySequentialTasks() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miSequentialUserTasks"); completeTasksInOrder("beforeTask"); // then creating a second inner instance is not possible ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); try { runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("miTasks", tree.getActivityInstances("miTasks#multiInstanceBody")[0].getId()) .execute(); fail("expect exception"); } catch (ProcessEngineException e) { assertTextPresent(e.getMessage(), "Concurrent instantiation not possible for activities " + "in scope miTasks#multiInstanceBody"); } }
/** * Fix CAM-4351 */ @Deployment(resources = "org/camunda/bpm/engine/test/bpmn/event/compensate/CompensateEventHistoryTest.testBoundaryCompensationHandlerHistory.bpmn20.xml") public void FAILING_testBoundaryCompensationHandlerHistoryVariableInstance() { // given a process instance ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("boundaryHandlerProcess"); // when throwing compensation Task beforeCompensationTask = taskService.createTaskQuery().singleResult(); taskService.complete(beforeCompensationTask.getId()); String compensationHandlerActivityInstanceId = runtimeService .getActivityInstance(processInstance.getId()) .getActivityInstances("compensationHandler")[0] .getId(); // .. setting a variable via task service API Task compensationHandler = taskService.createTaskQuery().singleResult(); runtimeService.setVariableLocal(compensationHandler.getExecutionId(), "apiVariable", "someValue"); // .. and completing compensation taskService.complete(compensationHandler.getId()); // then there is a historic variable instance for the variable set by API HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().singleResult(); assertNotNull(historicVariableInstance); assertEquals(compensationHandlerActivityInstanceId, historicVariableInstance.getActivityInstanceId()); }
@Deployment(resources = "org/camunda/bpm/engine/test/bpmn/event/compensate/CompensateEventHistoryTest.testBoundaryCompensationHandlerHistory.bpmn20.xml") public void testBoundaryCompensationHandlerHistoryActivityInstance() { // given a process instance ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("boundaryHandlerProcess"); // when throwing compensation Task beforeCompensationTask = taskService.createTaskQuery().singleResult(); taskService.complete(beforeCompensationTask.getId()); String compensationHandlerActivityInstanceId = runtimeService .getActivityInstance(processInstance.getId()) .getActivityInstances("compensationHandler")[0] .getId(); // .. and completing compensation Task compensationHandler = taskService.createTaskQuery().singleResult(); taskService.complete(compensationHandler.getId()); // then there is a historic activity instance for the compensation handler HistoricActivityInstance historicCompensationHandlerInstance = historyService .createHistoricActivityInstanceQuery() .activityId("compensationHandler") .singleResult(); assertNotNull(historicCompensationHandlerInstance); assertEquals(compensationHandlerActivityInstanceId, historicCompensationHandlerInstance.getId()); assertEquals(processInstance.getId(), historicCompensationHandlerInstance.getParentActivityInstanceId()); }
@Test public void modifyAProcessInstanceWithLocalVariableCreation() { // given a process that sets a local variable when entering the user task BpmnModelInstance instance = Bpmn.createExecutableProcess("Process") .startEvent() .userTask("userTask") .camundaTaskListenerClass("create", "org.camunda.bpm.engine.test.api.runtime.util.CreateLocalVariableEventListener") .endEvent() .done(); testHelper.deployAndGetDefinition(instance); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Process"); ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstance.getId()); // when I start another activity and delete the old one runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("userTask") .cancelActivityInstance(updatedTree.getActivityInstances("userTask")[0].getId()) .execute(false, false); // then migration was successful and I can finish the process Task task = taskService.createTaskQuery().singleResult(); taskService.complete(task.getId()); testHelper.assertProcessEnded(processInstance.getId()); }