Esempio n. 1
0
        protected override void OnWorkflowChangesCompleted(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }

            // find out the status of the cag
            ConditionedActivityGroup currentActivity = executionContext.Activity as ConditionedActivityGroup;

            // if CAG is executing... fire the conditions on the net result
            if (currentActivity.ExecutionStatus == ActivityExecutionStatus.Executing)
            {
                // but hold on, a derived cag could be applying model changes before it
                // "really" starts executing the activities. In that case it will evaluate
                // the conditions later, at the appropriate time.
                ConditionedActivityGroupStateInfo state = currentActivity.CAGState;
                if ((state != null) && (!state.Testing))
                {
                    // fire away...  fire away... said the CAG
                    if (this.EvaluateConditions(currentActivity, executionContext))
                    {
                        // CAG until indicates we are done, so no children execute
                        this.Cleanup(currentActivity, executionContext);
                    }
                    else
                    {
                        // start any pending activity required
                        this.TriggerChildren(currentActivity, executionContext);
                    }
                }
            }
        }
Esempio n. 2
0
        protected override void OnActivityChangeRemove(ActivityExecutionContext executionContext, Activity removedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (removedActivity == null)
            {
                throw new ArgumentNullException("removedActivity");
            }

            if (!removedActivity.Enabled)
            {
                return;
            }

            ConditionedActivityGroup cag = executionContext.Activity as ConditionedActivityGroup;

            Debug.Assert(cag != null);

            // find out the status of the cag

            ConditionedActivityGroupStateInfo state = cag.CAGState;

            if ((cag.ExecutionStatus == ActivityExecutionStatus.Executing) && (state != null))
            {
                state.ChildrenStats.Remove(removedActivity.QualifiedName);
            }
        }
Esempio n. 3
0
        protected override void OnActivityChangeAdd(ActivityExecutionContext executionContext, Activity addedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (addedActivity == null)
            {
                throw new ArgumentNullException("addedActivity");
            }

            if (!addedActivity.Enabled)
            {
                return;
            }

            ConditionedActivityGroup currentActivity = executionContext.Activity as ConditionedActivityGroup;

            Debug.Assert(currentActivity != null);

            ConditionedActivityGroupStateInfo state = currentActivity.CAGState;

            if (currentActivity.ExecutionStatus == ActivityExecutionStatus.Executing && state != null)
            {
                Debug.Assert(currentActivity == addedActivity.Parent, "Attempting to add wrong activity to CAG");
                state.ChildrenStats[addedActivity.QualifiedName] = new CAGChildStats();
            }
        }
Esempio n. 4
0
        internal bool Cleanup(ConditionedActivityGroup cag, ActivityExecutionContext context)
        {
            // the completion condition has fired, or we are canceling
            // either way, we want to cleanup
            ConditionedActivityGroupStateInfo state = cag.CAGState;

            state.Completed = true;

            // cancel any children currently running
            bool childrenActive = false;
            Dictionary <string, CAGChildStats> childrenStats = state.ChildrenStats;

            foreach (Activity act in cag.EnabledActivities)
            {
                // reset any Pending Execution for all child activity
                if (childrenStats[act.QualifiedName].State == CAGChildState.Pending)
                {
                    childrenStats[act.QualifiedName].State = CAGChildState.Idle;
                }

                // find the run-time activity
                ActivityExecutionContext childContext = GetChildExecutionContext(context, act, false);
                if (childContext != null)
                {
                    // child must be running somewhere
                    Activity activity = GetRuntimeInitializedActivity(context, act);
                    switch (activity.ExecutionStatus)
                    {
                    case ActivityExecutionStatus.Executing:
                        // schedule cancellation on child
                        childContext.CancelActivity(activity);
                        childrenActive = true;
                        break;

                    case ActivityExecutionStatus.Canceling:
                    case ActivityExecutionStatus.Faulting:
                        childrenActive = true;
                        break;

                    case ActivityExecutionStatus.Closed:
                        CleanupChildAtClosure(context, activity);
                        break;

                    default:
                        // unhook our handler
                        // others will be removed when we get the complete/cancel notification
                        act.UnregisterForStatusChange(Activity.ClosedEvent, this);
                        break;
                    }
                }
            }

            // if the CAG is quiet, we are all done
            if (!childrenActive)
            {
                context.CloseActivity();
            }
            return(!childrenActive);
        }
        internal bool Cleanup(ConditionedActivityGroup cag, ActivityExecutionContext context)
        {
            ConditionedActivityGroupStateInfo cAGState = cag.CAGState;

            cAGState.Completed = true;
            bool flag = false;
            Dictionary <string, CAGChildStats> childrenStats = cAGState.ChildrenStats;

            foreach (Activity activity in cag.EnabledActivities)
            {
                if (childrenStats[activity.QualifiedName].State == CAGChildState.Pending)
                {
                    childrenStats[activity.QualifiedName].State = CAGChildState.Idle;
                }
                ActivityExecutionContext context2 = GetChildExecutionContext(context, activity, false);
                if (context2 != null)
                {
                    Activity runtimeInitializedActivity = this.GetRuntimeInitializedActivity(context, activity);
                    switch (runtimeInitializedActivity.ExecutionStatus)
                    {
                    case ActivityExecutionStatus.Executing:
                    {
                        context2.CancelActivity(runtimeInitializedActivity);
                        flag = true;
                        continue;
                    }

                    case ActivityExecutionStatus.Canceling:
                    case ActivityExecutionStatus.Faulting:
                    {
                        flag = true;
                        continue;
                    }

                    case ActivityExecutionStatus.Closed:
                    {
                        this.CleanupChildAtClosure(context, runtimeInitializedActivity);
                        continue;
                    }
                    }
                    activity.UnregisterForStatusChange(Activity.ClosedEvent, this);
                }
            }
            if (!flag)
            {
                context.CloseActivity();
            }
            return(!flag);
        }
        private bool EvaluateChildConditions(ConditionedActivityGroup cag, Activity child, ActivityExecutionContext context)
        {
            bool flag;
            ConditionedActivityGroupStateInfo cAGState = cag.CAGState;

            try
            {
                cAGState.Testing = true;
                ActivityCondition condition = (ActivityCondition)child.GetValue(WhenConditionProperty);
                flag = (condition != null) ? condition.Evaluate(child, context) : (cAGState.ChildrenStats[child.QualifiedName].ExecutedCount == 0);
            }
            finally
            {
                cAGState.Testing = false;
            }
            return(flag);
        }
        public int GetChildActivityExecutedCount(Activity child)
        {
            if (child == null)
            {
                throw new ArgumentNullException("child");
            }
            ConditionedActivityGroupStateInfo cAGState = this.CAGState;

            if (cAGState == null)
            {
                throw new InvalidOperationException(SR.GetString("Error_CAGNotExecuting", new object[] { base.QualifiedName }));
            }
            if (!cAGState.ChildrenStats.ContainsKey(child.QualifiedName))
            {
                throw new ArgumentException(SR.GetString("Error_CAGChildNotFound", new object[] { child.QualifiedName, base.QualifiedName }), "child");
            }
            return(cAGState.ChildrenStats[child.QualifiedName].ExecutedCount);
        }
 protected override void OnActivityChangeRemove(ActivityExecutionContext executionContext, Activity removedActivity)
 {
     if (executionContext == null)
     {
         throw new ArgumentNullException("executionContext");
     }
     if (removedActivity == null)
     {
         throw new ArgumentNullException("removedActivity");
     }
     if (removedActivity.Enabled)
     {
         ConditionedActivityGroup          activity = executionContext.Activity as ConditionedActivityGroup;
         ConditionedActivityGroupStateInfo cAGState = activity.CAGState;
         if ((activity.ExecutionStatus == ActivityExecutionStatus.Executing) && (cAGState != null))
         {
             cAGState.ChildrenStats.Remove(removedActivity.QualifiedName);
         }
     }
 }
