Esempio n. 1
0
        void ProcessStep(
            IRunState runState,
            ActivityImplementationBase windowsActivity,
            Action <IRunState, ActivityImplementationBase, EntityRef> actionOnCompletion,
            Action <IRunState, ActivityImplementationBase> actionOnPause,
            Func <bool> step
            )
        {
            //TODO: Retire this mess. This is all overly complicated.

            _pendingActivities.Enqueue(
                () =>
            {
                var result = step();
                return(CompleteActivityRun(
                           result,
                           runState,
                           exitPoint => // on completed
                {
                    if (actionOnCompletion != null)
                    {
                        actionOnCompletion(runState, windowsActivity, exitPoint);
                    }
                },
                           () =>                // on paused
                {
                    if (actionOnPause != null)
                    {
                        actionOnPause(runState, windowsActivity);
                    }
                }));
            }
                );
        }
Esempio n. 2
0
        /// <summary>
        /// Add a resume activity to the pending list. NOTE! This does not resume the activity.
        ///
        /// </summary>
        public void ScheduleResume(IRunState runState, ActivityImplementationBase windowsActivity, IWorkflowEvent resumeEvent,
                                   Action <IRunState, ActivityImplementationBase, EntityRef> actionOnCompletion,
                                   Action <IRunState, ActivityImplementationBase> actionOnPause)
        {
            Func <bool> step = () =>
            {
                runState.RecordTrace(windowsActivity.ActivityInstance.Name);
                return(windowsActivity.ResumeInContext(runState, resumeEvent));
            };

            ProcessStep(runState, windowsActivity, actionOnCompletion, actionOnPause, step);
        }
Esempio n. 3
0
        public void AddActivityToCache(ActivityImplementationBase activity)
        {
            long key = activity.ActivityInstance.Id;

            if (!_cachedInstances.ContainsKey(key))
            {
                _cachedInstances.Add(key, activity);

                _exitPointsCache.Add(key, activity.ActivityInstance.GetExitPoints());
            }
            else
            {
                throw new ApplicationException("Attempted to recache an activity instance:" + key);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Add an activity to the pending list. NOTE! This does not run the activity.
        /// </summary>
        public void ScheduleActivity(IRunState runState, ActivityImplementationBase windowsActivity, ActivityInputs inputs,
                                     Action <IRunState, ActivityImplementationBase, EntityRef> actionOnCompletion,
                                     Action <IRunState, ActivityImplementationBase> actionOnPause)
        {
            Func <bool> step = () =>
            {
                runState.StepsTakenInSession++;

                runState.CurrentActivity = windowsActivity.ActivityInstance;
                runState.RecordTrace(windowsActivity.ActivityInstance.Name);

                return(windowsActivity.RunInContext(runState, inputs));
            };

            ProcessStep(runState, windowsActivity, actionOnCompletion, actionOnPause, step);
        }
Esempio n. 5
0
        private void NextStepCompletionCallback(IRunState context, ActivityImplementationBase completedInstance, EntityRef exitPointRef)
        {
            var childActivity = ((ActivityImplementationBase)completedInstance).ActivityInstance;

            var transition = context.Metadata.GetTransitionForExitPoint(childActivity, exitPointRef);

            if (transition != null)
            {
                if (NeedToSuspend(context))
                {
                    MarkRunSuspended(context, childActivity);
                }
                else
                {
                    var nextActivity = transition.ToActivity;
                    context.ExitPointId = null;
                    ScheduleNextStep(context, nextActivity);
                }
            }
            else
            {
                Termination termination;

                try
                {
                    termination =
                        _activityInstanceAsWf.Terminations.Single(
                            t => t.FromActivity.Id == childActivity.Id && t.FromExitPoint.Id == exitPointRef.Id);
                }
                catch (InvalidOperationException err)
                {
                    throw new WorkflowRunException(string.Format("There should be only one valid termination found for the given activity and exit point. \nWorkflow: {0} \n Last activity: {1}", _activityInstanceAsWf.GetIdString(), childActivity.Name ?? "(Unnamed)"), err);
                }

                context.ExitPointId = termination.WorkflowExitPoint;

                MarkRunCompleted(context);

                context.FlushInternalArgs();
            }
        }
Esempio n. 6
0
 private void NextStepPausedCallback(IRunState context, ActivityImplementationBase pausedInstance)
 {
     MarkRunPaused(context, pausedInstance.ActivityInstance);
 }
Esempio n. 7
0
 /// <summary>
 /// Resume a paused activity on the invoker
 /// </summary>
 /// <param name="runState">The runstate</param>
 /// <param name="windowsActivity">The activity</param>
 /// <param name="resumeEvent">The trigger event for the resume</param>
 /// <returns></returns>
 public bool Resume(IRunState runState, ActivityImplementationBase windowsActivity, IWorkflowEvent resumeEvent)
 {
     ScheduleResume(runState, windowsActivity, resumeEvent, null, null);
     return(RunTillCompletion(runState));
 }
Esempio n. 8
0
 /// <summary>
 /// Run an activity on the invoker
 /// </summary>
 /// <param name="runState">The runState for the workflow</param>
 /// <param name="windowsActivity">The activity to run</param>
 /// <param name="inputs">The inputs</param>
 /// <returns></returns>
 public bool Run(IRunState runState, ActivityImplementationBase windowsActivity, ActivityInputs inputs)
 {
     ScheduleActivity(runState, windowsActivity, inputs, null, null);
     return(RunTillCompletion(runState));
 }