inOrder.verify(mockModificationBuilder).cancelAllForActivity("activityId"); inOrder.verify(mockModificationBuilder).cancelActivityInstance("activityInstanceId"); inOrder.verify(mockModificationBuilder).cancelTransitionInstance("transitionInstanceId"); inOrder.verify(mockModificationBuilder).startBeforeActivity("activityId"); inOrder.verify(mockModificationBuilder).startBeforeActivity("activityId", "ancestorActivityInstanceId"); inOrder.verify(mockModificationBuilder).startAfterActivity("activityId"); inOrder.verify(mockModificationBuilder).startAfterActivity("activityId", "ancestorActivityInstanceId"); inOrder.verify(mockModificationBuilder).startTransition("transitionId"); inOrder.verify(mockModificationBuilder).startTransition("transitionId", "ancestorActivityInstanceId"); inOrder.verify(mockModificationBuilder).execute(true, true);
when(runtimeServiceMock.createProcessInstanceModification(anyString())).thenReturn(mockModificationBuilder); Batch batchMock = createMockBatch(); when(mockModificationBuilder.executeAsync(anyBoolean(), anyBoolean())).thenReturn(batchMock); inOrder.verify(mockModificationBuilder).cancelAllForActivity("activityId"); inOrder.verify(mockModificationBuilder).cancelActivityInstance("activityInstanceId"); inOrder.verify(mockModificationBuilder).cancelTransitionInstance("transitionInstanceId"); inOrder.verify(mockModificationBuilder).startBeforeActivity("activityId"); inOrder.verify(mockModificationBuilder).startBeforeActivity("activityId", "ancestorActivityInstanceId"); inOrder.verify(mockModificationBuilder).startAfterActivity("activityId"); inOrder.verify(mockModificationBuilder).startAfterActivity("activityId", "ancestorActivityInstanceId"); inOrder.verify(mockModificationBuilder).startTransition("transitionId"); inOrder.verify(mockModificationBuilder).startTransition("transitionId", "ancestorActivityInstanceId"); inOrder.verify(mockModificationBuilder).executeAsync(true, true);
@Deployment(resources = EXCLUSIVE_GATEWAY_PROCESS) public void testStartBeforeWithVariables() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("exclusiveGateway"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("task2").setVariable("procInstVar", "procInstValue") .setVariableLocal("localVar", "localValue").setVariables(Variables.createVariables().putValue("procInstMapVar", "procInstMapValue")) .setVariablesLocal(Variables.createVariables().putValue("localMapVar", "localMapValue")).execute(); ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstance.getId()); assertNotNull(updatedTree); assertThat(updatedTree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).activity("task1").activity("task2").done()); ActivityInstance task2Instance = getChildInstanceForActivity(updatedTree, "task2"); assertNotNull(task2Instance); assertEquals(1, task2Instance.getExecutionIds().length); String task2ExecutionId = task2Instance.getExecutionIds()[0]; assertEquals(4, runtimeService.createVariableInstanceQuery().count()); assertEquals("procInstValue", runtimeService.getVariableLocal(processInstance.getId(), "procInstVar")); assertEquals("localValue", runtimeService.getVariableLocal(task2ExecutionId, "localVar")); assertEquals("procInstMapValue", runtimeService.getVariableLocal(processInstance.getId(), "procInstMapVar")); assertEquals("localMapValue", runtimeService.getVariableLocal(task2ExecutionId, "localMapVar")); completeTasksInOrder("task1", "task2"); assertProcessEnded(processInstance.getId()); }
@SuppressWarnings("unchecked") protected ProcessInstanceModificationInstantiationBuilder setUpMockModificationBuilder() { ProcessInstanceModificationInstantiationBuilder mockModificationBuilder = mock(ProcessInstanceModificationInstantiationBuilder.class); when(mockModificationBuilder.cancelActivityInstance(anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.cancelAllForActivity(anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.startAfterActivity(anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.startAfterActivity(anyString(), anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.startBeforeActivity(anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.startBeforeActivity(anyString(), anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.startTransition(anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.startTransition(anyString(), anyString())).thenReturn(mockModificationBuilder); when(mockModificationBuilder.setVariables(any(Map.class))).thenReturn(mockModificationBuilder); when(mockModificationBuilder.setVariablesLocal(any(Map.class))).thenReturn(mockModificationBuilder); return mockModificationBuilder; }
@Deployment(resources = PARALLEL_MULTI_INSTANCE_TASK_COMPLETION_CONDITION_PROCESS) public void testStartInnerActivityParallelTasksWithCompletionCondition() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miParallelUserTasksCompletionCondition"); // when runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("miTasks") .startBeforeActivity("miTasks") .execute(); // then the process is able to complete successfully and respects the completion condition completeTasksInOrder("miTasks", "miTasks", "miTasks", "miTasks"); assertProcessEnded(processInstance.getId()); }
.createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("innerTask") .setVariable("procInstVar", "procInstValue") .setVariableLocal("localVar", "localValue") .execute();
@Override public Void call() throws Exception { runtimeService.createProcessInstanceModification(processInstance.getProcessInstanceId()).startTransition("flow2") .execute(); return null; }
inOrder.verify(mockModificationBuilder).startBeforeActivity("activityId"); verify(mockModificationBuilder).setVariableLocal(eq("varLocal"), argThat(EqualsPrimitiveValue.stringValue("valueLocal"))); verify(mockModificationBuilder).setVariable(eq("var"), argThat(EqualsPrimitiveValue.stringValue("value"))); inOrder.verify(mockModificationBuilder).startAfterActivity("activityId"); verify(mockModificationBuilder).setVariable(eq("var"), argThat(EqualsPrimitiveValue.integerValue(52))); verify(mockModificationBuilder).setVariableLocal(eq("varLocal"), argThat(EqualsPrimitiveValue.integerValue(74))); inOrder.verify(mockModificationBuilder).execute(false, false);
@Test public void testModifyProcessInstanceAsyncThrowsAuthorizationException() { ProcessInstanceModificationInstantiationBuilder mockModificationBuilder = setUpMockModificationBuilder(); when(runtimeServiceMock.createProcessInstanceModification(anyString())).thenReturn(mockModificationBuilder); String message = "expected exception"; doThrow(new AuthorizationException(message)).when(mockModificationBuilder).executeAsync(anyBoolean(), anyBoolean()); Map<String, Object> json = new HashMap<String, Object>(); List<Map<String, Object>> instructions = new ArrayList<Map<String, Object>>(); instructions.add( ModificationInstructionBuilder.startBefore() .activityId("activityId") .getJson()); instructions.add( ModificationInstructionBuilder.startAfter() .activityId("activityId") .getJson()); json.put("instructions", instructions); given() .pathParam("id", EXAMPLE_PROCESS_INSTANCE_ID) .contentType(ContentType.JSON) .body(json) .then().expect() .statusCode(Status.FORBIDDEN.getStatusCode()) .contentType(ContentType.JSON) .body("type", equalTo(AuthorizationException.class.getSimpleName())) .body("message", equalTo(message)) .when() .post(PROCESS_INSTANCE_MODIFICATION_ASYNC_URL); }
@Test public void testPriorityOnModification() { // given processInstance = runtimeService.startProcessInstanceByKey("serviceTaskProcess"); TransitionInstance transitionInstance = runtimeService.getActivityInstance(processInstance.getId()) .getTransitionInstances("serviceTask")[0]; // when runtimeService.createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("serviceTask") .cancelTransitionInstance(transitionInstance.getId()) .execute(); // then Job job = managementService.createJobQuery().singleResult(); Assert.assertEquals(PriorityBean.PRIORITY, job.getPriority()); }
@Deployment(resources = { CALL_ACTIVITY_PARENT_PROCESS, CALL_ACTIVITY_CHILD_PROCESS }) public void FAILING_testCancelCallActivityInstance() { // given ProcessInstance parentprocess = runtimeService.startProcessInstanceByKey("parentprocess"); ProcessInstance subProcess = runtimeService.createProcessInstanceQuery().processDefinitionKey("subprocess").singleResult(); ActivityInstance subProcessActivityInst = runtimeService.getActivityInstance(subProcess.getId()); // when runtimeService.createProcessInstanceModification(subProcess.getId()).startBeforeActivity("childEnd", subProcess.getId()) .cancelActivityInstance(getInstanceIdForActivity(subProcessActivityInst, "innerTask")).execute(); // then assertProcessEnded(parentprocess.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testStartAdditionalCompensatingTaskAndCompleteNewCompensatingTask() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); Task firstUndoTask = taskService.createTaskQuery().taskDefinitionKey("undoTask").singleResult(); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("undoTask").setVariableLocal("new", true).execute(); ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); assertThat(tree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).beginScope("tx").activity("txEnd").activity("undoTask") .activity("undoTask").done()); String taskExecutionId = runtimeService.createExecutionQuery().variableValueEquals("new", true).singleResult().getId(); Task secondUndoTask = taskService.createTaskQuery().executionId(taskExecutionId).singleResult(); assertNotNull(secondUndoTask); assertNotSame(firstUndoTask.getId(), secondUndoTask.getId()); taskService.complete(secondUndoTask.getId()); tree = runtimeService.getActivityInstance(processInstance.getId()); assertThat(tree) .hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).beginScope("tx").activity("txEnd").activity("undoTask").done()); completeTasksInOrder("undoTask", "afterCancel"); assertProcessEnded(processInstance.getId()); }
.cancelTransitionInstance(transitionInstances[0].getId()) // compact tree .startBeforeActivity("innerTask2") // expand tree .cancelAllForActivity("innerTask2") // compact tree .startBeforeActivity("innerTask2") // expand tree .cancelAllForActivity("innerTask2") // compact tree .startBeforeActivity("innerTask2") // expand tree .cancelTransitionInstance(transitionInstances[1].getId()) .execute();
.createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("subProcessTask") .setVariable("nrOfInstances", 3) .execute();
/** * CAM-3718 */ @Deployment(resources = EXCLUSIVE_GATEWAY_PROCESS) public void testEndProcessInstanceIntermediately() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("exclusiveGateway"); String processInstanceId = processInstance.getId(); ActivityInstance tree = runtimeService.getActivityInstance(processInstanceId); Batch modificationBatch = runtimeService.createProcessInstanceModification(processInstance.getId()) .cancelActivityInstance(getInstanceIdForActivity(tree, "task1")) .startAfterActivity("task1") .startBeforeActivity("task1") .executeAsync(); assertNotNull(modificationBatch); executeSeedAndBatchJobs(modificationBatch); ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstanceId); assertThat(updatedTree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).activity("task1").done()); ExecutionTree executionTree = ExecutionTree.forExecution(processInstanceId, processEngine); assertThat(executionTree).matches(describeExecutionTree("task1").scope().done()); assertEquals(1, taskService.createTaskQuery().count()); // complete the process completeTasksInOrder("task1"); assertProcessEnded(processInstanceId); }
.startBeforeActivity("innerTask") .cancelTransitionInstance(transitionInstances[1].getId()) // does not trigger compaction .cancelTransitionInstance(transitionInstances[1].getId()) // should fail
/** * CAM-4090 */ @Deployment(resources = NESTED_PARALLEL_ASYNC_BEFORE_SCOPE_TASK_PROCESS) public void testRepeatedStartAndCancellationForTransitionInstance() { // given there is one transition instance in a scope ProcessInstance instance = runtimeService.createProcessInstanceByKey("nestedConcurrentTasksProcess") .startBeforeActivity("innerTask1") .execute(); ActivityInstance tree = runtimeService.getActivityInstance(instance.getId()); TransitionInstance transitionInstance = tree.getTransitionInstances("innerTask1")[0]; // when I start an activity in the same scope // and cancel the first transition instance runtimeService.createProcessInstanceModification(instance.getId()) .startBeforeActivity("innerTask2") // expand tree .cancelAllForActivity("innerTask2") // compact tree .startBeforeActivity("innerTask2") // expand tree .cancelAllForActivity("innerTask2") // compact tree .startBeforeActivity("innerTask2") // expand tree .cancelAllForActivity("innerTask2") // compact tree .cancelTransitionInstance(transitionInstance.getId()) .execute(); // then the process has ended assertProcessEnded(instance.getId()); }
.createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("task2") .setVariable("procInstVar", "procInstValue") .setVariableLocal("localVar", "localValue") .execute();
public void testModifyNullProcessInstance() { try { runtimeService.createProcessInstanceModification(null).startBeforeActivity("someActivity").execute(); fail("should not succeed"); } catch (NotValidException e) { assertTextPresent("processInstanceId is null", e.getMessage()); } }
@Deployment(resources = PARALLEL_MULTI_INSTANCE_SUBPROCESS_COMPLETION_CONDITION_PROCESS) public void testStartInnerActivityParallelSubprocessWithCompletionCondition() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miParallelSubprocessCompletionCondition"); // when runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("miSubProcess") .startBeforeActivity("miSubProcess") .execute(); // then the process is able to complete successfully and respects the completion condition completeTasksInOrder("subProcessTask", "subProcessTask", "subProcessTask", "subProcessTask"); assertProcessEnded(processInstance.getId()); }