From 88eb96bd98ba4a5da0cc9de8d9e57d46b7188e7b Mon Sep 17 00:00:00 2001 From: omtamrakar Date: Sat, 7 Nov 2026 10:07:54 +0530 Subject: [PATCH 1/5] fix: detect resource deletion in duplicate deployment filter Co-Authored-By: Claude Code --- .../java/org/flowable/engine/impl/cmd/DeployCmd.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/DeployCmd.java b/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/DeployCmd.java index 865c938f787..e0a74bb406a 100644 --- a/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/DeployCmd.java +++ b/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/DeployCmd.java @@ -164,6 +164,16 @@ protected boolean deploymentsDiffer(DeploymentEntity deployment, DeploymentEntit Map resources = deployment.getResources(); Map savedResources = saved.getResources(); + // Check if any non-generated resource was removed in the new deployment + for (String savedResourceName : savedResources.keySet()) { + EngineResource savedResource = savedResources.get(savedResourceName); + if (savedResource != null && !savedResource.isGenerated()) { + if (!resources.containsKey(savedResourceName)) { + return true; + } + } + } + for (String resourceName : resources.keySet()) { EngineResource savedResource = savedResources.get(resourceName); From 242797ccbe16981601d6cce0f12db5acf6f78c2e Mon Sep 17 00:00:00 2001 From: omtamrakar Date: Sat, 7 Nov 2026 11:36:36 +0530 Subject: [PATCH 2/5] fix: detect resource deletion in app engine duplicate deployment filter --- .../org/flowable/app/engine/impl/cmd/DeployCmd.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/cmd/DeployCmd.java b/modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/cmd/DeployCmd.java index 45a0d146caf..ce28764af46 100644 --- a/modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/cmd/DeployCmd.java +++ b/modules/flowable-app-engine/src/main/java/org/flowable/app/engine/impl/cmd/DeployCmd.java @@ -91,6 +91,16 @@ protected boolean deploymentsDiffer(AppDeploymentEntity deployment, AppDeploymen Map resources = deployment.getResources(); Map savedResources = saved.getResources(); + // Check if any non-generated resource was removed in the new deployment + for (String savedResourceName : savedResources.keySet()) { + EngineResource savedResource = savedResources.get(savedResourceName); + if (savedResource != null && !savedResource.isGenerated()) { + if (!resources.containsKey(savedResourceName)) { + return true; + } + } + } + for (String resourceName : resources.keySet()) { EngineResource savedResource = savedResources.get(resourceName); From 84df73379df83a15ebfffb5e675c79f7a2202258 Mon Sep 17 00:00:00 2001 From: omtamrakar Date: Sun, 8 Nov 2026 00:01:36 +0530 Subject: [PATCH 3/5] fix: detect resource deletion in cmmn engine duplicate deployment filter --- .../org/flowable/cmmn/engine/impl/cmd/DeployCmd.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java index d9cd8d7d691..b889a72a89e 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java @@ -100,6 +100,16 @@ protected boolean deploymentsDiffer(CmmnDeploymentEntity deployment, CmmnDeploym Map resources = deployment.getResources(); Map savedResources = saved.getResources(); + // Check if any non-generated resource was removed in the new deployment + for (String savedResourceName : savedResources.keySet()) { + EngineResource savedResource = savedResources.get(savedResourceName); + if (savedResource != null && !savedResource.isGenerated()) { + if (!resources.containsKey(savedResourceName)) { + return true; + } + } + } + for (String resourceName : resources.keySet()) { EngineResource savedResource = savedResources.get(resourceName); From b1269f8b106774d7df676267bda88497faed09f7 Mon Sep 17 00:00:00 2001 From: omtamrakar Date: Sun, 8 Nov 2026 00:07:08 +0530 Subject: [PATCH 4/5] fix: detect resource deletion in cmmn engine duplicate deployment filter using modern java stream api --- .../flowable/cmmn/engine/impl/cmd/DeployCmd.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java index b889a72a89e..e9046d94acd 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/DeployCmd.java @@ -100,14 +100,13 @@ protected boolean deploymentsDiffer(CmmnDeploymentEntity deployment, CmmnDeploym Map resources = deployment.getResources(); Map savedResources = saved.getResources(); - // Check if any non-generated resource was removed in the new deployment - for (String savedResourceName : savedResources.keySet()) { - EngineResource savedResource = savedResources.get(savedResourceName); - if (savedResource != null && !savedResource.isGenerated()) { - if (!resources.containsKey(savedResourceName)) { - return true; - } - } + // Check if any non-generated resource was removed in the new deployment (Modern Java Functional Stream) + boolean hasRemovedResource = savedResources.entrySet().stream() + .filter(entry -> entry.getValue() != null && !entry.getValue().isGenerated()) + .anyMatch(entry -> !resources.containsKey(entry.getKey())); + + if (hasRemovedResource) { + return true; } for (String resourceName : resources.keySet()) { From 8e0c196a77b3aec077705f996c2de0cf960f99a2 Mon Sep 17 00:00:00 2001 From: omtamrakar Date: Sun, 8 Nov 2026 00:17:57 +0530 Subject: [PATCH 5/5] fix: detect resource deletion in dmn engine duplicate deployment filter using modern java stream api --- .../java/org/flowable/dmn/engine/impl/cmd/DeployCmd.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/DeployCmd.java b/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/DeployCmd.java index d6ce57bb693..1168b12b33c 100644 --- a/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/DeployCmd.java +++ b/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/DeployCmd.java @@ -123,6 +123,15 @@ protected boolean deploymentsDiffer(DmnDeploymentEntity deployment, DmnDeploymen Map resources = deployment.getResources(); Map savedResources = saved.getResources(); + // Check if any non-generated resource was removed in the new deployment (Modern Java Functional Stream) + boolean hasRemovedResource = savedResources.entrySet().stream() + .filter(entry -> entry.getValue() != null && !entry.getValue().isGenerated()) + .anyMatch(entry -> !resources.containsKey(entry.getKey())); + + if (hasRemovedResource) { + return true; + } + for (String resourceName : resources.keySet()) { EngineResource savedResource = savedResources.get(resourceName);