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
This commit is contained in:
Frederik Heremans
2012-07-27 07:14:09 +00:00
parent 59236895ae
commit 1a65428335

View File

@@ -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<String, PvmActivity> userTasks = new LinkedHashMap<String, PvmActivity>();
Set<String> processedActivities = new HashSet<String>();
// 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<String, PvmActivity> userTasks)
private void findUserTasks(PvmActivity currentActivity, Map<String, PvmActivity> userTasks, Set<String> 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);
}
}
}