/** * 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); } } }
protected IntermediateCatchTimerEvent createIntermediateTimerCatchEvent(String catchEventId, Element eventDefinitionElement, BpmnParser parser, Parse parse) { IntermediateCatchTimerEvent intermediateCatchTimerEvent = new IntermediateCatchTimerEvent(); TimerDefinitionImpl timerDefinition = parser.parseTimerEventDefinition(eventDefinitionElement, parse, catchEventId); // Attach the timerDefinition to the current activity. // That way, the PVM will automatically pcik it up when the execution arrives in the activity. ActivityImpl activity = parse.contextStackFind(ActivityImpl.class); activity.addTimerDefinition(timerDefinition); // The timer will fire an event on which this class will listen. String eventName = "INTERMEDIATE_TIMER_" + catchEventId; timerDefinition.setEventName(eventName); EventImpl timerEvent = activity.createEvent(eventName); timerEvent.createEventListenerReference(intermediateCatchTimerEvent); return intermediateCatchTimerEvent; }
public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters) { ActivityImpl activity = execution.getActivity(); if (parameters!=null) { execution.setVariables(parameters); } List<Transition> outgoingTransitions = new ArrayList<Transition>(); if (signalName != null) { Transition transition = activity.findOutgoingTransition(signalName); if (transition == null) { throw new JbpmException("Cannot find an outgoing transition for " + activity.getName() + " named " + signalName); } outgoingTransitions.add(transition); execution.fire(signalName, activity); } else { outgoingTransitions.addAll(findOutgoingSequenceFlow(execution, CONDITIONS_CHECKED)); } proceed(execution, outgoingTransitions); } }
/** * 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."); } } } }
List<TransitionImpl> outgoingTransitions = (List) activity.getOutgoingTransitions(); && (activity.getDefaultOutgoingTransition() != transition) ) { forkingTransitions.add(transition); LOG.debug(forkingTransitions.size() + " out of " + outgoingTransitions.size() + " selected for " + activity.getName()); Transition defaultSeqFlow = execution.getActivity().getDefaultOutgoingTransition(); if (defaultSeqFlow != null) { forkingTransitions.add(defaultSeqFlow);
if (execution.isActive() && "state".equals(execution.getActivity().getType())) { tok.setCanBeSignaled(true); if (execution.getActivity() !=null && "state".equals(execution.getActivity().getType())) { List<? extends Transition> outTransitions = openTopLevelExecution.getActivity().getOutgoingTransitions(); if (outTransitions != null) { for (Transition t : outTransitions) {
TransitionImpl transition = null; if (sourceActivity != null) { transition = sourceActivity.createOutgoingTransition(); transition.setName(transitionId); transition.setDescription(transitionName); destinationActivity.addIncomingTransition(transition); } else { parse.addProblem("TargetRef '" + targetRef + "' cannot be found"); ActivityBehaviour behaviour = sourceActivity.getActivityBehaviour(); if (behaviour instanceof BpmnActivity) { BpmnActivity bpmnActivity = (BpmnActivity) behaviour; if (bpmnActivity.isDefaultEnabled() && defaultSeqFlow != null) { if (transitionId.equals(defaultSeqFlow)) { processDefinition.findActivity(sourceRef).setDefaultOutgoingTransition(transition); processDefinition.findActivity(sourceRef).setDefaultOutgoingTransition(null); processDefinition.findActivity(sourceRef).setDefaultOutgoingTransition(null);
ActivityImpl parentActivity = (ActivityImpl) activity.getParentActivity(); if (parentActivity != null && "subProcess".equals(parentActivity.getType())) {
/** * 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; }