public override ValidationError ValidateActivityChange(Activity activity, ActivityChangeAction action)
        {
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }

            RemovedActivityAction removedAction = action as RemovedActivityAction;

            if (removedAction != null && removedAction.RemovedActivityIndex == 0)
            {
                return(new ValidationError(SR.GetString(SR.Error_EventActivityIsImmutable), ErrorNumbers.Error_DynamicActivity, false));
            }
            else
            {
                AddedActivityAction addedAction = action as AddedActivityAction;

                if (addedAction != null && addedAction.Index == 0)
                {
                    return(new ValidationError(SR.GetString(SR.Error_EventActivityIsImmutable), ErrorNumbers.Error_DynamicActivity, false));
                }
            }
            return(base.ValidateActivityChange(activity, action));
        }
        public override ValidationError ValidateActivityChange(Activity activity, ActivityChangeAction action)
        {
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }

            if (action == null)
            {
                throw new ArgumentNullException("action");
            }

            AddedActivityAction addedAction = action as AddedActivityAction;

            if (addedAction != null)
            {
                //Check existence of nested PersistOnClose/ICompensatable/SupportsTransaction nested anywhere
                //in the added activity branch
                System.Collections.Generic.Queue <Activity> childrenQueue = new System.Collections.Generic.Queue <Activity>();
                childrenQueue.Enqueue(addedAction.AddedActivity);

                while (childrenQueue.Count != 0)
                {
                    Activity childActivity = childrenQueue.Dequeue();

                    if (childActivity.SupportsTransaction)
                    {
                        return(new ValidationError(SR.GetString(SR.Error_AtomicScopeNestedInNonLRT), ErrorNumbers.Error_AtomicScopeNestedInNonLRT));
                    }

                    if (childActivity.PersistOnClose)
                    {
                        return(new ValidationError(SR.GetString(SR.Error_NestedPersistOnClose, activity.QualifiedName), ErrorNumbers.Error_NestedPersistOnClose));
                    }

                    if (childActivity is ICompensatableActivity)
                    {
                        return(new ValidationError(SR.GetString(SR.Error_NestedCompensatableActivity, activity.QualifiedName), ErrorNumbers.Error_NestedCompensatableActivity));
                    }

                    CompositeActivity compositeActivity = childActivity as CompositeActivity;

                    if (compositeActivity != null)
                    {
                        foreach (Activity grandChild in compositeActivity.EnabledActivities)
                        {
                            childrenQueue.Enqueue(grandChild);
                        }
                    }
                }
            }
            return(base.ValidateActivityChange(activity, action));
        }
示例#3
0
        /// <summary>
        /// Serialise a <see cref="TrackingWorkflowChangedEventArgs" /> ready for persistence.
        /// </summary>
        /// <param name="eventArgs">
        /// The original <see cref="TrackingWorkflowChangedEventArgs" /> to serialise.
        /// </param>
        /// <returns>
        /// A <see cref="SerialisableTrackingWorkflowChangedEventArgs" /> containing a
        /// serialised copy of the <see cref="TrackingWorkflowChangedEventArgs" />.
        /// </returns>
        private static SerialisableTrackingWorkflowChangedEventArgs buildSerialisableTrackingWorkflowChangedEventArgs(TrackingWorkflowChangedEventArgs eventArgs)
        {
            SerialisableTrackingWorkflowChangedEventArgs serialisableEventArgs = new SerialisableTrackingWorkflowChangedEventArgs();

            byte [] serialisedData;
            bool    nonSerialisable;

            serialiseData(eventArgs, out serialisedData, out nonSerialisable);

            serialisableEventArgs.NonSerialisable  = nonSerialisable;
            serialisableEventArgs.SerialisedData   = serialisedData;
            serialisableEventArgs.StringData       = eventArgs.ToString();
            serialisableEventArgs.Type             = eventArgs.GetType();
            serialisableEventArgs.UnserialisedData = eventArgs;

            for (int i = 0; i < eventArgs.Changes.Count; i++)
            {
                AddedActivityAction addedActivityAction = eventArgs.Changes[i] as AddedActivityAction;
                if (addedActivityAction != null)
                {
                    List <SerialisableActivityAddedAction> addedActions =
                        buildSerialisableAddedActivityAction(addedActivityAction, i);

                    foreach (SerialisableActivityAddedAction addedAction in addedActions)
                    {
                        serialisableEventArgs.Changes.Add(addedAction);
                    }

                    continue;
                }

                RemovedActivityAction removedActivityAction = eventArgs.Changes[i] as RemovedActivityAction;
                if (removedActivityAction != null)
                {
                    List <SerialisableActivityRemovedAction> removedActions =
                        buildSerialisableRemovedActivityAction(removedActivityAction, i);

                    foreach (SerialisableActivityRemovedAction removedAction in removedActions)
                    {
                        serialisableEventArgs.Changes.Add(removedAction);
                    }

                    continue;
                }
            }

            return(serialisableEventArgs);
        }
