Skip to content

Commit be6593b

Browse files
Call lifecycle listener for stage child plan item instances on terminate and exit
1 parent c7904de commit be6593b

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/StageActivityBehavior.java

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import org.apache.commons.lang3.StringUtils;
1818
import org.flowable.cmmn.api.delegate.DelegatePlanItemInstance;
19+
import org.flowable.cmmn.api.runtime.PlanItemInstanceState;
1920
import org.flowable.cmmn.engine.impl.behavior.CoreCmmnTriggerableActivityBehavior;
2021
import org.flowable.cmmn.engine.impl.behavior.PlanItemActivityBehavior;
2122
import org.flowable.cmmn.engine.impl.persistence.entity.PlanItemInstanceEntity;
@@ -92,6 +93,10 @@ protected void handleChildPlanItemInstances(CommandContext commandContext, Deleg
9293
} else if (PlanItemTransition.EXIT.equals(transition)) {
9394
CommandContextUtil.getAgenda(commandContext).planExitPlanItemInstanceOperation(childPlanItemInstance, null, null, null);
9495
}
96+
97+
} else if (PlanItemTransition.TERMINATE.equals(transition) || PlanItemTransition.EXIT.equals(transition)) {
98+
CommandContextUtil.getCmmnEngineConfiguration(commandContext).getListenerNotificationHelper()
99+
.executeLifecycleListeners(commandContext, childPlanItemInstance, childPlanItemInstance.getState(), PlanItemInstanceState.TERMINATED);
95100
}
96101
}
97102
}

modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/listener/PlanItemInstanceLifecycleListenerTest.java

+37
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,43 @@ public void testUserEventListenerRepetitionWithCondition() {
405405

406406
assertThat(cmmnRuntimeService.createUserEventListenerInstanceQuery().caseInstanceId(caseInstance.getId()).count()).isZero();
407407
}
408+
409+
@Test
410+
@CmmnDeployment
411+
public void testTerminateCaseInstance() {
412+
setTestLifeCycleListener(null, new TestTerminateLifecycleListener());
413+
414+
// Start case instance
415+
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder()
416+
.caseDefinitionKey("testManualActivation")
417+
.start();
418+
419+
assertThat(testLifeCycleListener.getEvents()).isEmpty();
420+
421+
List<PlanItemInstance> planItemInstances = cmmnRuntimeService.createPlanItemInstanceQuery().caseInstanceId(caseInstance.getId()).list();
422+
assertThat(planItemInstances).hasSize(3);
423+
424+
PlanItemInstance planItemInstance = cmmnRuntimeService.createPlanItemInstanceQuery().caseInstanceId(caseInstance.getId()).planItemInstanceElementId("planItemTaskA").singleResult();
425+
assertThat(planItemInstance.getState()).isEqualTo(PlanItemInstanceState.ENABLED);
426+
427+
cmmnRuntimeService.terminateCaseInstance(caseInstance.getId());
428+
429+
List<TestLifeCycleEvent> lifeCycleEvents = testLifeCycleListener.getEvents();
430+
assertThat(lifeCycleEvents).hasSize(2);
431+
432+
for (TestLifeCycleEvent lifeCycleEvent : lifeCycleEvents) {
433+
if ("planItemTaskA".equals(lifeCycleEvent.getPlanItemInstance().getElementId())) {
434+
assertThat(lifeCycleEvent.getPlanItemInstance().getElementId()).isEqualTo("planItemTaskA");
435+
assertThat(lifeCycleEvent.getOldState()).isEqualTo(PlanItemInstanceState.ENABLED);
436+
assertThat(lifeCycleEvent.getNewState()).isEqualTo(PlanItemInstanceState.TERMINATED);
437+
438+
} else {
439+
assertThat(lifeCycleEvent.getPlanItemInstance().getElementId()).isEqualTo("planItemTaskB");
440+
assertThat(lifeCycleEvent.getOldState()).isEqualTo(PlanItemInstanceState.ENABLED);
441+
assertThat(lifeCycleEvent.getNewState()).isEqualTo(PlanItemInstanceState.TERMINATED);
442+
}
443+
}
444+
}
408445

409446
private void setTestLifeCycleListener(String planItemDefinitionType, AbstractTestLifecycleListener testLifeCycleListener) {
410447
cmmnEngineConfiguration.addPlanItemInstanceLifeCycleListener(planItemDefinitionType, testLifeCycleListener);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/* Licensed under the Apache License, Version 2.0 (the "License");
2+
* you may not use this file except in compliance with the License.
3+
* You may obtain a copy of the License at
4+
*
5+
* http://www.apache.org/licenses/LICENSE-2.0
6+
*
7+
* Unless required by applicable law or agreed to in writing, software
8+
* distributed under the License is distributed on an "AS IS" BASIS,
9+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
* See the License for the specific language governing permissions and
11+
* limitations under the License.
12+
*/
13+
package org.flowable.cmmn.test.listener;
14+
15+
import org.flowable.cmmn.api.runtime.PlanItemInstanceState;
16+
17+
public class TestTerminateLifecycleListener extends AbstractTestLifecycleListener {
18+
19+
@Override
20+
public String getSourceState() {
21+
return PlanItemInstanceState.ENABLED;
22+
}
23+
24+
@Override
25+
public String getTargetState() {
26+
return null;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions xmlns="http://www.omg.org/spec/CMMN/20151109/MODEL"
3+
targetNamespace="http://flowable.org/cmmn">
4+
<case id="testManualActivation" name="testManualActivation">
5+
<casePlanModel id="casePlanModel">
6+
7+
<planItem id="planItemStage" definitionRef="stage1"/>
8+
<planItem id="planItemTaskA" definitionRef="taskA">
9+
<itemControl>
10+
<manualActivationRule></manualActivationRule>
11+
</itemControl>
12+
</planItem>
13+
14+
<stage id="stage1">
15+
<planItem id="planItemTaskB" name="Task B" definitionRef="taskB">
16+
<itemControl>
17+
<manualActivationRule></manualActivationRule>
18+
</itemControl>
19+
</planItem>
20+
21+
<humanTask id="taskB" name="Task B"/>
22+
</stage>
23+
24+
<humanTask id="taskA" name="Task A" />
25+
</casePlanModel>
26+
</case>
27+
</definitions>

0 commit comments

Comments
 (0)