/** * Check if the execution can continue. * @return true if the execution can continue (number of transitions arrived == number of transition required) */ private boolean isOk() { int nbArrived = 0; for (WaitingTransition wt : waitingTransitions.values()) { if (wt.isArrived()) { nbArrived++; } } if (LOG.isLoggable(Level.FINE)) { LOG.fine("Executing Join " + nodeName + ", number of required incoming calls = " + incomingTransitionRequired + ", still required = " + (this.incomingTransitionRequired - nbArrived)); } if (LOG.isLoggable(Level.FINE)) { LOG.fine("Executing Join " + nodeName + ": " + waitingTransitions); } return this.incomingTransitionRequired == nbArrived; }
/** * reinitialize the join runtime (when a new iteration is started) * @param iterationUUID new iterationID * @param transitionNames source node name of waiting transitions to reinitialize * @return true if the joinRuntime condition is already met (join Xor with one transition arrived) */ public boolean update(String iterationUUID, Set<String> transitionNames) { if (incomingTransitionRequired == 1) { // Xor entry point: reinit all incoming transitions // use current iterationId to block executions coming from outside // TODO: when Xor join cancels unwanted branches, the setIterationUUID has to be removed. for (WaitingTransition wt : waitingTransitions.values()) { wt.setArrived(false); wt.setIterationUUID(iterationUUID); } } for (String transition : transitionNames) { WaitingTransition wt = waitingTransitions.get(transition); if (wt == null) { throw new BonitaRuntimeException( "This transition is not in the list of transitions handled by this Join. " + "There is a problem in the cycle definition."); } wt.setArrived(false); wt.setIterationUUID(iterationUUID); } return isOk(); }
/** * Signal that a new execution arrived in this join * @param fromName incoming transition source node name * @param iterationId processDefinitionUUID of the current iteration * @return true if the execution can continue. */ public synchronized boolean transitionArrived(String fromName, String iterationId) { WaitingTransition fromWt = waitingTransitions.get(fromName); if (fromWt != null && !fromWt.isArrived()) { if (fromWt.getIterationUUID() == null || fromWt.getIterationUUID().equals(iterationId)) { fromWt.setArrived(true); } else { if (LOG.isLoggable(Level.FINE)) { LOG.fine("transition " + fromName + "->" + nodeName + " arrived with bad iterationId (" + iterationId + "/" + fromWt.getIterationUUID() + ")."); } return false; } } else { throw new BonitaRuntimeException("transition " + fromName + "->" + nodeName + " is already arrived in this JoinRuntime."); } return isOk(); }
private static JoinRunTime getJoinRunTime(XpdlInstance instance, NodeImpl node) { JoinType joinType = ((AbstractActivity) node.getBehaviour()).getJoinType(); JoinRunTime joinRunTime = instance.getJoinRunTime(node.getName()); if (joinRunTime == null) { int joinIncomingTransitionNbRequired = 1; if (joinType.equals(JoinType.AND)) { joinIncomingTransitionNbRequired = node.getIncomingTransitions().size(); } Map<String, JoinRunTime.WaitingTransition> ins = new HashMap<String, JoinRunTime.WaitingTransition>(); for (Transition t : node.getIncomingTransitions()) { String name = t.getSource().getName(); ins.put(name, new JoinRunTime.WaitingTransition(name, null)); } joinRunTime = new JoinRunTime(node.getName(), ins, joinIncomingTransitionNbRequired); instance.pushJoinRuntime(joinRunTime); } return joinRunTime; }