protected internal virtual void prepareScopeExecution(ActivityExecution scopeExecution, int nrOfInstances) { // set the MI-body scoped variables setLoopVariable(scopeExecution, NUMBER_OF_INSTANCES, nrOfInstances); setLoopVariable(scopeExecution, NUMBER_OF_COMPLETED_INSTANCES, 0); setLoopVariable(scopeExecution, NUMBER_OF_ACTIVE_INSTANCES, nrOfInstances); scopeExecution.Activity = null; scopeExecution.inactivate(); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public void execute(org.camunda.bpm.engine.impl.pvm.delegate.ActivityExecution execution) throws Exception public virtual void execute(ActivityExecution execution) { execution.inactivate(); lockConcurrentRoot(execution); PvmActivity activity = execution.Activity; if (activatesGateway(execution, activity)) { LOG.activityActivation(activity.Id); IList <ActivityExecution> joinedExecutions = execution.findInactiveConcurrentExecutions(activity); string defaultSequenceFlow = (string)execution.Activity.getProperty("default"); IList <PvmTransition> transitionsToTake = new List <PvmTransition>(); // find matching non-default sequence flows foreach (PvmTransition outgoingTransition in execution.Activity.OutgoingTransitions) { if (string.ReferenceEquals(defaultSequenceFlow, null) || !outgoingTransition.Id.Equals(defaultSequenceFlow)) { Condition condition = (Condition)outgoingTransition.getProperty(BpmnParse.PROPERTYNAME_CONDITION); if (condition == null || condition.evaluate(execution)) { transitionsToTake.Add(outgoingTransition); } } } // if none found, add default flow if (transitionsToTake.Count == 0) { if (!string.ReferenceEquals(defaultSequenceFlow, null)) { PvmTransition defaultTransition = execution.Activity.findOutgoingTransition(defaultSequenceFlow); if (defaultTransition == null) { throw LOG.missingDefaultFlowException(execution.Activity.Id, defaultSequenceFlow); } transitionsToTake.Add(defaultTransition); } else { // No sequence flow could be found, not even a default one throw LOG.stuckExecutionException(execution.Activity.Id); } } // take the flows found execution.leaveActivityViaTransitions(transitionsToTake, joinedExecutions); } else { LOG.noActivityActivation(activity.Id); } }
public override void concurrentChildExecutionEnded(ActivityExecution scopeExecution, ActivityExecution endedExecution) { int nrOfCompletedInstances = getLoopVariable(scopeExecution, NUMBER_OF_COMPLETED_INSTANCES) + 1; setLoopVariable(scopeExecution, NUMBER_OF_COMPLETED_INSTANCES, nrOfCompletedInstances); int nrOfActiveInstances = getLoopVariable(scopeExecution, NUMBER_OF_ACTIVE_INSTANCES) - 1; setLoopVariable(scopeExecution, NUMBER_OF_ACTIVE_INSTANCES, nrOfActiveInstances); // inactivate the concurrent execution endedExecution.inactivate(); endedExecution.ActivityInstanceId = null; // join scopeExecution.forceUpdate(); // TODO: should the completion condition be evaluated on the scopeExecution or on the endedExecution? if (completionConditionSatisfied(endedExecution) || allExecutionsEnded(scopeExecution, endedExecution)) { List <ActivityExecution> childExecutions = new List <ActivityExecution>(((PvmExecutionImpl)scopeExecution).NonEventScopeExecutions); foreach (ActivityExecution childExecution in childExecutions) { // delete all not-ended instances; these are either active (for non-scope tasks) or inactive but have no activity id (for subprocesses, etc.) if (childExecution.Active || childExecution.Activity == null) { ((PvmExecutionImpl)childExecution).deleteCascade("Multi instance completion condition satisfied."); } else { childExecution.remove(); } } scopeExecution.Activity = (PvmActivity)endedExecution.Activity.FlowScope; scopeExecution.Active = true; leave(scopeExecution); } else { ((ExecutionEntity)scopeExecution).dispatchDelayedEventsAndPerformOperation((Callback <PvmExecutionImpl, Void>)null); } }
public virtual void execute(ActivityExecution execution) { PvmActivity activity = execution.Activity; IList <PvmTransition> outgoingTransitions = execution.Activity.OutgoingTransitions; execution.inactivate(); IList <ActivityExecution> joinedExecutions = execution.findInactiveConcurrentExecutions(activity); int nbrOfExecutionsToJoin = execution.Activity.IncomingTransitions.Count; int nbrOfExecutionsJoined = joinedExecutions.Count; if (nbrOfExecutionsJoined == nbrOfExecutionsToJoin) { LOG.debug("parallel gateway '" + activity.Id + "' activates: " + nbrOfExecutionsJoined + " of " + nbrOfExecutionsToJoin + " joined"); execution.leaveActivityViaTransitions(outgoingTransitions, joinedExecutions); } else { LOG.debug("parallel gateway '" + activity.Id + "' does not activate: " + nbrOfExecutionsJoined + " of " + nbrOfExecutionsToJoin + " joined"); } }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public void execute(org.camunda.bpm.engine.impl.pvm.delegate.ActivityExecution execution) throws Exception public virtual void execute(ActivityExecution execution) { // Join PvmActivity activity = execution.Activity; IList <PvmTransition> outgoingTransitions = execution.Activity.OutgoingTransitions; execution.inactivate(); lockConcurrentRoot(execution); IList <ActivityExecution> joinedExecutions = execution.findInactiveConcurrentExecutions(activity); int nbrOfExecutionsToJoin = execution.Activity.IncomingTransitions.Count; int nbrOfExecutionsJoined = joinedExecutions.Count; if (nbrOfExecutionsJoined == nbrOfExecutionsToJoin) { // Fork LOG.activityActivation(activity.Id, nbrOfExecutionsJoined, nbrOfExecutionsToJoin); execution.leaveActivityViaTransitions(outgoingTransitions, joinedExecutions); } else { LOG.noActivityActivation(activity.Id, nbrOfExecutionsJoined, nbrOfExecutionsToJoin); } }