/** * The start activities of a sub-process are either none start events or * activities without incoming sequence flow. */ protected List<Activity> findStartActivities(ExecutionImpl execution) { List<Activity> startActivities = new ArrayList<Activity>(); for (Activity nestedActivity : execution.getActivity().getActivities()) { if ( (nestedActivity.getIncomingTransitions()==null) || (nestedActivity.getIncomingTransitions().isEmpty())) { startActivities.add(nestedActivity); } } return startActivities; }
/** * Sequence flow are not allowed to cross the sub-process boundary. * Exception to that rule is sequence flow which have as target a none start event (which actually * could graphically be viewed as boundary events). */ protected void validateAllSequenceFlow(ActivityImpl subProcessActivity, Parse parse) { // collect all child activity ids Set<String> childActivityIds = new HashSet<String>(); for (Activity childActivity : subProcessActivity.getActivities()) { childActivityIds.add(childActivity.getName()); } // Verify source/target of all sequenceflow for (Activity childActivity : subProcessActivity.getActivities()) { for (Transition incomingTransition : childActivity.getIncomingTransitions()) { validateSequenceFlow(incomingTransition, childActivityIds, parse); } for (Transition outgoingTransition : subProcessActivity.getOutgoingTransitions()) { validateSequenceFlow(outgoingTransition, childActivityIds, parse); } } }
/** * Only none start activities and activities without incoming sequence flow * are allowed as start activities in a sub-process. */ protected void validateStartActivities(ActivityImpl subProcessActivity, Parse parse) { for (Activity childActivity : subProcessActivity.getActivities()) { if (childActivity.getIncomingTransitions().isEmpty()) { ActivityBehaviour activityBehaviour = ((ActivityImpl) childActivity).getActivityBehaviour(); if ( (activityBehaviour instanceof BpmnEvent) && !(activityBehaviour instanceof NoneStartEventActivity) ) { parse.addProblem("Only none start events are allowed in an embedded sub process. " + "Event " + childActivity.getName() + " has no incoming sequence flow."); } } } }