@Override public void applyTo(InstantiationBuilder<?> builder, ProcessEngine engine, ObjectMapper mapper) { // cannot be applied to instantiation if (builder instanceof ModificationBuilder) { if (activityId == null) { throw new InvalidRequestException(Status.BAD_REQUEST, buildErrorMessage("'activityId' must be set")); } if (cancelCurrentActiveActivityInstances) { ((ModificationBuilder) builder).cancelAllForActivity(activityId, true); } else { ((ModificationBuilder) builder).cancelAllForActivity(activityId); } } }
@Override public void applyTo(InstantiationBuilder<?> builder, ProcessEngine engine, ObjectMapper mapper) { // cannot be applied to instantiation if (builder instanceof ModificationBuilder) { if (activityId == null) { throw new InvalidRequestException(Status.BAD_REQUEST, buildErrorMessage("'activityId' must be set")); } if (cancelCurrentActiveActivityInstances) { ((ModificationBuilder) builder).cancelAllForActivity(activityId, true); } else { ((ModificationBuilder) builder).cancelAllForActivity(activityId); } } }
@Before public void setUpRuntimeData() { runtimeServiceMock = mock(RuntimeService.class); when(processEngine.getRuntimeService()).thenReturn(runtimeServiceMock); modificationBuilderMock = mock(ModificationBuilder.class); when(modificationBuilderMock.cancelAllForActivity(anyString())).thenReturn(modificationBuilderMock); when(modificationBuilderMock.startAfterActivity(anyString())).thenReturn(modificationBuilderMock); when(modificationBuilderMock.startBeforeActivity(anyString())).thenReturn(modificationBuilderMock); when(modificationBuilderMock.startTransition(anyString())).thenReturn(modificationBuilderMock); when(modificationBuilderMock.processInstanceIds(anyListOf(String.class))).thenReturn(modificationBuilderMock); Batch batchMock = createMockBatch(); when(modificationBuilderMock.executeAsync()).thenReturn(batchMock); when(runtimeServiceMock.createModification(anyString())).thenReturn(modificationBuilderMock); }
@Test public void createModificationWithNullProcessDefinitionId() { try { runtimeService.createModification(null).cancelAllForActivity("activityId").processInstanceIds(Arrays.asList("20", "1--0")).execute(); fail("Should not succed"); } catch (ProcessEngineException e) { assertThat(e.getMessage(), containsString("processDefinitionId is null")); } }
@Test public void executeCancellationWithoutActiveFlagSync() { Map<String, Object> json = new HashMap<String, Object>(); List<Map<String, Object>> instructions = new ArrayList<Map<String, Object>>(); json.put("skipIoMappings", true); json.put("processInstanceIds", Arrays.asList("200", "100")); instructions.add(ModificationInstructionBuilder.cancellation().activityId("activityId").cancelCurrentActiveActivityInstances(false).getJson()); json.put("instructions", instructions); json.put("processDefinitionId", "processDefinitionId"); given() .contentType(ContentType.JSON) .body(json) .then() .expect() .statusCode(Status.NO_CONTENT.getStatusCode()) .when() .post(EXECUTE_MODIFICATION_SYNC_URL); verify(modificationBuilderMock).cancelAllForActivity("activityId"); verify(modificationBuilderMock).execute(); }
@Test public void executeCancellationWithActiveFlagAsync() { Map<String, Object> json = new HashMap<String, Object>(); List<Map<String, Object>> instructions = new ArrayList<Map<String, Object>>(); json.put("skipIoMappings", true); json.put("processInstanceIds", Arrays.asList("200", "100")); instructions.add(ModificationInstructionBuilder.cancellation().activityId("activityId").cancelCurrentActiveActivityInstances(true).getJson()); json.put("instructions", instructions); json.put("processDefinitionId", "processDefinitionId"); given() .contentType(ContentType.JSON) .body(json) .then() .expect() .statusCode(Status.OK.getStatusCode()) .when() .post(EXECUTE_MODIFICATION_ASYNC_URL); verify(modificationBuilderMock).cancelAllForActivity("activityId", true); verify(modificationBuilderMock).executeAsync(); }
@Test public void createModificationWithNullProcessDefinitionId() { try { runtimeService.createModification(null).cancelAllForActivity("activityId").processInstanceIds(Arrays.asList("20", "1--0")).executeAsync(); fail("Should not succed"); } catch (ProcessEngineException e) { assertThat(e.getMessage(), containsString("processDefinitionId is null")); } }
@Test public void executeCancellationWithoutActiveFlagAsync() { Map<String, Object> json = new HashMap<String, Object>(); List<Map<String, Object>> instructions = new ArrayList<Map<String, Object>>(); json.put("skipIoMappings", true); json.put("processInstanceIds", Arrays.asList("200", "100")); instructions.add(ModificationInstructionBuilder.cancellation().activityId("activityId").cancelCurrentActiveActivityInstances(false).getJson()); json.put("instructions", instructions); json.put("processDefinitionId", "processDefinitionId"); given() .contentType(ContentType.JSON) .body(json) .then() .expect() .statusCode(Status.OK.getStatusCode()) .when() .post(EXECUTE_MODIFICATION_ASYNC_URL); verify(modificationBuilderMock).cancelAllForActivity("activityId"); verify(modificationBuilderMock).executeAsync(); } }
@Test public void executeCancellationWithActiveFlagSync() { Map<String, Object> json = new HashMap<String, Object>(); List<Map<String, Object>> instructions = new ArrayList<Map<String, Object>>(); json.put("skipIoMappings", true); json.put("processInstanceIds", Arrays.asList("200", "100")); instructions.add(ModificationInstructionBuilder.cancellation().activityId("activityId").cancelCurrentActiveActivityInstances(true).getJson()); json.put("instructions", instructions); json.put("processDefinitionId", "processDefinitionId"); given() .contentType(ContentType.JSON) .body(json) .then() .expect() .statusCode(Status.NO_CONTENT.getStatusCode()) .when() .post(EXECUTE_MODIFICATION_SYNC_URL); verify(modificationBuilderMock).cancelAllForActivity("activityId", true); verify(modificationBuilderMock).execute(); }
@Test public void createSimpleModificationPlan() { ProcessDefinition processDefinition = testRule.deployAndGetDefinition(instance); List<String> instances = helper.startInstances("process1", 2); runtimeService.createModification(processDefinition.getId()).startBeforeActivity("user2").cancelAllForActivity("user1").processInstanceIds(instances).execute(); for (String instanceId : instances) { List<String> activeActivityIds = runtimeService.getActiveActivityIds(instanceId); assertEquals(1, activeActivityIds.size()); assertEquals(activeActivityIds.iterator().next(), "user2"); } }
@Test public void createModificationUsingProcessInstanceIdsArrayWithNullValue() { try { runtimeService.createModification("processDefinitionId").cancelAllForActivity("user1").processInstanceIds("foo", null, "bar").execute(); fail("Should not be able to modify"); } catch (ProcessEngineException e) { assertThat(e.getMessage(), containsString("Process instance ids contains null value")); } }
public Batch cancelAllAsync(String key, int numberOfProcessInstances, String activityId, String processDefinitionId) { RuntimeService runtimeService = engineRule.getRuntimeService(); List<String> processInstanceIds = startInstances(key, numberOfProcessInstances); return runtimeService.createModification(processDefinitionId).cancelAllForActivity(activityId).processInstanceIds(processInstanceIds).executeAsync(); }
@Test public void createModificationUsingProcessInstanceIdsArrayWithNullValueAsync() { try { runtimeService.createModification("processDefinitionId").cancelAllForActivity("user1").processInstanceIds("foo", null, "bar").executeAsync(); fail("Should not be able to modify"); } catch (ProcessEngineException e) { assertThat(e.getMessage(), containsString("Process instance ids contains null value")); } }
@Test public void createModificationWithNonExistingProcessDefinitionId() { DeploymentWithDefinitions deployment = testRule.deploy(instance); deployment.getDeployedProcessDefinitions().get(0); List<String> processInstanceIds = helper.startInstances("process1", 2); try { runtimeService.createModification("foo").cancelAllForActivity("activityId").processInstanceIds(processInstanceIds).executeAsync(); fail("Should not succed"); } catch (ProcessEngineException e) { assertThat(e.getMessage(), containsString("processDefinition is null")); } }
@Test public void createModificationWithNotMatchingProcessDefinitionId() { DeploymentWithDefinitions deployment = testRule.deploy(instance); deployment.getDeployedProcessDefinitions().get(0); List<String> processInstanceIds = helper.startInstances("process1", 2); try { runtimeService.createModification("foo").cancelAllForActivity("activityId").processInstanceIds(processInstanceIds).execute(); fail("Should not succed"); } catch (ProcessEngineException e) { assertThat(e.getMessage(), containsString("processDefinition is null")); } }
@Test public void testCancelAll() { ProcessDefinition processDefinition = testRule.deployAndGetDefinition(instance); List<String> processInstanceIds = helper.startInstances("process1", 2); runtimeService.createModification(processDefinition.getId()).cancelAllForActivity("user1").processInstanceIds(processInstanceIds).execute(); for (String processInstanceId : processInstanceIds) { ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstanceId); assertNull(updatedTree); } }
@Test public void testNoCreationOnJobExecutorBatchJobExecution() { // given ProcessDefinition processDefinition = testRule.deployAndGetDefinition(instance); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId()); runtimeService.createModification(processDefinition.getId()) .cancelAllForActivity("user1") .processInstanceIds(Arrays.asList(processInstance.getId())) .executeAsync(); // when testRule.waitForJobExecutorToProcessAllJobs(5000L); // then Assert.assertEquals(0, rule.getHistoryService().createUserOperationLogQuery().count()); }
@Test public void testStartBeforeAndCancelAll() { DeploymentWithDefinitions deployment = testRule.deploy(instance); ProcessDefinition definition = deployment.getDeployedProcessDefinitions().get(0); List<String> processInstanceIds = helper.startInstances("process1", 2); runtimeService.createModification(definition.getId()).cancelAllForActivity("user1").startBeforeActivity("user2").processInstanceIds(processInstanceIds).execute(); for (String processInstanceId : processInstanceIds) { ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstanceId); assertNotNull(updatedTree); assertEquals(processInstanceId, updatedTree.getProcessInstanceId()); assertThat(updatedTree).hasStructure(describeActivityInstanceTree(definition.getId()).activity("user2").done()); } }
@Test public void testCancelWithoutFlag2() { // given this.instance = Bpmn.createExecutableProcess("process1") .startEvent("start") .serviceTask("ser").camundaExpression("${true}") .userTask("user") .endEvent("end") .done(); ProcessDefinition processDefinition = testRule.deployAndGetDefinition(instance); List<String> processInstanceIds = helper.startInstances("process1", 1); // when runtimeService.createModification(processDefinition.getId()) .startBeforeActivity("ser") .cancelAllForActivity("user", false) .processInstanceIds(processInstanceIds) .execute(); // then assertEquals(0, runtimeService.createExecutionQuery().list().size()); }
@Test public void testCancelWithoutFlag() { // given this.instance = Bpmn.createExecutableProcess("process1") .startEvent("start") .serviceTask("ser").camundaExpression("${true}") .userTask("user") .endEvent("end") .done(); ProcessDefinition processDefinition = testRule.deployAndGetDefinition(instance); List<String> processInstanceIds = helper.startInstances("process1", 1); // when runtimeService.createModification(processDefinition.getId()) .startBeforeActivity("ser") .cancelAllForActivity("user") .processInstanceIds(processInstanceIds) .execute(); // then assertEquals(0, runtimeService.createExecutionQuery().list().size()); }