public static List<TransitionTarget> getRelocateTargets( long activityInstanceOid, TransitionOptions options, ScanDirection direction) { IActivityInstance ai = ActivityInstanceBean.findByOID(activityInstanceOid); IActivity activity = ai.getActivity(); if (!activity.getBooleanAttribute(PredefinedConstants.ACTIVITY_IS_RELOCATE_SOURCE_ATT)) { // activity is not a relocation source return Collections.emptyList(); } Stack<TransitionStep> steps = new Stack(); List<TransitionTarget> targets = CollectionUtils.newList(); Set<TransitionTarget> visited = CollectionUtils.newSet(); switch (direction) { case FORWARD: addActivities( visited, targets, ai, options == null ? TransitionOptions.DEFAULT : options, true, steps); break; case BACKWARD: addActivities( visited, targets, ai, options == null ? TransitionOptions.DEFAULT : options, false, steps); break; default: addActivities( visited, targets, ai, options == null ? TransitionOptions.DEFAULT : options, true, steps); addActivities( visited, targets, ai, options == null ? TransitionOptions.DEFAULT : options, false, steps); } return targets; }
private static void addActivities( Set<TransitionTarget> visited, List<TransitionTarget> targets, IActivityInstance ai, TransitionOptions options, boolean forward, Stack<TransitionStep> steps) { if (ai != null) { steps.push(TransitionTargetFactory.createTransitionStep(ai)); // add activities from current process definition addActivities(visited, targets, ai.getActivity(), options, forward, steps); // step up into the calling process - starting activity cannot be a relocation target if (options.isTransitionOutOfSubprocessesAllowed()) { addActivities( visited, targets, ai.getProcessInstance().getStartingActivityInstance(), options, forward, steps); } steps.pop(); } }