Beispiel #1
0
        /// <summary>
        /// The default behaviour of BPMN, taking every outgoing sequence flow
        /// (where the condition evaluates to true), is not valid for an exclusive
        /// gateway.
        ///
        /// Hence, this behaviour is overriden and replaced by the correct behavior:
        /// selecting the first sequence flow which condition evaluates to true
        /// (or which hasn't got a condition) and leaving the activity through that
        /// sequence flow.
        ///
        /// If no sequence flow is selected (ie all conditions evaluate to false),
        /// then the default sequence flow is taken (if defined).
        /// </summary>
        public override void doLeave(ActivityExecution execution)
        {
            LOG.leavingActivity(execution.Activity.Id);

            PvmTransition outgoingSeqFlow     = null;
            string        defaultSequenceFlow = (string)execution.Activity.getProperty("default");
            IEnumerator <PvmTransition> transitionIterator = execution.Activity.OutgoingTransitions.GetEnumerator();

            while (outgoingSeqFlow == null && transitionIterator.MoveNext())
            {
                PvmTransition seqFlow = transitionIterator.Current;

                Condition condition = (Condition)seqFlow.getProperty(BpmnParse.PROPERTYNAME_CONDITION);
                if ((condition == null && (string.ReferenceEquals(defaultSequenceFlow, null) || !defaultSequenceFlow.Equals(seqFlow.Id))) || (condition != null && condition.evaluate(execution)))
                {
                    LOG.outgoingSequenceFlowSelected(seqFlow.Id);
                    outgoingSeqFlow = seqFlow;
                }
            }

            if (outgoingSeqFlow != null)
            {
                execution.leaveActivityViaTransition(outgoingSeqFlow);
            }
            else
            {
                if (!string.ReferenceEquals(defaultSequenceFlow, null))
                {
                    PvmTransition defaultTransition = execution.Activity.findOutgoingTransition(defaultSequenceFlow);
                    if (defaultTransition != null)
                    {
                        execution.leaveActivityViaTransition(defaultTransition);
                    }
                    else
                    {
                        throw LOG.missingDefaultFlowException(execution.Activity.Id, defaultSequenceFlow);
                    }
                }
                else
                {
                    //No sequence flow could be found, not even a default one
                    throw LOG.stuckExecutionException(execution.Activity.Id);
                }
            }
        }
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)
        {
            IList <PvmTransition> outgoingTransitions = execution.Activity.OutgoingTransitions;

            if (outgoingTransitions.Count == 0)
            {
                execution.end(true);
            }
            else
            {
                execution.leaveActivityViaTransition(outgoingTransitions[0]);
            }
        }
Beispiel #3
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)
        {
            string var = (string)execution.getVariable("var");

            PvmTransition transition = null;

            try
            {
                executeLogic(var);
                transition = execution.Activity.findOutgoingTransition("no-exception");
            }
            catch (Exception)
            {
                transition = execution.Activity.findOutgoingTransition("exception");
            }
            execution.leaveActivityViaTransition(transition);
        }
Beispiel #4
0
        /// <summary>
        /// Actual implementation of leaving an activity.
        /// </summary>
        /// <param name="execution">
        ///          The current execution context </param>
        /// <param name="checkConditions">
        ///          Whether or not to check conditions before determining whether or
        ///          not to take a transition. </param>
        protected internal virtual void performOutgoingBehavior(ActivityExecution execution, bool checkConditions, IList <ActivityExecution> reusableExecutions)
        {
            LOG.leavingActivity(execution.Activity.Id);

            string defaultSequenceFlow = (string)execution.Activity.getProperty("default");
            IList <PvmTransition> transitionsToTake = new List <PvmTransition>();

            IList <PvmTransition> outgoingTransitions = execution.Activity.OutgoingTransitions;

            foreach (PvmTransition outgoingTransition in outgoingTransitions)
            {
                if (string.ReferenceEquals(defaultSequenceFlow, null) || !outgoingTransition.Id.Equals(defaultSequenceFlow))
                {
                    Condition condition = (Condition)outgoingTransition.getProperty(BpmnParse.PROPERTYNAME_CONDITION);
                    if (condition == null || !checkConditions || condition.evaluate(execution))
                    {
                        transitionsToTake.Add(outgoingTransition);
                    }
                }
            }

            if (transitionsToTake.Count == 1)
            {
                execution.leaveActivityViaTransition(transitionsToTake[0]);
            }
            else if (transitionsToTake.Count >= 1)
            {
                if (reusableExecutions == null || reusableExecutions.Count == 0)
                {
                    execution.leaveActivityViaTransitions(transitionsToTake, Arrays.asList(execution));
                }
                else
                {
                    execution.leaveActivityViaTransitions(transitionsToTake, reusableExecutions);
                }
            }
            else
            {
                if (!string.ReferenceEquals(defaultSequenceFlow, null))
                {
                    PvmTransition defaultTransition = execution.Activity.findOutgoingTransition(defaultSequenceFlow);
                    if (defaultTransition != null)
                    {
                        execution.leaveActivityViaTransition(defaultTransition);
                    }
                    else
                    {
                        throw LOG.missingDefaultFlowException(execution.Activity.Id, defaultSequenceFlow);
                    }
                }
                else if (outgoingTransitions.Count > 0)
                {
                    throw LOG.missingConditionalFlowException(execution.Activity.Id);
                }
                else
                {
                    if (((ActivityImpl)execution.Activity).CompensationHandler && isAncestorCompensationThrowing(execution))
                    {
                        execution.endCompensation();
                    }
                    else
                    {
                        LOG.missingOutgoingSequenceFlow(execution.Activity.Id);
                        execution.end(true);
                    }
                }
            }
        }