Exemplo n.º 1
0
        private void ActOnTask(DisplayFormUserTask task, TransitionStart userResponse, List <Action> actions)
        {
            //TODO: Serialize the workflow runs like the trigger on save.
            var workflowRun = task.WorkflowRunForTask;

            if ((task.UserTaskIsComplete ?? false) && (workflowRun != null) && (workflowRun.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused))
            {
                var resumeEvent = new UserCompletesTaskEvent
                {
                    CompletionStateId = userResponse.Id,
                    UserTaskId        = task.Id
                };

                var    runId       = workflowRun.Id;
                var    runInThread = WorkflowRunContext.Current.RunTriggersInCurrentThread;
                Action act;

                if (Factory.FeatureSwitch.Get("longRunningWorkflow"))
                {
                    act = () => ActionOnTask_new(runId, resumeEvent, runInThread);
                }
                else
                {
                    act = () => ActionOnTask_old(runId, resumeEvent, runInThread);
                }

                WorkflowRunContext.Current.DeferAction(act);
            }
        }
Exemplo n.º 2
0
        public ITransitionCreator <S, T, G> OnTransitionStarted(TransitionStart function)
        {
            if (LastCreatedTransition == null)
            {
                return(null);
            }

            LastCreatedTransition.OnTransitionStart += function;
            return(this);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Process an approval
        /// </summary>
        /// <param name="taskId">The task to approve</param>
        /// <param name="selectedOption">Teh selected transition</param>
        /// <param name="preSaveAction">An optional presave action</param>
        public static void ProcessApproval(DisplayFormUserTask task, TransitionStart selectedOption, Action <DisplayFormUserTask> preSaveAction = null)
        {
            task = task.AsWritable <DisplayFormUserTask>();

            task.UserResponse        = selectedOption;
            task.UserTaskCompletedOn = DateTime.UtcNow;      // Leave this for the Before save hook, it's currently the only way to know what has changed.
            task.TaskStatus_Enum     = TaskStatusEnum_Enumeration.TaskStatusCompleted;

            if (preSaveAction != null)
            {
                preSaveAction(task);
            }

            task.Save();
        }
        //
        // Remove dead transitions (this shouldn't be needed if cascade delete is working correctly)
        bool IsValidTransitionStart(TransitionStart transStart)
        {
            var transition = transStart.As <Transition>();

            if (transition != null && transition.WorkflowForTransition == null)
            {
                return(false);
            }

            var termination = transStart.As <Termination>();

            if (termination != null && termination.WorkflowForTermination == null)
            {
                return(false);
            }

            return(true);
        }
        /// <summary>
        /// Given a reply message containing a completion state for a user task, find the matching state.
        /// </summary>
        /// <param name="completionOptions"></param>
        /// <param name="message"></param>
        /// <returns>The state, or null if the state was not found</returns>
        TransitionStart ExtractCompletionOption(IEnumerable <TransitionStart> completionOptions, string message)
        {
            var approvalAlternation =
                completionOptions.Select(o => Regex.Escape(o.Name))
                .Aggregate((phrase, next) => phrase + '|' + next);
            // turn into "Approve|Reject|..."
            var approvalRegex = new Regex(string.Format("^\\s*({0})", approvalAlternation),
                                          RegexOptions.IgnoreCase | RegexOptions.Multiline);

            var match = approvalRegex.Match(message);

            TransitionStart completionState = null;

            if (match.Success)
            {
                completionState =
                    completionOptions.First(
                        o => String.Equals(o.Name, match.Groups[1].Value, StringComparison.OrdinalIgnoreCase));
            }

            return(completionState);
        }