Skip to content

Commit a008089

Browse files
committed
Support removing a deployment via the EngineDeployer
1 parent 4210d2a commit a008089

File tree

16 files changed

+289
-8
lines changed

16 files changed

+289
-8
lines changed

modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/deployer/AppDeployer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,9 @@ protected void updateCachingAndArtifacts(AppDefinitionEntity appDefinition, AppM
122122
deployment.addDeployedArtifact(appDefinition);
123123
deployment.addAppDefinitionCacheEntry(appDefinition.getId(), cacheEntry);
124124
}
125+
126+
@Override
127+
public void undeploy(EngineDeployment parentDeployment, boolean cascade) {
128+
// Nothing to do
129+
}
125130
}

modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/deployer/AppDeploymentManager.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
package org.flowable.app.engine.impl.deployer;
1515

16+
import java.util.ArrayList;
17+
import java.util.Comparator;
1618
import java.util.List;
1719
import java.util.Map;
1820

@@ -125,10 +127,17 @@ public void removeDeployment(String deploymentId, boolean cascade) {
125127
throw new FlowableObjectNotFoundException("Could not find a deployment with id '" + deploymentId + "'.", AppDeploymentEntity.class);
126128
}
127129

130+
List<EngineDeployer> engineUnDeployers = new ArrayList<>(deployers);
131+
engineUnDeployers.sort(Comparator.comparingInt(EngineDeployer::getUndeployOrder));
132+
133+
for (EngineDeployer deployer : engineUnDeployers) {
134+
deployer.undeploy(deployment, cascade);
135+
}
136+
128137
for (AppDefinition appDefinition : new AppDefinitionQueryImpl().deploymentId(deploymentId).list()) {
129138
appDefinitionCache.remove(appDefinition.getId());
130139
}
131-
140+
132141
deploymentEntityManager.deleteDeploymentAndRelatedData(deploymentId, cascade);
133142
}
134143

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
*/
1313
package org.flowable.cmmn.engine.configurator.impl.deployer;
1414

15+
import java.util.List;
1516
import java.util.Map;
1617

1718
import org.flowable.cmmn.api.CmmnRepositoryService;
19+
import org.flowable.cmmn.api.repository.CmmnDeployment;
1820
import org.flowable.cmmn.api.repository.CmmnDeploymentBuilder;
1921
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
2022
import org.flowable.common.engine.api.repository.EngineDeployment;
@@ -29,6 +31,8 @@
2931
public class CmmnDeployer implements EngineDeployer {
3032

3133
private static final Logger LOGGER = LoggerFactory.getLogger(CmmnDeployer.class);
34+
35+
public static final int CMMN_DEFAULT_UNDEPLOY_ORDER = EngineDeployer.DEFAULT_UNDEPLOY_ORDER - 200;
3236

3337
@Override
3438
public void deploy(EngineDeployment deployment, Map<String, Object> deploymentSettings) {
@@ -61,4 +65,21 @@ public void deploy(EngineDeployment deployment, Map<String, Object> deploymentSe
6165
}
6266
}
6367

68+
@Override
69+
public void undeploy(EngineDeployment parentDeployment, boolean cascade) {
70+
CmmnRepositoryService repositoryService = CommandContextUtil.getCmmnRepositoryService();
71+
List<CmmnDeployment> deployments = repositoryService
72+
.createDeploymentQuery()
73+
.parentDeploymentId(parentDeployment.getId())
74+
.list();
75+
76+
for (CmmnDeployment deployment : deployments) {
77+
repositoryService.deleteDeployment(deployment.getId(), cascade);
78+
}
79+
}
80+
81+
@Override
82+
public int getUndeployOrder() {
83+
return CMMN_DEFAULT_UNDEPLOY_ORDER;
84+
}
6485
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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.repository.CaseDefinition;
18+
import org.flowable.engine.repository.Deployment;
19+
import org.flowable.engine.repository.ProcessDefinition;
20+
import org.junit.jupiter.api.Test;
21+
22+
/**
23+
* @author Filip Hrisafov
24+
*/
25+
public class CmmnAppDeploymentTest extends AbstractProcessEngineIntegrationTest {
26+
27+
@Test
28+
public void deletingProcessDeploymentShouldRemoveChildCaseDeployment() {
29+
Deployment deployment = processEngineRepositoryService.createDeployment()
30+
.addClasspathResource("org/flowable/cmmn/test/processTaskSameDeploymentTrue.cmmn")
31+
.addClasspathResource("org/flowable/cmmn/test/oneTaskProcess.bpmn20.xml")
32+
.deploy();
33+
34+
assertThat(cmmnRepositoryService.createCaseDefinitionQuery().list())
35+
.extracting(CaseDefinition::getKey)
36+
.containsExactlyInAnyOrder("oneProcessTaskCase");
37+
38+
assertThat(processEngineRepositoryService.createProcessDefinitionQuery().list())
39+
.extracting(ProcessDefinition::getKey)
40+
.containsExactlyInAnyOrder("oneTask");
41+
42+
processEngineRepositoryService.deleteDeployment(deployment.getId(), false);
43+
44+
assertThat(cmmnRepositoryService.createCaseDefinitionQuery().list())
45+
.extracting(CaseDefinition::getKey)
46+
.isEmpty();
47+
48+
assertThat(processEngineRepositoryService.createProcessDefinitionQuery().list())
49+
.extracting(ProcessDefinition::getKey)
50+
.isEmpty();
51+
}
52+
53+
@Test
54+
public void deletingProcessDeploymentShouldRemoveChildCaseDeploymentWithCascade() {
55+
Deployment deployment = processEngineRepositoryService.createDeployment()
56+
.addClasspathResource("org/flowable/cmmn/test/processTaskSameDeploymentTrue.cmmn")
57+
.addClasspathResource("org/flowable/cmmn/test/oneTaskProcess.bpmn20.xml")
58+
.deploy();
59+
60+
assertThat(cmmnRepositoryService.createCaseDefinitionQuery().list())
61+
.extracting(CaseDefinition::getKey)
62+
.containsExactlyInAnyOrder("oneProcessTaskCase");
63+
64+
assertThat(processEngineRepositoryService.createProcessDefinitionQuery().list())
65+
.extracting(ProcessDefinition::getKey)
66+
.containsExactlyInAnyOrder("oneTask");
67+
68+
cmmnRuntimeService.createCaseInstanceBuilder()
69+
.caseDefinitionKey("oneProcessTaskCase")
70+
.start();
71+
72+
assertThat(cmmnRuntimeService.createCaseInstanceQuery().list())
73+
.hasSize(1);
74+
assertThat(processEngineRuntimeService.createProcessInstanceQuery().list())
75+
.hasSize(1);
76+
77+
processEngineRepositoryService.deleteDeployment(deployment.getId(), true);
78+
79+
assertThat(cmmnRepositoryService.createCaseDefinitionQuery().list())
80+
.extracting(CaseDefinition::getKey)
81+
.isEmpty();
82+
83+
assertThat(processEngineRepositoryService.createProcessDefinitionQuery().list())
84+
.extracting(ProcessDefinition::getKey)
85+
.isEmpty();
86+
87+
assertThat(cmmnRuntimeService.createCaseInstanceQuery().list())
88+
.isEmpty();
89+
assertThat(processEngineRuntimeService.createProcessInstanceQuery().list())
90+
.isEmpty();
91+
}
92+
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/deployer/CmmnDeployer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,4 +446,9 @@ public CaseValidator caseValidator() {
446446
return cmmnEngineConfiguration.getCaseValidator();
447447
}
448448
}
449+
450+
@Override
451+
public void undeploy(EngineDeployment parentDeployment, boolean cascade) {
452+
// Nothing to do
453+
}
449454
}

modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/deployer/CmmnDeploymentManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
package org.flowable.cmmn.engine.impl.deployer;
1515

16+
import java.util.ArrayList;
17+
import java.util.Comparator;
1618
import java.util.List;
1719
import java.util.Map;
1820

@@ -125,6 +127,13 @@ public void removeDeployment(String deploymentId, boolean cascade) {
125127
throw new FlowableObjectNotFoundException("Could not find a deployment with id '" + deploymentId + "'.", CmmnDeploymentEntity.class);
126128
}
127129

130+
List<EngineDeployer> engineUnDeployers = new ArrayList<>(deployers);
131+
engineUnDeployers.sort(Comparator.comparingInt(EngineDeployer::getUndeployOrder));
132+
133+
for (EngineDeployer deployer : engineUnDeployers) {
134+
deployer.undeploy(deployment, cascade);
135+
}
136+
128137
deploymentEntityManager.deleteDeploymentAndRelatedData(deploymentId, cascade);
129138

130139
for (CaseDefinition caseDefinition : new CaseDefinitionQueryImpl().deploymentId(deploymentId).list()) {

modules/flowable-dmn-engine-configurator/src/main/java/org/flowable/dmn/engine/deployer/DmnDeployer.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
*/
1313
package org.flowable.dmn.engine.deployer;
1414

15+
import java.util.List;
1516
import java.util.Map;
1617

1718
import org.flowable.common.engine.api.repository.EngineDeployment;
1819
import org.flowable.common.engine.api.repository.EngineResource;
1920
import org.flowable.common.engine.impl.EngineDeployer;
21+
import org.flowable.dmn.api.DmnDeployment;
2022
import org.flowable.dmn.api.DmnDeploymentBuilder;
2123
import org.flowable.dmn.api.DmnRepositoryService;
2224
import org.flowable.dmn.engine.impl.deployer.DmnResourceUtil;
@@ -63,4 +65,17 @@ public void deploy(EngineDeployment deployment, Map<String, Object> deploymentSe
6365
dmnDeploymentBuilder.deploy();
6466
}
6567
}
68+
69+
@Override
70+
public void undeploy(EngineDeployment parentDeployment, boolean cascade) {
71+
DmnRepositoryService repositoryService = CommandContextUtil.getDmnRepositoryService();
72+
List<DmnDeployment> deployments = repositoryService
73+
.createDeploymentQuery()
74+
.parentDeploymentId(parentDeployment.getId())
75+
.list();
76+
77+
for (DmnDeployment deployment : deployments) {
78+
repositoryService.deleteDeployment(deployment.getId());
79+
}
80+
}
6681
}

modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/EngineDeployer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,14 @@
2121
*/
2222
public interface EngineDeployer {
2323

24+
int DEFAULT_UNDEPLOY_ORDER = 0;
25+
2426
void deploy(EngineDeployment deployment, Map<String, Object> deploymentSettings);
27+
28+
void undeploy(EngineDeployment parentDeployment, boolean cascade);
29+
30+
default int getUndeployOrder() {
31+
return DEFAULT_UNDEPLOY_ORDER;
32+
}
33+
2534
}

modules/flowable-engine-configurator/src/main/java/org/flowable/engine/configurator/impl/deployer/BpmnDeployer.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313
package org.flowable.engine.configurator.impl.deployer;
1414

15+
import java.util.List;
1516
import java.util.Map;
1617

1718
import org.flowable.common.engine.api.repository.EngineDeployment;
@@ -20,6 +21,7 @@
2021
import org.flowable.engine.RepositoryService;
2122
import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil;
2223
import org.flowable.engine.impl.util.CommandContextUtil;
24+
import org.flowable.engine.repository.Deployment;
2325
import org.flowable.engine.repository.DeploymentBuilder;
2426
import org.slf4j.Logger;
2527
import org.slf4j.LoggerFactory;
@@ -30,6 +32,8 @@
3032
public class BpmnDeployer implements EngineDeployer {
3133

3234
private static final Logger LOGGER = LoggerFactory.getLogger(BpmnDeployer.class);
35+
36+
public static final int BPMN_DEFAULT_UNDEPLOY_ORDER = EngineDeployer.DEFAULT_UNDEPLOY_ORDER - 100;
3337

3438
@Override
3539
public void deploy(EngineDeployment deployment, Map<String, Object> deploymentSettings) {
@@ -71,4 +75,22 @@ protected boolean isBpmnResource(String resourceName) {
7175

7276
return false;
7377
}
78+
79+
@Override
80+
public void undeploy(EngineDeployment parentDeployment, boolean cascade) {
81+
RepositoryService repositoryService = CommandContextUtil.getProcessEngineConfiguration().getRepositoryService();
82+
List<Deployment> deployments = repositoryService
83+
.createDeploymentQuery()
84+
.parentDeploymentId(parentDeployment.getId())
85+
.list();
86+
87+
for (Deployment deployment : deployments) {
88+
repositoryService.deleteDeployment(deployment.getId(), cascade);
89+
}
90+
}
91+
92+
@Override
93+
public int getUndeployOrder() {
94+
return BPMN_DEFAULT_UNDEPLOY_ORDER;
95+
}
7496
}

modules/flowable-engine-configurator/src/test/java/org/flowable/engine/configurator/test/DeploymentTest.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.flowable.engine.configurator.test;
1414

1515
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1617

1718
import org.flowable.app.api.AppRepositoryService;
1819
import org.flowable.app.api.repository.AppDefinition;
@@ -92,16 +93,26 @@ public void testAppDefinitionDeployed() throws Exception {
9293
CaseDefinition caseDefinition = cmmnRepositoryService.createCaseDefinitionQuery().deploymentId(cmmnDeployment.getId()).singleResult();
9394
assertThat(caseDefinition).isNotNull();
9495
assertThat(caseDefinition.getKey()).isEqualTo("oneTaskCase");
96+
97+
appRepositoryService.deleteDeployment(appDeployment.getId(), true);
98+
99+
assertThat(appRepositoryService.createAppDefinitionQuery().list())
100+
.extracting(AppDefinition::getKey)
101+
.isEmpty();
102+
103+
assertThat(repositoryService.createProcessDefinitionQuery().list())
104+
.extracting(ProcessDefinition::getKey)
105+
.isEmpty();
106+
107+
assertThat(cmmnRepositoryService.createCaseDefinitionQuery().list())
108+
.extracting(CaseDefinition::getKey)
109+
.isEmpty();
95110

96111

97112
} finally {
98-
appRepositoryService.deleteDeployment(appDeployment.getId(), true);
99-
if (deployment != null) {
100-
processEngineConfiguration.getRepositoryService().deleteDeployment(deployment.getId());
101-
}
102-
103-
if (cmmnDeployment != null) {
104-
cmmnEngineConfiguration.getCmmnRepositoryService().deleteDeployment(cmmnDeployment.getId(), true);
113+
appDeployment = appRepositoryService.createDeploymentQuery().deploymentId(appDeployment.getId()).singleResult();
114+
if (appDeployment != null) {
115+
appRepositoryService.deleteDeployment(appDeployment.getId(), true);
105116
}
106117
}
107118
}

0 commit comments

Comments
 (0)