Exemplo n.º 1
0
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }

            Activity bodyActivity = this.BodyActivity;

            if (bodyActivity == null)
            {
                return(ActivityExecutionStatus.Closed);
            }

            // run EventHandlers
            EventHandlersActivity eventHandlers = this.EventHandlersActivity;

            if (eventHandlers != null)
            {
                eventHandlers.RegisterForStatusChange(Activity.ClosedEvent, this);
                executionContext.ExecuteActivity(eventHandlers);
            }

            // run body
            bodyActivity.RegisterForStatusChange(Activity.ClosedEvent, this);
            executionContext.ExecuteActivity(bodyActivity);


            // return the status
            return(this.ExecutionStatus);
        }
Exemplo n.º 2
0
        protected override void OnWorkflowChangesCompleted(ActivityExecutionContext executionContext)
        {
            base.OnWorkflowChangesCompleted(executionContext);

            switch (this.ExecutionStatus)
            {
            case ActivityExecutionStatus.Executing:
                if (bodyActivityRemovedInDynamicUpdate)
                {
                    if (EventHandlersActivity == null || EventHandlersActivity.ExecutionStatus == ActivityExecutionStatus.Closed)
                    {
                        executionContext.CloseActivity();
                    }
                    else if (EventHandlersActivity.ExecutionStatus == ActivityExecutionStatus.Executing)
                    {
                        EventHandlersActivity.UnsubscribeAndClose();
                    }
                }
                if (eventHandlersRemovedInDynamicUpdate)
                {
                    if (BodyActivity == null || BodyActivity.ExecutionStatus == ActivityExecutionStatus.Closed)
                    {
                        executionContext.CloseActivity();
                    }
                }
                break;

            default:
                break;
            }
            eventHandlersRemovedInDynamicUpdate = false;
            bodyActivityRemovedInDynamicUpdate  = false;
        }
Exemplo n.º 3
0
            void IActivityEventListener <QueueEventArgs> .OnEvent(object sender, QueueEventArgs e)
            {
                if (sender == null)
                {
                    throw new ArgumentNullException("sender");
                }
                if (e == null)
                {
                    throw new ArgumentNullException("e");
                }
                ActivityExecutionContext context = sender as ActivityExecutionContext;

                if (context == null)
                {
                    throw new ArgumentException("sender");
                }
                EventHandlersActivity activityStatusChangeListener = context.Activity as EventHandlersActivity;

                if ((activityStatusChangeListener.ExecutionStatus == ActivityExecutionStatus.Executing) && activityStatusChangeListener.EnabledActivities.Contains(this.eventDrivenActivity))
                {
                    if (this.IsBlocked)
                    {
                        this.IsBlocked = false;
                        ActivityExecutionContext context2 = context.ExecutionContextManager.CreateExecutionContext(this.eventDrivenActivity);
                        context2.Activity.RegisterForStatusChange(Activity.ClosedEvent, activityStatusChangeListener);
                        context2.ExecuteActivity(context2.Activity);
                    }
                    else
                    {
                        this.PendingExecutionCount++;
                    }
                }
            }
        public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
        {
            ValidationErrorCollection errors   = base.Validate(manager, obj);
            EventHandlersActivity     activity = obj as EventHandlersActivity;

            if (activity == null)
            {
                throw new ArgumentException(SR.GetString("Error_UnexpectedArgumentType", new object[] { typeof(EventHandlersActivity).FullName }), "obj");
            }
            if (activity.Parent == null)
            {
                errors.Add(new ValidationError(SR.GetString("Error_MustHaveParent"), 0x522));
                return(errors);
            }
            if (!(activity.Parent is EventHandlingScopeActivity))
            {
                errors.Add(new ValidationError(SR.GetString("Error_EventHandlersDeclParentNotScope", new object[] { activity.Parent.QualifiedName }), 0x522));
            }
            bool flag = false;

            foreach (Activity activity2 in activity.EnabledActivities)
            {
                if (!(activity2 is EventDrivenActivity))
                {
                    flag = true;
                }
            }
            if (flag)
            {
                errors.Add(new ValidationError(SR.GetString("Error_ListenNotAllEventDriven"), 0x514));
            }
            return(errors);
        }
