Skip to content

Commit de65b81

Browse files
committed
feat(task): consider cache during deletion of identityLinks
related to #4846
1 parent 5215d0c commit de65b81

File tree

4 files changed

+105
-5
lines changed

4 files changed

+105
-5
lines changed

engine/src/main/java/org/camunda/bpm/engine/impl/persistence/entity/TaskEntity.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.Map;
3333
import java.util.Set;
3434

35+
import java.util.stream.Collectors;
3536
import org.camunda.bpm.engine.ProcessEngine;
3637
import org.camunda.bpm.engine.ProcessEngineException;
3738
import org.camunda.bpm.engine.ProcessEngineServices;
@@ -756,10 +757,7 @@ public IdentityLinkEntity newIdentityLink(String userId, String groupId, String
756757
public void deleteIdentityLink(String userId, String groupId, String type) {
757758
ensureTaskActive();
758759

759-
List<IdentityLinkEntity> identityLinks = Context
760-
.getCommandContext()
761-
.getIdentityLinkManager()
762-
.findIdentityLinkByTaskUserGroupAndType(id, userId, groupId, type);
760+
List<IdentityLinkEntity> identityLinks = getIdentityLinks(userId, groupId, type);
763761

764762
for (IdentityLinkEntity identityLink: identityLinks) {
765763
fireDeleteIdentityLinkAuthorizationProvider(type, userId, groupId);
@@ -774,7 +772,8 @@ public void deleteIdentityLinks() {
774772
identityLinkEntity.getUserId(), identityLinkEntity.getGroupId());
775773
identityLinkEntity.delete(false);
776774
}
777-
isIdentityLinksInitialized = false;
775+
isIdentityLinksInitialized = false; // TODO why set to false? If deletion is not yet in the DB, it will be fetched
776+
// again
778777
}
779778

780779
@Override
@@ -858,6 +857,14 @@ public List<IdentityLinkEntity> getIdentityLinks() {
858857
return taskIdentityLinkEntities;
859858
}
860859

860+
public List<IdentityLinkEntity> getIdentityLinks(String userId, String groupId, String type) {
861+
return taskIdentityLinkEntities.stream()
862+
.filter(identityLink -> (userId == null || userId.equals(identityLink.getUserId()))
863+
&& (groupId == null || groupId.equals(identityLink.getGroupId()))
864+
&& (type == null || type.equals(identityLink.getType())))
865+
.collect(Collectors.toList());
866+
}
867+
861868
@SuppressWarnings("unchecked")
862869
public Map<String, Object> getActivityInstanceVariables() {
863870
if (execution!=null) {

engine/src/test/java/org/camunda/bpm/engine/test/bpmn/tasklistener/TaskListenerTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,20 @@ public void resetListenerCounters() {
7676

7777
// CREATE Task Listener tests
7878

79+
@Test
80+
@Deployment(resources = {"org/camunda/bpm/engine/test/bpmn/tasklistener/TaskListenerTest.testAddAndDeleteRecordsWithinSameListener.bpmn20.xml"})
81+
public void testAddingAndDeletingRecordsWithinSameListener() {
82+
runtimeService.startProcessInstanceByKey("taskListenerProcessAddAndDelete");
83+
Task task = taskService.createTaskQuery().singleResult();
84+
assertEquals("TaskCreateListener is listening!", task.getDescription());
85+
86+
assertEquals(0L, runtimeService.createVariableInstanceQuery().variableName("aVarName").count());
87+
assertEquals(0L, taskService.createTaskQuery().taskCandidateUser("aCandidateUserId").count());
88+
assertEquals(0L, taskService.createTaskQuery().taskCandidateGroup("aCandidateGroupId").count());
89+
assertEquals(0L, taskService.createTaskQuery().taskCandidateGroup("anotherCandidateGroupId").count());
90+
assertEquals(0L, taskService.createTaskQuery().taskAssignee("anAssigneeUserId").count());
91+
}
92+
7993
@Test
8094
@Deployment(resources = {"org/camunda/bpm/engine/test/bpmn/tasklistener/TaskListenerTest.bpmn20.xml"})
8195
public void testTaskCreateListener() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.camunda.bpm.engine.test.bpmn.tasklistener.util;
2+
3+
import org.camunda.bpm.engine.delegate.DelegateTask;
4+
import org.camunda.bpm.engine.delegate.TaskListener;
5+
import org.camunda.bpm.engine.task.IdentityLinkType;
6+
7+
public class TaskCreateListenerAddAndDelete implements TaskListener {
8+
9+
@Override
10+
public void notify(DelegateTask delegateTask) {
11+
delegateTask.setDescription("TaskCreateListener is listening!");
12+
13+
var taskService = delegateTask.getProcessEngineServices().getTaskService();
14+
taskService.addCandidateUser(delegateTask.getId(), "aCandidateUserId");
15+
taskService.deleteCandidateUser(delegateTask.getId(), "aCandidateUserId");
16+
17+
taskService.addCandidateGroup(delegateTask.getId(), "aCandidateGroupId");
18+
taskService.deleteCandidateGroup(delegateTask.getId(), "aCandidateGroupId");
19+
20+
taskService.addUserIdentityLink(delegateTask.getId(), "anAssigneeUserId", IdentityLinkType.ASSIGNEE);
21+
taskService.deleteUserIdentityLink(delegateTask.getId(), "anAssigneeUserId", IdentityLinkType.ASSIGNEE);
22+
23+
taskService.addGroupIdentityLink(delegateTask.getId(), "anotherCandidateGroupId", IdentityLinkType.CANDIDATE);
24+
taskService.deleteGroupIdentityLink(delegateTask.getId(), "anotherCandidateGroupId", IdentityLinkType.CANDIDATE);
25+
26+
var runTimeService = delegateTask.getProcessEngineServices().getRuntimeService();
27+
runTimeService.setVariable(delegateTask.getExecutionId(), "aVarName", "aVarValue");
28+
runTimeService.removeVariable(delegateTask.getExecutionId(), "aVarName");
29+
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<definitions id="taskListenerExample"
3+
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
4+
xmlns:camunda="http://camunda.org/schema/1.0/bpmn"
5+
targetNamespace="Examples">
6+
7+
<message id="message1" name="message"/>
8+
<process id="taskListenerProcessAddAndDelete" name="Task Listener Example" isExecutable="true">
9+
10+
<startEvent id="theStart" />
11+
12+
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="task1" />
13+
14+
<userTask id="task1" name="Schedule meeting" >
15+
<documentation>
16+
Schedule a meeting with management.
17+
</documentation>
18+
<extensionElements>
19+
<camunda:taskListener event="create"
20+
class="org.camunda.bpm.engine.test.bpmn.tasklistener.util.TaskCreateListenerAddAndDelete" />
21+
</extensionElements>
22+
</userTask>
23+
24+
<boundaryEvent id="messageBoundary" attachedToRef="task1">
25+
<outgoing>flow2</outgoing>
26+
<messageEventDefinition messageRef="message1"/>
27+
</boundaryEvent>
28+
<sequenceFlow id="flow4" sourceRef="task1" targetRef="theEnd2" />
29+
30+
<sequenceFlow id="flow2" sourceRef="task1" targetRef="task2" />
31+
32+
<userTask id="task2" name="Write meeting notes" >
33+
<documentation>
34+
Write meeting notes after meeting with management.
35+
</documentation>
36+
<extensionElements>
37+
<camunda:taskListener event="create" expression="${execution.setVariable('greeting2', task.name)}" />
38+
</extensionElements>
39+
</userTask>
40+
41+
<sequenceFlow id="flow3" sourceRef="task2" targetRef="theEnd" />
42+
43+
<endEvent id="theEnd" />
44+
<endEvent id="theEnd2" />
45+
46+
</process>
47+
48+
</definitions>

0 commit comments

Comments
 (0)