示例#4
0
        public override ValidationError ValidateActivityChange(Activity activity, ActivityChangeAction action)
        {
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            AddedActivityAction action2 = action as AddedActivityAction;

            if (action2 != null)
            {
                Queue <Activity> queue = new Queue <Activity>();
                queue.Enqueue(action2.AddedActivity);
                while (queue.Count != 0)
                {
                    Activity activity2 = queue.Dequeue();
                    if (activity2.SupportsTransaction)
                    {
                        return(new ValidationError(SR.GetString("Error_AtomicScopeNestedInNonLRT"), 0x52e));
                    }
                    if (activity2.PersistOnClose)
                    {
                        return(new ValidationError(SR.GetString("Error_NestedPersistOnClose", new object[] { activity.QualifiedName }), 0x1a2));
                    }
                    if (activity2 is ICompensatableActivity)
                    {
                        return(new ValidationError(SR.GetString("Error_NestedCompensatableActivity", new object[] { activity.QualifiedName }), 0x1a6));
                    }
                    CompositeActivity activity3 = activity2 as CompositeActivity;
                    if (activity3 != null)
                    {
                        foreach (Activity activity4 in activity3.EnabledActivities)
                        {
                            queue.Enqueue(activity4);
                        }
                    }
                }
            }
            return(base.ValidateActivityChange(activity, action));
        }
        public override ValidationError ValidateActivityChange(Activity activity, ActivityChangeAction action)
        {
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            RemovedActivityAction action2 = action as RemovedActivityAction;

            if ((action2 != null) && (action2.RemovedActivityIndex == 0))
            {
                return(new ValidationError(SR.GetString("Error_EventActivityIsImmutable"), 260, false));
            }
            AddedActivityAction action3 = action as AddedActivityAction;

            if ((action3 != null) && (action3.Index == 0))
            {
                return(new ValidationError(SR.GetString("Error_EventActivityIsImmutable"), 260, false));
            }
            return(base.ValidateActivityChange(activity, action));
        }
示例#6
0
        private static List <SerialisableActivityAddedAction> buildSerialisableAddedActivityAction(AddedActivityAction action, int order)
        {
            List <SerialisableActivityAddedAction> addedActivities = new List <SerialisableActivityAddedAction>();

            Queue <Activity> activityQueue = new Queue <Activity>();

            activityQueue.Enqueue(action.AddedActivity);
            while (activityQueue.Count > 0)
            {
                Activity currentActivity = activityQueue.Dequeue();
                if (currentActivity == action.AddedActivity)
                {
                    // this the top-level activity
                    addedActivities.Add(new SerialisableActivityAddedAction(
                                            currentActivity.GetType(), currentActivity.QualifiedName,
                                            currentActivity.Parent == null ? null : currentActivity.Parent.QualifiedName,
                                            order, WorkflowInstanceHelper.GetXomlDocument(currentActivity)));
                }
                else
                {
                    addedActivities.Add(new SerialisableActivityAddedAction(
                                            currentActivity.GetType(), currentActivity.QualifiedName,
                                            currentActivity.Parent == null ? null : currentActivity.Parent.QualifiedName,
                                            -1, WorkflowInstanceHelper.GetXomlDocument(currentActivity)));
                }

                CompositeActivity parentActivity = currentActivity as CompositeActivity;
                if (parentActivity != null)
                {
                    foreach (Activity childActivity in parentActivity.Activities)
                    {
                        activityQueue.Enqueue(childActivity);
                    }
                }
            }

            return(addedActivities);
        }