Exemplo n.º 5
0
        void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
            {
                throw new ArgumentException();
            }

            e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this);
            if (e.Activity is EventHandlersActivity)
            {
                if (this.BodyActivity.ExecutionStatus == ActivityExecutionStatus.Closed)
                {
                    context.CloseActivity();
                }
                //else Eventhandlers faulted, let exception propagate up.
            }
            else
            {
                EventHandlersActivity eventHandlers = this.EventHandlersActivity;
                if (eventHandlers == null || eventHandlers.ExecutionStatus == ActivityExecutionStatus.Closed)
                {
                    context.CloseActivity();
                }
                else
                {
                    eventHandlers.UnsubscribeAndClose();
                }
            }
        }
Exemplo n.º 6
0
        protected override void OnActivityChangeRemove(ActivityExecutionContext executionContext, Activity removedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (removedActivity == null)
            {
                throw new ArgumentNullException("removedActivity");
            }
            EventDrivenActivity   activity  = removedActivity as EventDrivenActivity;
            EventHandlersActivity activity2 = (EventHandlersActivity)executionContext.Activity;

            if (((activity2.ExecutionStatus == ActivityExecutionStatus.Executing) && (activity2.ActivityState != null)) && !activity2.IsScopeCompleted)
            {
                for (int i = 0; i < activity2.ActivityState.Count; i++)
                {
                    EventHandlerEventActivitySubscriber parentEventHandler = activity2.ActivityState[i];
                    if (parentEventHandler.eventDrivenActivity.QualifiedName.Equals(removedActivity.QualifiedName))
                    {
                        activity.EventActivity.Unsubscribe(executionContext, parentEventHandler);
                        activity2.ActivityState.RemoveAt(i);
                        return;
                    }
                }
            }
        }
Exemplo n.º 7
0
        protected override void OnActivityChangeRemove(ActivityExecutionContext executionContext, Activity removedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (removedActivity == null)
            {
                throw new ArgumentNullException("removedActivity");
            }

            EventDrivenActivity eda = removedActivity as EventDrivenActivity;

            // find out the status of the scope
            EventHandlersActivity activity = (EventHandlersActivity)executionContext.Activity as EventHandlersActivity;

            if (activity.ExecutionStatus == ActivityExecutionStatus.Executing && activity.ActivityState != null && !activity.IsScopeCompleted)
            {
                for (int i = 0; i < activity.ActivityState.Count; ++i)
                {
                    EventHandlerEventActivitySubscriber eventSubscriber = activity.ActivityState[i];
                    if (eventSubscriber.eventDrivenActivity.QualifiedName.Equals(removedActivity.QualifiedName))
                    {
                        eda.EventActivity.Unsubscribe(executionContext, eventSubscriber);
                        activity.ActivityState.RemoveAt(i);
                        return;
                    }
                }
            }
        }
Exemplo n.º 8
0
        private bool AllHandlersAreQuiet(EventHandlersActivity handlers, ActivityExecutionContext context)
        {
            ActivityExecutionContextManager executionContextManager = context.ExecutionContextManager;

            for (int i = 0; i < handlers.EnabledActivities.Count; i++)
            {
                EventDrivenActivity activity = handlers.EnabledActivities[i] as EventDrivenActivity;
                if ((executionContextManager.GetExecutionContext(activity) != null) || ((handlers.ActivityState != null) && (handlers.ActivityState[i].PendingExecutionCount > 0)))
                {
                    return(false);
                }
            }
            return(true);
        }
