From 7841d553987b1a8df4a6de2e6e01462d59c53ad3 Mon Sep 17 00:00:00 2001 From: Christopher Welsch Date: Wed, 30 Apr 2025 13:55:23 +0200 Subject: [PATCH] added a deleted() check if an IdentityLink is already deleted or not. --- .../cmmn/test/task/CmmnTaskServiceTest.java | 34 +++++++++++++++++++ .../engine/test/api/task/TaskServiceTest.java | 33 ++++++++++++++++++ .../entity/IdentityLinkEntityManagerImpl.java | 13 ++++--- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/task/CmmnTaskServiceTest.java b/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/task/CmmnTaskServiceTest.java index e3e1b62f457..76093d5c2a4 100644 --- a/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/task/CmmnTaskServiceTest.java +++ b/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/task/CmmnTaskServiceTest.java @@ -51,6 +51,7 @@ import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; import org.junit.Test; /** @@ -362,6 +363,39 @@ public void testTaskCompletionBuilder() { } + @Test + public void testTaskIdentityLinkCountWithDeletionOfSameLink() { + Task task = cmmnTaskService.createTaskBuilder(). + name("testName"). + identityLinks(getDefaultIdentityLinks()). + create(); + + TaskEntityImpl updatedParentTask = (TaskEntityImpl) cmmnTaskService.createTaskQuery().taskId(task.getId()).singleResult(); + assertThat(updatedParentTask.getIdentityLinkCount()).isEqualTo(2); + + cmmnEngineConfiguration.getCommandExecutor().execute( + commandContext -> { + cmmnTaskService.deleteUserIdentityLink(task.getId(), "testUserFromBuilder", IdentityLinkType.CANDIDATE); + cmmnTaskService.deleteUserIdentityLink(task.getId(), "testUserFromBuilder", IdentityLinkType.CANDIDATE); + return null; + } + ); + updatedParentTask = (TaskEntityImpl) cmmnTaskService.createTaskQuery().taskId(task.getId()).singleResult(); + assertThat(updatedParentTask.getIdentityLinkCount()).isEqualTo(1); + + cmmnEngineConfiguration.getCommandExecutor().execute( + commandContext -> { + cmmnTaskService.deleteGroupIdentityLink(task.getId(), "testGroupFromBuilder", IdentityLinkType.CANDIDATE); + cmmnTaskService.deleteGroupIdentityLink(task.getId(), "testGroupFromBuilder", IdentityLinkType.CANDIDATE); + return null; + } + ); + updatedParentTask = (TaskEntityImpl) cmmnTaskService.createTaskQuery().taskId(task.getId()).singleResult(); + assertThat(updatedParentTask.getIdentityLinkCount()).isEqualTo(0); + + cmmnTaskService.deleteTask(task.getId(),true); + + } private static Set getDefaultIdentityLinks() { IdentityLinkEntityImpl identityLinkEntityCandidateUser = new IdentityLinkEntityImpl(); identityLinkEntityCandidateUser.setUserId("testUserFromBuilder"); diff --git a/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskServiceTest.java b/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskServiceTest.java index 318b18f1226..630700a97ca 100644 --- a/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskServiceTest.java +++ b/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskServiceTest.java @@ -72,6 +72,7 @@ import org.flowable.task.service.TaskPostProcessor; import org.flowable.task.service.TaskServiceConfiguration; import org.flowable.task.service.impl.persistence.CountingTaskEntity; +import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; import org.flowable.variable.api.history.HistoricVariableInstance; import org.flowable.variable.api.persistence.entity.VariableInstance; import org.junit.jupiter.api.AfterEach; @@ -152,6 +153,38 @@ public void testBuilderCreateTaskWithParent() { } } + @Test + public void testTaskIdentityLinkCountWithDeletionOfSameLink() { + task = taskService.createTaskBuilder(). + name("testName"). + identityLinks(getDefaultIdentityLinks()). + create(); + + TaskEntityImpl updatedParentTask = (TaskEntityImpl) taskService.createTaskQuery().taskId(task.getId()).singleResult(); + assertThat(updatedParentTask.getIdentityLinkCount()).isEqualTo(2); + + processEngineConfiguration.getCommandExecutor().execute( + commandContext -> { + taskService.deleteUserIdentityLink(task.getId(), "testUserBuilder", IdentityLinkType.CANDIDATE); + taskService.deleteUserIdentityLink(task.getId(), "testUserBuilder", IdentityLinkType.CANDIDATE); + return null; + } + ); + updatedParentTask = (TaskEntityImpl) taskService.createTaskQuery().taskId(task.getId()).singleResult(); + assertThat(updatedParentTask.getIdentityLinkCount()).isEqualTo(1); + + processEngineConfiguration.getCommandExecutor().execute( + commandContext -> { + taskService.deleteGroupIdentityLink(task.getId(), "testGroupBuilder", IdentityLinkType.CANDIDATE); + taskService.deleteGroupIdentityLink(task.getId(), "testGroupBuilder", IdentityLinkType.CANDIDATE); + return null; + } + ); + updatedParentTask = (TaskEntityImpl) taskService.createTaskQuery().taskId(task.getId()).singleResult(); + assertThat(updatedParentTask.getIdentityLinkCount()).isEqualTo(0); + + } + @Test public void testCreateTaskWithOwnerAssigneeAndIdentityLinks() { task = taskService.createTaskBuilder(). diff --git a/modules/flowable-identitylink-service/src/main/java/org/flowable/identitylink/service/impl/persistence/entity/IdentityLinkEntityManagerImpl.java b/modules/flowable-identitylink-service/src/main/java/org/flowable/identitylink/service/impl/persistence/entity/IdentityLinkEntityManagerImpl.java index faccfb8bf6e..80ad54589b2 100644 --- a/modules/flowable-identitylink-service/src/main/java/org/flowable/identitylink/service/impl/persistence/entity/IdentityLinkEntityManagerImpl.java +++ b/modules/flowable-identitylink-service/src/main/java/org/flowable/identitylink/service/impl/persistence/entity/IdentityLinkEntityManagerImpl.java @@ -250,8 +250,10 @@ public List deleteTaskIdentityLink(String taskId, List removedIdentityLinkEntities = new ArrayList<>(); for (IdentityLinkEntity identityLink : identityLinks) { - delete(identityLink); - removedIdentityLinkEntities.add(identityLink); + if (!identityLink.isDeleted()) { + delete(identityLink); + removedIdentityLinkEntities.add(identityLink); + } } if (currentIdentityLinks != null) { // The currentIdentityLinks might contain identity links that are in the cache, but not yet in the db @@ -261,9 +263,10 @@ public List deleteTaskIdentityLink(String taskId, List