Skip to content

Commit 8ea2976

Browse files
committed
Support resolving caseInstance and planItemInstance in an task listener expression
1 parent bc9d662 commit 8ea2976

File tree

6 files changed

+34
-24
lines changed

6 files changed

+34
-24
lines changed

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/el/CmmnVariableScopeELResolver.java

+28-10
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
*/
1313
package org.flowable.cmmn.engine.impl.el;
1414

15+
import org.apache.commons.lang3.StringUtils;
16+
import org.flowable.cmmn.api.runtime.PlanItemInstance;
1517
import org.flowable.cmmn.engine.impl.persistence.entity.CaseInstanceEntity;
1618
import org.flowable.cmmn.engine.impl.persistence.entity.PlanItemInstanceEntity;
1719
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
20+
import org.flowable.common.engine.api.scope.ScopeTypes;
1821
import org.flowable.common.engine.api.variable.VariableContainer;
1922
import org.flowable.common.engine.impl.el.VariableContainerELResolver;
2023
import org.flowable.common.engine.impl.javax.el.ELContext;
24+
import org.flowable.task.api.TaskInfo;
2125
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
2226

2327
/**
@@ -40,16 +44,30 @@ public Object getValue(ELContext context, Object base, Object property) {
4044
context.setPropertyResolved(true);
4145
return variableContainer;
4246

43-
} else if ((CASE_INSTANCE_KEY.equals(property) && variableContainer instanceof PlanItemInstanceEntity)) {
44-
context.setPropertyResolved(true);
45-
String caseInstanceId = ((PlanItemInstanceEntity) variableContainer).getCaseInstanceId();
46-
return CommandContextUtil.getCaseInstanceEntityManager().findById(caseInstanceId);
47-
48-
} else if (PLAN_ITEM_INSTANCE_KEY.equals(property) && variableContainer instanceof CaseInstanceEntity) {
49-
// Special case: using planItemInstance as key, but only a caseInstance available
50-
// (Happens for example for cross boundary plan items)
51-
context.setPropertyResolved(true);
52-
return variableContainer;
47+
} else if ((CASE_INSTANCE_KEY.equals(property))) {
48+
if (variableContainer instanceof PlanItemInstance planItemInstance) {
49+
context.setPropertyResolved(true);
50+
String caseInstanceId = planItemInstance.getCaseInstanceId();
51+
return CommandContextUtil.getCaseInstanceEntityManager().findById(caseInstanceId);
52+
} else if (variableContainer instanceof TaskInfo task) {
53+
if (StringUtils.isNotEmpty(task.getScopeId()) && ScopeTypes.CMMN.equals(task.getScopeType())) {
54+
context.setPropertyResolved(true);
55+
String caseInstanceId = task.getScopeId();
56+
return CommandContextUtil.getCaseInstanceEntityManager().findById(caseInstanceId);
57+
}
58+
}
59+
} else if (PLAN_ITEM_INSTANCE_KEY.equals(property)) {
60+
if (variableContainer instanceof CaseInstanceEntity) {
61+
// Special case: using planItemInstance as key, but only a caseInstance available
62+
// (Happens for example for cross boundary plan items)
63+
context.setPropertyResolved(true);
64+
return variableContainer;
65+
} else if (variableContainer instanceof TaskInfo task) {
66+
if (StringUtils.isNotEmpty(task.getSubScopeId()) && ScopeTypes.CMMN.equals(task.getScopeType())) {
67+
context.setPropertyResolved(true);
68+
return CommandContextUtil.getPlanItemInstanceEntityManager().findById(task.getSubScopeId());
69+
}
70+
}
5371

5472
} else if (PLAN_ITEM_INSTANCES_KEY.equals(property)) {
5573
context.setPropertyResolved(true);

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

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public void testListeners() {
7373
assertVariable(caseInstance, "classDelegateVariable", "Hello World");
7474
assertVariable(caseInstance, "variableFromDelegateExpression", "Hello World from delegate expression");
7575
assertVariable(caseInstance, "expressionVar", "planItemIsActive");
76+
assertVariable(caseInstance, "expressionCaseVar", "planItemIsActive");
7677

7778
assertVariable(caseInstance, "stageActive",true);
7879
assertVariable(caseInstance, "milestoneReached", true);

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

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public void testCreateEvent() {
6666
assertVariable(caseInstance, "variableFromClassDelegate", "Hello World from class delegate");
6767
assertVariable(caseInstance, "variableFromDelegateExpression", "Hello World from delegate expression");
6868
assertVariable(caseInstance, "expressionVariable", "Hello World from expression");
69+
assertVariable(caseInstance, "expressionPlanItemVariable", "Hello World from expression");
70+
assertVariable(caseInstance, "expressionCaseVariable", "Hello World from expression");
6971
assertVariable(caseInstance, "javascriptResult", "Hello World from JavaScript");
7072
assertVariable(caseInstance, "javaScriptVariable", "setInJavaScript");
7173
assertVariable(caseInstance, "groovyVar", "setInGroovy");

modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/task/CmmnTaskServiceTest.java

-14
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,6 @@ public void testOneHumanTaskExpressionCase() {
156156
}
157157
}
158158

159-
@Test
160-
@CmmnDeployment(resources = "org/flowable/cmmn/test/task/CmmnTaskServiceTest.testOneHumanTaskCase.cmmn")
161-
public void testOneHumanTaskVariableScopeExpressionCase() {
162-
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase").start();
163-
Task task = cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).singleResult();
164-
165-
assertThatThrownBy(() -> cmmnTaskService.complete(task.getId(), Collections.singletonMap(
166-
"${caseInstance.name}", "newCaseName"
167-
)
168-
))
169-
.isInstanceOf(FlowableException.class)
170-
.hasMessageContaining("Error while evaluating expression: ${caseInstance.name}");
171-
}
172-
173159
@Test
174160
@CmmnDeployment(resources = "org/flowable/cmmn/test/task/CmmnTaskServiceTest.testOneHumanTaskCase.cmmn")
175161
public void testOneHumanTaskCompleteSetCaseName() {

modules/flowable-cmmn-engine/src/test/resources/org/flowable/cmmn/test/listener/PlanItemLifecycleListenerTest.testListeners.cmmn

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<extensionElements>
99
<flowable:planItemLifecycleListener sourceState="available" targetState="active" class="org.flowable.cmmn.test.listener.TestLifecycleListener"></flowable:planItemLifecycleListener>
1010
<flowable:planItemLifecycleListener sourceState="available" targetState="active" expression="${planItemInstance.setVariable('expressionVar', 'planItemIsActive')}"></flowable:planItemLifecycleListener>
11+
<flowable:planItemLifecycleListener sourceState="available" targetState="active" expression="${caseInstance.setVariable('expressionCaseVar', 'planItemIsActive')}"></flowable:planItemLifecycleListener>
1112
<flowable:planItemLifecycleListener sourceState="available" targetState="active" delegateExpression="${delegateListener}"></flowable:planItemLifecycleListener>
1213
</extensionElements>
1314
</humanTask>

modules/flowable-cmmn-engine/src/test/resources/org/flowable/cmmn/test/listener/TaskListenerTest.testCreateEvent.cmmn

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
<humanTask id="sid-36995D0E-BAB2-44F2-ADD4-FD9070AFD6CA" name="Expression">
1616
<extensionElements>
1717
<flowable:taskListener event="create" expression="${task.setVariable('expressionVariable', 'Hello World from expression')}"></flowable:taskListener>
18+
<flowable:taskListener event="create" expression="${planItemInstance.setVariable('expressionPlanItemVariable', 'Hello World from expression')}"></flowable:taskListener>
19+
<flowable:taskListener event="create" expression="${caseInstance.setVariable('expressionCaseVariable', 'Hello World from expression')}"></flowable:taskListener>
1820
</extensionElements>
1921
</humanTask>
2022
<humanTask id="sid-B79A0634-B1BF-44B7-8AC5-35E9E17CC65A" name="DelegateExpression">

0 commit comments

Comments
 (0)