Exemplo n.º 9
0
        private bool AllHandlersAreQuiet(EventHandlersActivity handlers, ActivityExecutionContext context)
        {
            ActivityExecutionContextManager contextManager = context.ExecutionContextManager;

            for (int i = 0; i < handlers.EnabledActivities.Count; ++i)
            {
                EventDrivenActivity eventDriven = handlers.EnabledActivities[i] as EventDrivenActivity;
                if (contextManager.GetExecutionContext(eventDriven) != null || (handlers.ActivityState != null && handlers.ActivityState[i].PendingExecutionCount > 0))
                {
                    return(false);
                }
            }
            return(true);
        }
Exemplo n.º 10
0
        private void OnUnsubscribeAndClose(object sender, EventArgs args)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            ActivityExecutionContext context = (ActivityExecutionContext)sender;

            if (context == null)
            {
                throw new ArgumentException("sender");
            }

            EventHandlersActivity handlers = context.Activity as EventHandlersActivity;

            if (context.Activity.ExecutionStatus != ActivityExecutionStatus.Executing)
            {
                return;
            }

            Debug.Assert(!handlers.IsScopeCompleted, "Only notified of scope body completion once");
            handlers.IsScopeCompleted = true;

            ActivityExecutionContextManager contextManager = context.ExecutionContextManager;
            bool readyToClose = true;

            for (int i = 0; i < handlers.EnabledActivities.Count; ++i)
            {
                EventDrivenActivity evtDriven = handlers.EnabledActivities[i] as EventDrivenActivity;
                EventHandlerEventActivitySubscriber eventSubscriber = handlers.ActivityState[i];
                evtDriven.EventActivity.Unsubscribe(context, eventSubscriber);

                if (contextManager.GetExecutionContext(evtDriven) != null || handlers.ActivityState[i].PendingExecutionCount != 0)
                {
                    readyToClose = false;
                }
            }

            if (readyToClose)
            {
                handlers.ActivityState = null;
                context.CloseActivity();
            }
        }
Exemplo n.º 11
0
        protected override void OnActivityChangeAdd(ActivityExecutionContext executionContext, Activity addedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (addedActivity == null)
            {
                throw new ArgumentNullException("addedActivity");
            }
            EventDrivenActivity   eventDriven = addedActivity as EventDrivenActivity;
            EventHandlersActivity activity    = (EventHandlersActivity)executionContext.Activity;
            EventHandlerEventActivitySubscriber parentEventHandler = new EventHandlerEventActivitySubscriber(eventDriven);

            if (((activity.ExecutionStatus == ActivityExecutionStatus.Executing) && (activity.ActivityState != null)) && !activity.IsScopeCompleted)
            {
                eventDriven.EventActivity.Subscribe(executionContext, parentEventHandler);
                activity.ActivityState.Insert(activity.EnabledActivities.IndexOf(addedActivity), parentEventHandler);
            }
        }
Exemplo n.º 12
0
        public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
        {
            ValidationErrorCollection validationErrors = base.Validate(manager, obj);

            EventHandlersActivity eventHandlers = obj as EventHandlersActivity;

            if (eventHandlers == null)
            {
                throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(EventHandlersActivity).FullName), "obj");
            }

            if (eventHandlers.Parent == null)
            {
                validationErrors.Add(new ValidationError(SR.GetString(SR.Error_MustHaveParent), ErrorNumbers.Error_EventHandlersDeclParentNotScope));
                return(validationErrors);
            }

            // Parent must support event handlers
            if (!(eventHandlers.Parent is EventHandlingScopeActivity))
            {
                validationErrors.Add(new ValidationError(SR.GetString(SR.Error_EventHandlersDeclParentNotScope, eventHandlers.Parent.QualifiedName), ErrorNumbers.Error_EventHandlersDeclParentNotScope));
            }

            bool bNotAllEventHandler = false;

            foreach (Activity activity in eventHandlers.EnabledActivities)
            {
                if (!(activity is EventDrivenActivity))
                {
                    bNotAllEventHandler = true;
                }
            }

            // validate that all child activities are event driven activities.
            if (bNotAllEventHandler)
            {
                validationErrors.Add(new ValidationError(SR.GetString(SR.Error_ListenNotAllEventDriven), ErrorNumbers.Error_ListenNotAllEventDriven));
            }

            return(validationErrors);
        }
