From 1a6542833576b7d1f07d0706a822bbbe9c84010d Mon Sep 17 00:00:00 2001 From: Frederik Heremans Date: Fri, 27 Jul 2012 07:14:09 +0000 Subject: [PATCH] Merged DEV/V4.1-BUG-FIX into HEAD 39787: ALF-15259: Prevent endless loop when sequence-flow goes back to another activity, not encountering any user-tasks (workflow details page) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@39843 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../workflow/activiti/ActivitiWorkflowEngine.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java index bc7242e8f0..52fd37f508 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowEngine.java @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -682,9 +683,10 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine { // Use a linked hashmap to get the task defs in the right order Map userTasks = new LinkedHashMap(); - + Set processedActivities = new HashSet(); + // Start finding activities recursively - findUserTasks(startEvent, userTasks); + findUserTasks(startEvent, userTasks, processedActivities); return userTasks.values(); } @@ -701,11 +703,12 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine return false; } - private void findUserTasks(PvmActivity currentActivity, Map userTasks) + private void findUserTasks(PvmActivity currentActivity, Map userTasks, Set processedActivities) { - // Only process activity if not already present to prevent endless loops - if(!userTasks.containsKey(currentActivity.getId())) + // Only process activity if not already processed, to prevent endless loops + if(!processedActivities.contains(currentActivity.getId())) { + processedActivities.add(currentActivity.getId()); if(isUserTask(currentActivity)) { userTasks.put(currentActivity.getId(), currentActivity); @@ -718,7 +721,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine { if(transition.getDestination() != null) { - findUserTasks(transition.getDestination(), userTasks); + findUserTasks(transition.getDestination(), userTasks, processedActivities); } } }