Skip to content

Commit

Permalink
merge: #11068
Browse files Browse the repository at this point in the history
11068: [Backport stable/8.1] Prevent NPE when terminating call activity r=remcowesterhoud a=backport-action

# Description
Backport of #10996 to `stable/8.1`.

relates to #10606

Co-authored-by: Remco Westerhoud <remco@westerhoud.nl>
  • Loading branch information
zeebe-bors-camunda[bot] and remcowesterhoud committed Nov 22, 2022
2 parents 6314b42 + d5d3eb0 commit 101d5a3
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,9 @@ private void terminateElement(
} else if (elementType == BpmnElementType.CALL_ACTIVITY) {
final var calledActivityElementInstance =
elementInstanceState.getInstance(elementInstance.getCalledChildInstanceKey());
terminateElement(calledActivityElementInstance, sideEffects);
if (calledActivityElementInstance != null && calledActivityElementInstance.canTerminate()) {
terminateElement(calledActivityElementInstance, sideEffects);
}
}

stateWriter.appendFollowUpEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder;
import io.camunda.zeebe.protocol.record.Record;
import io.camunda.zeebe.protocol.record.RecordType;
import io.camunda.zeebe.protocol.record.intent.IncidentIntent;
import io.camunda.zeebe.protocol.record.intent.JobIntent;
import io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent;
import io.camunda.zeebe.protocol.record.intent.ProcessInstanceModificationIntent;
Expand Down Expand Up @@ -850,6 +851,54 @@ public void shouldActivateParallelGateway() {
.hasSize(4);
}

@Test
public void verifyCallActivityWithIncidentInOutputMappingCanBeTerminated() {
final var child = Bpmn.createExecutableProcess("child").startEvent().endEvent().done();
final var parent =
Bpmn.createExecutableProcess(PROCESS_ID)
.startEvent()
.callActivity("callActivity", c -> c.zeebeProcessId("child"))
.zeebeOutputExpression("x", "y")
.manualTask("task")
.endEvent()
.done();

ENGINE.deployment().withXmlResource(child).withXmlResource(parent).deploy();

final var processInstanceKey = ENGINE.processInstance().ofBpmnProcessId(PROCESS_ID).create();

final var callActivityElement =
RecordingExporter.processInstanceRecords(ProcessInstanceIntent.ELEMENT_ACTIVATED)
.withProcessInstanceKey(processInstanceKey)
.withElementId("callActivity")
.withElementType(BpmnElementType.CALL_ACTIVITY)
.getFirst();

Assertions.assertThat(
RecordingExporter.incidentRecords(IncidentIntent.CREATED)
.withProcessInstanceKey(processInstanceKey)
.getFirst())
.extracting(r -> r.getValue().getElementId())
.isEqualTo("callActivity");

ENGINE
.processInstance()
.withInstanceKey(processInstanceKey)
.modification()
.activateElement("task")
.terminateElement(callActivityElement.getKey())
.modify();

verifyThatRootElementIsActivated(processInstanceKey, "task", BpmnElementType.MANUAL_TASK);
verifyThatProcessInstanceIsCompleted(processInstanceKey);
Assertions.assertThat(
RecordingExporter.processInstanceRecords(ProcessInstanceIntent.ELEMENT_TERMINATED)
.withProcessInstanceKey(processInstanceKey)
.withElementId(callActivityElement.getValue().getElementId())
.exists())
.isTrue();
}

private static void verifyThatRootElementIsActivated(
final long processInstanceKey, final String elementId, final BpmnElementType elementType) {
verifyThatElementIsActivated(processInstanceKey, elementId, elementType, processInstanceKey);
Expand Down

0 comments on commit 101d5a3

Please sign in to comment.