Exemplo n.º 13
0
            void IActivityEventListener <QueueEventArgs> .OnEvent(object sender, QueueEventArgs e)
            {
                if (sender == null)
                {
                    throw new ArgumentNullException("sender");
                }
                if (e == null)
                {
                    throw new ArgumentNullException("e");
                }
                ActivityExecutionContext context = sender as ActivityExecutionContext;

                if (context == null)
                {
                    throw new ArgumentException("sender");
                }

                EventHandlersActivity handlers = context.Activity as EventHandlersActivity;

                if (handlers.ExecutionStatus != ActivityExecutionStatus.Executing)
                {
                    return;
                }

                if (!handlers.EnabledActivities.Contains(eventDrivenActivity))
                {
                    return; //Activity is dynamically removed.
                }
                if (IsBlocked)
                {
                    IsBlocked = false;
                    ActivityExecutionContextManager contextManager = context.ExecutionContextManager;
                    ActivityExecutionContext        childContext   = contextManager.CreateExecutionContext(eventDrivenActivity);
                    childContext.Activity.RegisterForStatusChange(Activity.ClosedEvent, handlers);
                    childContext.ExecuteActivity(childContext.Activity);
                }
                else
                {
                    PendingExecutionCount++;
                }
            }
Exemplo n.º 14
0
        protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }

            Activity bodyActivity = this.BodyActivity;
            EventHandlersActivity eventHandlers = this.EventHandlersActivity;

            if (bodyActivity == null && eventHandlers == null)
            {
                return(ActivityExecutionStatus.Closed);
            }

            bool cancelScheduled = false;

            // check the status of body
            if (bodyActivity != null && bodyActivity.ExecutionStatus == ActivityExecutionStatus.Executing)
            {
                executionContext.CancelActivity(bodyActivity);
                cancelScheduled = true;
            }
            //Check the status of EventHandlers
            if (eventHandlers != null && eventHandlers.ExecutionStatus == ActivityExecutionStatus.Executing)
            {
                executionContext.CancelActivity(eventHandlers);
                cancelScheduled = true;
            }

            if (cancelScheduled ||
                (bodyActivity != null && (bodyActivity.ExecutionStatus == ActivityExecutionStatus.Faulting ||
                                          bodyActivity.ExecutionStatus == ActivityExecutionStatus.Canceling)) ||
                (eventHandlers != null && (eventHandlers.ExecutionStatus == ActivityExecutionStatus.Faulting ||
                                           eventHandlers.ExecutionStatus == ActivityExecutionStatus.Canceling))
                )
            {
                return(this.ExecutionStatus);
            }
            return(ActivityExecutionStatus.Closed);
        }
Exemplo n.º 15
0
        private void OnUnsubscribeAndClose(object sender, EventArgs args)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            ActivityExecutionContext parentContext = (ActivityExecutionContext)sender;

            if (parentContext == null)
            {
                throw new ArgumentException("sender");
            }
            EventHandlersActivity activity = parentContext.Activity as EventHandlersActivity;

            if (parentContext.Activity.ExecutionStatus == ActivityExecutionStatus.Executing)
            {
                activity.IsScopeCompleted = true;
                ActivityExecutionContextManager executionContextManager = parentContext.ExecutionContextManager;
                bool flag = true;
                for (int i = 0; i < activity.EnabledActivities.Count; i++)
                {
                    EventDrivenActivity activity2 = activity.EnabledActivities[i] as EventDrivenActivity;
                    EventHandlerEventActivitySubscriber parentEventHandler = activity.ActivityState[i];
                    activity2.EventActivity.Unsubscribe(parentContext, parentEventHandler);
                    if ((executionContextManager.GetExecutionContext(activity2) != null) || (activity.ActivityState[i].PendingExecutionCount != 0))
                    {
                        flag = false;
                    }
                }
                if (flag)
                {
                    activity.ActivityState = null;
                    parentContext.CloseActivity();
                }
            }
        }
