Beispiel #1
0
 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();
 }
Beispiel #2
0
//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);
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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");
            }
        }
Beispiel #5
0
//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);
            }
        }