From 1785529cb87b1b06e3f57a4d4fd47be744c59559 Mon Sep 17 00:00:00 2001 From: JacekMiszczak Date: Tue, 21 Jan 2025 22:17:23 +0100 Subject: [PATCH] Handle deleting task candidates through DelegateTask (#3998) --- .../api/task/DeleteCandidateTaskListener.java | 22 ++++++++++++ .../test/api/task/TaskIdentityLinksTest.java | 35 +++++++++++++++++-- ...LinksTest.testDeleteCandidates.bpmn20.xml} | 2 +- .../persistence/entity/TaskEntityImpl.java | 18 ++++++++-- 4 files changed, 72 insertions(+), 5 deletions(-) rename modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/{TaskIdentityLinksTest.testDeleteCandidateUser.bpmn20.xml => TaskIdentityLinksTest.testDeleteCandidates.bpmn20.xml} (89%) diff --git a/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/DeleteCandidateTaskListener.java b/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/DeleteCandidateTaskListener.java index 0aeda1b4fc4..ec5a4e85897 100644 --- a/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/DeleteCandidateTaskListener.java +++ b/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/DeleteCandidateTaskListener.java @@ -12,12 +12,34 @@ */ package org.flowable.engine.test.api.task; +import java.util.HashSet; +import java.util.Set; + import org.flowable.engine.delegate.TaskListener; +import org.flowable.identitylink.api.IdentityLink; import org.flowable.task.service.delegate.DelegateTask; public class DeleteCandidateTaskListener implements TaskListener { + public static final String VARNAME_CANDIDATE_USERS = "candidateUsers"; + public static final String VARNAME_CANDIDATE_GROUPS = "candidateGroups"; + @Override public void notify(DelegateTask delegateTask) { delegateTask.deleteCandidateUser("admin"); + delegateTask.deleteCandidateGroup("admins"); + + Set candidates = delegateTask.getCandidates(); + Set candidateUsers = new HashSet<>(); + Set candidateGroups = new HashSet<>(); + for (IdentityLink candidate : candidates) { + if (candidate.getUserId() != null) { + candidateUsers.add(candidate.getUserId()); + } else if (candidate.getGroupId() != null) { + candidateGroups.add(candidate.getGroupId()); + } + } + delegateTask.setVariable(VARNAME_CANDIDATE_USERS, candidateUsers); + delegateTask.setVariable(VARNAME_CANDIDATE_GROUPS, candidateGroups); + } } diff --git a/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskIdentityLinksTest.java b/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskIdentityLinksTest.java index af2cee997c6..232ceffb9ef 100644 --- a/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskIdentityLinksTest.java +++ b/modules/flowable-engine/src/test/java/org/flowable/engine/test/api/task/TaskIdentityLinksTest.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Set; import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.impl.history.HistoryLevel; @@ -321,16 +322,46 @@ public void testDeleteOwner() { } @Test - @Deployment(resources = "org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidateUser.bpmn20.xml") - public void testDeleteCandidateUser() { + @Deployment(resources = "org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidates.bpmn20.xml") + public void testDeleteCandidates() { runtimeService.startProcessInstanceByKey("TaskIdentityLinks"); String taskId = taskService.createTaskQuery().singleResult().getId(); List identityLinks = taskService.getIdentityLinksForTask(taskId); assertThat(identityLinks) + .filteredOn(identityLink -> identityLink.getUserId() != null) .extracting(IdentityLink::getUserId) .containsExactly("user"); + + assertThat(identityLinks) + .filteredOn(identityLink -> identityLink.getGroupId() != null) + .extracting(IdentityLink::getGroupId) + .containsExactly("users"); + + if (HistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.AUDIT, processEngineConfiguration)) { + List historicIdentityLinks = historyService.getHistoricIdentityLinksForTask(taskId); + + assertThat(historicIdentityLinks) + .filteredOn(identityLink -> identityLink.getUserId() != null) + .extracting(HistoricIdentityLink::getUserId) + .containsExactly("user"); + + assertThat(historicIdentityLinks) + .filteredOn(identityLink -> identityLink.getGroupId() != null) + .extracting(HistoricIdentityLink::getGroupId) + .containsExactly("users"); + } + + @SuppressWarnings("unchecked") + Set candidateUsers = (Set) taskService.getVariable(taskId, DeleteCandidateTaskListener.VARNAME_CANDIDATE_USERS); + assertThat(candidateUsers) + .containsExactly("user"); + + @SuppressWarnings("unchecked") + Set candidateGroups = (Set) taskService.getVariable(taskId, DeleteCandidateTaskListener.VARNAME_CANDIDATE_GROUPS); + assertThat(candidateGroups) + .containsExactly("users"); } @Test diff --git a/modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidateUser.bpmn20.xml b/modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidates.bpmn20.xml similarity index 89% rename from modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidateUser.bpmn20.xml rename to modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidates.bpmn20.xml index 47d132c339e..f8d4ce555ed 100644 --- a/modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidateUser.bpmn20.xml +++ b/modules/flowable-engine/src/test/resources/org/flowable/engine/test/api/task/TaskIdentityLinksTest.testDeleteCandidates.bpmn20.xml @@ -14,7 +14,7 @@ - user(user),user(admin) + user(user),user(admin),group(users),group(admins) diff --git a/modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/persistence/entity/TaskEntityImpl.java b/modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/persistence/entity/TaskEntityImpl.java index 1b66458905d..ecdbf4b4818 100644 --- a/modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/persistence/entity/TaskEntityImpl.java +++ b/modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/persistence/entity/TaskEntityImpl.java @@ -395,13 +395,27 @@ public void deleteCandidateGroup(String groupId) { @Override public void deleteUserIdentityLink(String userId, String identityLinkType) { IdentityLinkEntityManager identityLinkEntityManager = getIdentityLinkServiceConfiguration().getIdentityLinkEntityManager(); - identityLinkEntityManager.deleteTaskIdentityLink(this.id, getIdentityLinks(), userId, null, identityLinkType); + List identityLinkEntities = identityLinkEntityManager.deleteTaskIdentityLink(this.id, + getIdentityLinks(), userId, null, identityLinkType); + InternalTaskAssignmentManager taskAssignmentManager = getTaskAssignmentManager(); + if (taskAssignmentManager != null) { + for (IdentityLinkEntity identityLink : identityLinkEntities) { + taskAssignmentManager.deleteUserIdentityLink(this, identityLink); + } + } } @Override public void deleteGroupIdentityLink(String groupId, String identityLinkType) { IdentityLinkEntityManager identityLinkEntityManager = getIdentityLinkServiceConfiguration().getIdentityLinkEntityManager(); - identityLinkEntityManager.deleteTaskIdentityLink(this.id, getIdentityLinks(), null, groupId,identityLinkType); + List identityLinkEntities = identityLinkEntityManager.deleteTaskIdentityLink(this.id, + getIdentityLinks(), null, groupId, identityLinkType); + InternalTaskAssignmentManager taskAssignmentManager = getTaskAssignmentManager(); + if (taskAssignmentManager != null) { + for (IdentityLinkEntity identityLink : identityLinkEntities) { + taskAssignmentManager.deleteGroupIdentityLink(this, identityLink); + } + } } @Override