Exemplo n.º 16
0
        void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }
            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
            {
                throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender");
            }
            EventDrivenActivity   activity = e.Activity as EventDrivenActivity;
            EventHandlersActivity handlers = context.Activity as EventHandlersActivity;

            e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this);
            ActivityExecutionContextManager executionContextManager = context.ExecutionContextManager;

            executionContextManager.CompleteExecutionContext(executionContextManager.GetExecutionContext(activity));
            switch (handlers.ExecutionStatus)
            {
            case ActivityExecutionStatus.Executing:
                for (int i = 0; i < handlers.EnabledActivities.Count; i++)
                {
                    if (handlers.EnabledActivities[i].QualifiedName.Equals(activity.QualifiedName))
                    {
                        EventHandlerEventActivitySubscriber subscriber = handlers.ActivityState[i];
                        if (subscriber.PendingExecutionCount > 0)
                        {
                            subscriber.PendingExecutionCount--;
                            subscriber.IsBlocked = false;
                            ActivityExecutionContext context2 = executionContextManager.CreateExecutionContext(handlers.EnabledActivities[i]);
                            context2.Activity.RegisterForStatusChange(Activity.ClosedEvent, this);
                            context2.ExecuteActivity(context2.Activity);
                            return;
                        }
                        subscriber.IsBlocked = true;
                        if (handlers.IsScopeCompleted && this.AllHandlersAreQuiet(handlers, context))
                        {
                            context.CloseActivity();
                            return;
                        }
                        break;
                    }
                }
                return;

            case ActivityExecutionStatus.Canceling:
            case ActivityExecutionStatus.Faulting:
                if (this.AllHandlersAreQuiet(handlers, context))
                {
                    context.CloseActivity();
                }
                break;

            case ActivityExecutionStatus.Closed:
            case ActivityExecutionStatus.Compensating:
                break;

            default:
                return;
            }
        }
Exemplo n.º 17
0
        void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }

            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
            {
                throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender");
            }

            EventDrivenActivity   eda           = e.Activity as EventDrivenActivity;
            EventHandlersActivity eventHandlers = context.Activity as EventHandlersActivity;

            e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this);

            ActivityExecutionContextManager contextManager = context.ExecutionContextManager;

            contextManager.CompleteExecutionContext(contextManager.GetExecutionContext(eda));

            switch (eventHandlers.ExecutionStatus)
            {
            case ActivityExecutionStatus.Executing:
                for (int i = 0; i < eventHandlers.EnabledActivities.Count; ++i)
                {
                    if (eventHandlers.EnabledActivities[i].QualifiedName.Equals(eda.QualifiedName))
                    {
                        EventHandlerEventActivitySubscriber eventActivitySubscriber = eventHandlers.ActivityState[i];

                        if (eventActivitySubscriber.PendingExecutionCount > 0)
                        {
                            eventActivitySubscriber.PendingExecutionCount--;
                            eventActivitySubscriber.IsBlocked = false;

                            ActivityExecutionContext childContext = contextManager.CreateExecutionContext(eventHandlers.EnabledActivities[i]);
                            childContext.Activity.RegisterForStatusChange(Activity.ClosedEvent, this);
                            childContext.ExecuteActivity(childContext.Activity);
                        }
                        else
                        {
                            eventActivitySubscriber.IsBlocked = true;
                            if (eventHandlers.IsScopeCompleted && AllHandlersAreQuiet(eventHandlers, context))
                            {
                                context.CloseActivity();
                            }
                        }
                        break;
                    }
                }
                break;

            case ActivityExecutionStatus.Canceling:
            case ActivityExecutionStatus.Faulting:
                if (AllHandlersAreQuiet(eventHandlers, context))
                {
                    context.CloseActivity();
                }
                break;
            }
        }