Esempio n. 9
0
        /// <summary>
        /// Evaluate the While condition for a particular child of the CAG
        /// If no While condition, it becomes "execute once"
        /// </summary>
        /// <param name="cag"></param>
        /// <param name="child"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        private bool EvaluateChildConditions(ConditionedActivityGroup cag, Activity child, ActivityExecutionContext context)
        {
#if     LOG
            Log("EvaluateChildConditions on activity " + child.QualifiedName + " inside " + cag.QualifiedName);
#endif
            // determine the result of the when condition (evaluate once if not specified)
            ConditionedActivityGroupStateInfo state = cag.CAGState;
            try
            {
                state.Testing = true;
                ActivityCondition whenCondition = (ActivityCondition)child.GetValue(ConditionedActivityGroup.WhenConditionProperty);
                return((whenCondition != null)
                    ? whenCondition.Evaluate(child, context)
                    : (state.ChildrenStats[child.QualifiedName].ExecutedCount == 0));
            }
            finally
            {
                state.Testing = false;
            }
        }
Esempio n. 10
0
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
#if     LOG
            Log("Execute on " + this.QualifiedName);
#endif

            // go figure out what the CAG needs to do
            this.CAGState = new ConditionedActivityGroupStateInfo(this);

            if (EvaluateConditions(this, executionContext))
            {
                // CAG until indicates we are done, so no children execute
                return(ActivityExecutionStatus.Closed);
            }

            // start any pending activity required
            TriggerChildren(this, executionContext);
            return(this.ExecutionStatus);
        }
Esempio n. 11
0
        public int GetChildActivityExecutedCount(Activity child)
        {
            if (child == null)
            {
                throw new ArgumentNullException("child");
            }

            ConditionedActivityGroupStateInfo conditionedInfo = this.CAGState;

            if (conditionedInfo == null)
            {
                throw new InvalidOperationException(SR.GetString(SR.Error_CAGNotExecuting, this.QualifiedName));
            }

            if (!conditionedInfo.ChildrenStats.ContainsKey(child.QualifiedName))
            {
                throw new ArgumentException(SR.GetString(SR.Error_CAGChildNotFound, child.QualifiedName, this.QualifiedName), "child");
            }
            else
            {
                return(conditionedInfo.ChildrenStats[child.QualifiedName].ExecutedCount);
            }
        }
        protected override void OnWorkflowChangesCompleted(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            ConditionedActivityGroup activity = executionContext.Activity as ConditionedActivityGroup;

            if (activity.ExecutionStatus == ActivityExecutionStatus.Executing)
            {
                ConditionedActivityGroupStateInfo cAGState = activity.CAGState;
                if ((cAGState != null) && !cAGState.Testing)
                {
                    if (this.EvaluateConditions(activity, executionContext))
                    {
                        this.Cleanup(activity, executionContext);
                    }
                    else
                    {
                        this.TriggerChildren(activity, executionContext);
                    }
                }
            }
        }