Skip to content

Commit 9bfbd5e

Browse files
BertMatthysfiliphr
authored andcommitted
Set overrideCaseDefinitionId for CaseTask in bpmn so child instance is created in the correct tenant
1 parent f1c0d4d commit 9bfbd5e

6 files changed

Lines changed: 227 additions & 1 deletion

File tree

modules/flowable-cmmn-engine-configurator/src/main/java/org/flowable/cmmn/engine/configurator/impl/cmmn/DefaultCaseInstanceService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ public String startCaseInstanceByKey(String caseDefinitionKey, String predefined
6868

6969
if (tenantId != null) {
7070
caseInstanceBuilder.tenantId(tenantId);
71+
caseInstanceBuilder.overrideCaseDefinitionTenantId(tenantId);
7172
}
72-
73+
7374
if (executionId != null) {
7475
caseInstanceBuilder.callbackId(executionId);
7576
caseInstanceBuilder.callbackType(CallbackTypes.EXECUTION_CHILD_CASE);
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
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;
14+
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
17+
import org.flowable.cmmn.api.runtime.CaseInstance;
18+
import org.flowable.cmmn.engine.test.CmmnDeployment;
19+
import org.flowable.engine.repository.Deployment;
20+
import org.flowable.engine.runtime.ProcessInstance;
21+
import org.flowable.task.api.Task;
22+
import org.junit.jupiter.api.Test;
23+
24+
/**
25+
* Tests that verify the child instance gets the parent's tenant when falling back to the default tenant
26+
* for cross-engine and same-engine scenarios.
27+
*/
28+
public class FallbackTenantTest extends AbstractProcessEngineIntegrationTest {
29+
30+
@Test
31+
public void testBpmnCaseTaskFallbackToDefaultTenant() {
32+
// Deploy the CMMN case to the default tenant (no tenant)
33+
org.flowable.cmmn.api.repository.CmmnDeployment cmmnDeployment = cmmnRepositoryService.createDeployment()
34+
.addClasspathResource("org/flowable/cmmn/test/oneHumanTaskCase.cmmn")
35+
.deploy();
36+
37+
// Deploy the BPMN process with a case task (fallbackToDefaultTenant=true) to a specific tenant
38+
Deployment bpmnDeployment = processEngineRepositoryService.createDeployment()
39+
.addClasspathResource("org/flowable/cmmn/test/caseTaskProcessFallbackToDefaultTenant.bpmn20.xml")
40+
.tenantId("acme")
41+
.deploy();
42+
43+
try {
44+
ProcessInstance processInstance = processEngineRuntimeService.createProcessInstanceBuilder()
45+
.processDefinitionKey("caseTask")
46+
.tenantId("acme")
47+
.start();
48+
49+
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceQuery().singleResult();
50+
assertThat(caseInstance).isNotNull();
51+
assertThat(caseInstance.getTenantId()).isEqualTo("acme");
52+
53+
Task caseTask = cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).singleResult();
54+
assertThat(caseTask.getTenantId()).isEqualTo("acme");
55+
56+
cmmnTaskService.complete(caseTask.getId());
57+
58+
Task processTask = processEngineTaskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
59+
assertThat(processTask).isNotNull();
60+
processEngineTaskService.complete(processTask.getId());
61+
62+
assertThat(processEngineRuntimeService.createProcessInstanceQuery().count()).isZero();
63+
} finally {
64+
processEngineRepositoryService.deleteDeployment(bpmnDeployment.getId(), true);
65+
cmmnRepositoryService.deleteDeployment(cmmnDeployment.getId(), true);
66+
}
67+
}
68+
69+
@Test
70+
@CmmnDeployment(
71+
resources = "org/flowable/cmmn/test/FallbackTenantTest.processTaskFallbackToDefaultTenant.cmmn",
72+
tenantId = "acme"
73+
)
74+
public void testCmmnProcessTaskFallbackToDefaultTenant() {
75+
// Deploy the BPMN process to the default tenant (no tenant)
76+
Deployment bpmnDeployment = processEngineRepositoryService.createDeployment()
77+
.addClasspathResource("org/flowable/cmmn/test/oneTaskProcess.bpmn20.xml")
78+
.deploy();
79+
80+
try {
81+
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder()
82+
.caseDefinitionKey("processTaskCase")
83+
.tenantId("acme")
84+
.start();
85+
86+
Task processTask = processEngineTaskService.createTaskQuery().singleResult();
87+
assertThat(processTask).isNotNull();
88+
assertThat(processTask.getTenantId()).isEqualTo("acme");
89+
90+
ProcessInstance processInstance = processEngineRuntimeService.createProcessInstanceQuery()
91+
.processInstanceId(processTask.getProcessInstanceId()).singleResult();
92+
assertThat(processInstance.getTenantId()).isEqualTo("acme");
93+
94+
processEngineTaskService.complete(processTask.getId());
95+
assertThat(processEngineRuntimeService.createProcessInstanceQuery().count()).isZero();
96+
} finally {
97+
processEngineRepositoryService.deleteDeployment(bpmnDeployment.getId(), true);
98+
}
99+
}
100+
101+
@Test
102+
public void testBpmnCallActivityFallbackToDefaultTenant() {
103+
// Deploy the child process to the default tenant (no tenant)
104+
Deployment childDeployment = processEngineRepositoryService.createDeployment()
105+
.addClasspathResource("org/flowable/cmmn/test/oneTaskProcess.bpmn20.xml")
106+
.deploy();
107+
108+
// Deploy the parent process with a call activity (fallbackToDefaultTenant=true) to a specific tenant
109+
Deployment parentDeployment = processEngineRepositoryService.createDeployment()
110+
.addClasspathResource("org/flowable/cmmn/test/FallbackTenantTest.callActivityFallbackToDefaultTenant.bpmn20.xml")
111+
.tenantId("acme")
112+
.deploy();
113+
114+
try {
115+
ProcessInstance processInstance = processEngineRuntimeService.createProcessInstanceBuilder()
116+
.processDefinitionKey("callActivityProcess")
117+
.tenantId("acme")
118+
.start();
119+
120+
Task task = processEngineTaskService.createTaskQuery().singleResult();
121+
assertThat(task).isNotNull();
122+
assertThat(task.getTenantId()).isEqualTo("acme");
123+
124+
ProcessInstance childProcess = processEngineRuntimeService.createProcessInstanceQuery()
125+
.superProcessInstanceId(processInstance.getId()).singleResult();
126+
assertThat(childProcess).isNotNull();
127+
assertThat(childProcess.getTenantId()).isEqualTo("acme");
128+
129+
processEngineTaskService.complete(task.getId());
130+
assertThat(processEngineRuntimeService.createProcessInstanceQuery().count()).isZero();
131+
} finally {
132+
processEngineRepositoryService.deleteDeployment(parentDeployment.getId(), true);
133+
processEngineRepositoryService.deleteDeployment(childDeployment.getId(), true);
134+
}
135+
}
136+
137+
@Test
138+
@CmmnDeployment(
139+
resources = "org/flowable/cmmn/test/FallbackTenantTest.caseTaskFallbackToDefaultTenant.cmmn",
140+
tenantId = "acme"
141+
)
142+
public void testCmmnCaseTaskFallbackToDefaultTenant() {
143+
// Deploy the child case to the default tenant (no tenant)
144+
org.flowable.cmmn.api.repository.CmmnDeployment childDeployment = cmmnRepositoryService.createDeployment()
145+
.addClasspathResource("org/flowable/cmmn/test/oneHumanTaskCase.cmmn")
146+
.deploy();
147+
148+
try {
149+
CaseInstance parentCase = cmmnRuntimeService.createCaseInstanceBuilder()
150+
.caseDefinitionKey("caseTaskCase")
151+
.tenantId("acme")
152+
.start();
153+
154+
// The child case should exist with the parent's tenant
155+
CaseInstance childCase = cmmnRuntimeService.createCaseInstanceQuery()
156+
.caseDefinitionKey("oneHumanTaskCase").singleResult();
157+
assertThat(childCase).isNotNull();
158+
assertThat(childCase.getTenantId()).isEqualTo("acme");
159+
160+
Task task = cmmnTaskService.createTaskQuery().caseInstanceId(childCase.getId()).singleResult();
161+
assertThat(task).isNotNull();
162+
assertThat(task.getTenantId()).isEqualTo("acme");
163+
164+
cmmnTaskService.complete(task.getId());
165+
assertThat(cmmnRuntimeService.createCaseInstanceQuery().count()).isZero();
166+
} finally {
167+
cmmnRepositoryService.deleteDeployment(childDeployment.getId(), true);
168+
}
169+
}
170+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
3+
xmlns:flowable="http://flowable.org/bpmn"
4+
targetNamespace="http://flowable.org/bpmn">
5+
<process id="callActivityProcess">
6+
<startEvent id="theStart" />
7+
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="callSubProcess" />
8+
<callActivity id="callSubProcess" calledElement="oneTask" flowable:fallbackToDefaultTenant="true"/>
9+
<sequenceFlow id="flow2" sourceRef="callSubProcess" targetRef="theEnd" />
10+
<endEvent id="theEnd" />
11+
</process>
12+
</definitions>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions xmlns="http://www.omg.org/spec/CMMN/20151109/MODEL"
3+
xmlns:flowable="http://flowable.org/cmmn"
4+
targetNamespace="http://flowable.org/cmmn">
5+
6+
<case id="caseTaskCase">
7+
<casePlanModel id="myPlanModel" name="My CasePlanModel">
8+
<planItem id="planItem1" name="The Case" definitionRef="theCase" />
9+
<caseTask id="theCase" caseRef="oneHumanTaskCase" flowable:fallbackToDefaultTenant="true"/>
10+
</casePlanModel>
11+
</case>
12+
13+
</definitions>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions xmlns="http://www.omg.org/spec/CMMN/20151109/MODEL"
3+
xmlns:flowable="http://flowable.org/cmmn"
4+
targetNamespace="http://flowable.org/cmmn">
5+
6+
<case id="processTaskCase">
7+
<casePlanModel id="myPlanModel" name="My CasePlanModel">
8+
<planItem id="planItem1" name="The Process" definitionRef="theProcess" />
9+
<processTask id="theProcess" processRef="oneTaskProcess" isBlocking="false" flowable:fallbackToDefaultTenant="true"/>
10+
</casePlanModel>
11+
</case>
12+
13+
<process id="oneTaskProcess" name="The One Task process" externalRef="oneTask" />
14+
15+
</definitions>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
3+
xmlns:flowable="http://flowable.org/bpmn"
4+
targetNamespace="http://flowable.org/bpmn">
5+
<process id="caseTask">
6+
<startEvent id="theStart" />
7+
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="caseServiceTask" />
8+
<serviceTask flowable:type="case" id="caseServiceTask" flowable:caseDefinitionKey="oneHumanTaskCase"
9+
flowable:fallbackToDefaultTenant="true" flowable:caseInstanceIdVariableName="caseInstanceId"/>
10+
<sequenceFlow id="flow2" sourceRef="caseServiceTask" targetRef="theTask" />
11+
<userTask id="theTask" name="my task" />
12+
<sequenceFlow id="flow3" sourceRef="theTask" targetRef="theEnd" />
13+
<endEvent id="theEnd" />
14+
</process>
15+
</definitions>

0 commit comments

Comments
 (0)