/** * 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; }
ActivityImpl activity = execution.getActivity(); Transition defaultSeqFlow = execution.getActivity().getDefaultOutgoingTransition(); if (defaultSeqFlow != null) { forkingTransitions.add(defaultSeqFlow);
/** * @return All executions currently waiting at the gateway. */ protected List<ExecutionImpl> getJoinedExecutions(ExecutionImpl concurrentRoot, Activity activity) { List<ExecutionImpl> joinedExecutions = new ArrayList<ExecutionImpl>(); Collection<ExecutionImpl> concurrentExecutions = concurrentRoot.getExecutions(); for (ExecutionImpl concurrentExecution: concurrentExecutions) { if ( (Execution.STATE_INACTIVE_JOIN.equals(concurrentExecution.getState())) && (concurrentExecution.getActivity()==activity) ) { joinedExecutions.add(concurrentExecution); } } if (LOG.isDebugEnabled()) { LOG.debug("Found " + joinedExecutions.size() + " executions currently waiting at the gateway"); } return joinedExecutions; }
public void execute(ExecutionImpl execution) { List<Activity> startActivities = findStartActivities(execution); if (!startActivities.isEmpty()) { ExecutionImpl parent = execution.createScope(execution.getActivity()); for (Activity startActivity: startActivities) { parent.setState(Execution.STATE_INACTIVE_CONCURRENT_ROOT); ExecutionImpl concurrentExecution = parent.createExecution(); concurrentExecution.setState(Execution.STATE_ACTIVE_CONCURRENT); concurrentExecution.execute(startActivity); } } else { throw new JbpmException("Could not find start activity for the sub-process " + execution.getActivityName()); } }
protected boolean isComplete(ExecutionImpl execution) { Activity activity = execution.getActivity(); ExecutionImpl concurrentRoot = execution.getParent(); List<ExecutionImpl> joinedExecutions = getJoinedExecutions(concurrentRoot, activity); boolean result = joinedExecutions.size() == activity.getIncomingTransitions().size(); if (LOG.isDebugEnabled()) { LOG.debug("All incoming executions have arrived at the gateway: " + result); } return result; }
Activity activity = execution.getActivity();
public void execute(ExecutionImpl execution) { List<Transition> transitions = findOutgoingSequenceFlow(execution, CONDITIONS_CHECKED); int numTransitions = transitions.size(); if (numTransitions > 1) { transitions = transitions.subList(0, 1); if (log.isInfoEnabled()) { log.info("More than one outgoing sequenceFlow conditions evaluated to true for " + execution.getActivity() + ", taking the first one (" + transitions.get(0).getName() + ")"); } } // We are now sure we have only one transition as result Transition resultingTransition = transitions.get(0); if (resultingTransition.getName() != null) { execution.historyDecision(resultingTransition.getName()); } proceed(execution, transitions); }
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) {
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); } }
public void execute(ExecutionImpl execution) { Activity activity = execution.getActivity(); List<? extends Transition> outgoingTransitions = activity.getOutgoingTransitions(); ActivityImpl parentActivity = (ActivityImpl) activity.getParentActivity();
public void signal(ExecutionImpl execution, String signalName, Map<String, ? > parameters) throws Exception { ActivityImpl activity = execution.getActivity(); if (parameters != null) { execution.setVariables(parameters); } execution.fire(signalName, activity); DbSession taskDbSession = EnvironmentImpl.getFromCurrent(DbSession.class); TaskImpl task = taskDbSession.findTaskByExecution(execution); if (task!=null) { task.setSignalling(false); } execution.setVariable("jbpm_outcome", signalName); proceed(execution, findOutgoingSequenceFlow(execution, CONDITIONS_CHECKED)); }
/** * Joins all the incoming executions currently waiting at the gateway. * * @return An execution that can be used to leave the gateway (one outgoing sequence flow) * or to create child executions on (fork behaviour when multiple outgoing sequence flow). */ protected ExecutionImpl join(ExecutionImpl execution) { Activity activity = execution.getActivity(); ExecutionImpl concurrentRoot = execution.getParent(); if (concurrentRoot == null) { return execution; } List<ExecutionImpl> joinedExecutions = getJoinedExecutions(concurrentRoot, activity); endJoinedExecutions(joinedExecutions); ExecutionImpl outgoingExecution = null; if (concurrentRoot.getExecutions().size() == 0) { outgoingExecution = concurrentRoot; outgoingExecution.setState(Execution.STATE_ACTIVE_ROOT); } else { outgoingExecution = concurrentRoot.createExecution(); outgoingExecution.setState(Execution.STATE_ACTIVE_CONCURRENT); } outgoingExecution.setActivity(activity); return outgoingExecution; }
int nrOfIncoming = execution.getActivity().getIncomingTransitions().size();