コード例 #1
0
        /// <summary>
        /// Continue a paused activity
        /// </summary>
        /// <returns>True if the activity has completed, false if it is paused.</returns>
        public override bool OnResume(IRunState context, IWorkflowEvent resumeEvent)
        {
            var userCompletesEvent = resumeEvent as PromptUserTaskCompletedEvent;

            if (userCompletesEvent != null)
            {
                context.ExitPointId = new EntityRef("promptUserCompleted");

                var userTaskId = userCompletesEvent.UserTaskId;

                var userTask = Entity.Get <PromptUserTask>(userTaskId, PromptUserTask.PromptForTaskStateInfo_Field);
                if (userTask != null)
                {
                    // load the state information in the task back into the workflow run context
                    foreach (var arg in userTask.PromptForTaskArguments)
                    {
                        var input = userTask.PromptForTaskStateInfo.FirstOrDefault(si => si.StateInfoArgument.Id == arg.ActivityPromptArgument.Id);
                        if (input == null)
                        {
                            continue;
                        }

                        context.SetArgValue(input.StateInfoArgument, ActivityArgumentHelper.GetArgParameterValue(input.StateInfoValue));
                    }

                    Entity.Delete(userTask);
                }
            }

            return(true);
        }
コード例 #2
0
        /// <summary>
        /// Start the activity running
        /// </summary>
        /// <returns>True if the activity has completed, false if it is paused. Along with a sequence number of if it is paused</returns>
        public override bool OnStart(IRunState context, ActivityInputs inputs)
        {
            var assignedTo         = GetArgumentEntity <Person>(inputs, "inPromptUserForPerson");
            var promptMessage      = GetArgumentValue <string>(inputs, "inPromptUserMessage");
            var activityInstanceAs = ActivityInstance.Cast <PromptUserActivity>();

            var userTask = new PromptUserTask
            {
                Name                   = ActivityInstance.Name ?? "User input required",
                AssignedToUser         = assignedTo,
                TaskStatus_Enum        = TaskStatusEnum_Enumeration.TaskStatusNotStarted,
                UserTaskDueOn          = DateTime.UtcNow, // dueDate
                KeepAfterCompletion    = false,           // keepTask
                WaitForNextTask        = true,            // waitForNext
                PromptForTaskMessage   = promptMessage,
                PromptForTaskArguments = new EntityCollection <ActivityPrompt>(activityInstanceAs.PromptForArguments)
            };

            // move current state information on to the task for pre-population of any arguments for prompt
            var argValues = context.GetArgValues().ToList();

            foreach (var arg in activityInstanceAs.PromptForArguments)
            {
                var argValue = argValues.FirstOrDefault(a => a.Item2.Id == arg.ActivityPromptArgument.Id);
                if (argValue != null)
                {
                    var valueArg = ActivityArgumentHelper.ConvertArgInstValue(argValue.Item1, argValue.Item2, argValue.Item3);
                    userTask.PromptForTaskStateInfo.Add(new StateInfoEntry
                    {
                        Name = valueArg.Name,
                        StateInfoActivity = ActivityInstance,
                        StateInfoArgument = argValue.Item2,
                        StateInfoValue    = valueArg
                    });

                    continue;
                }

                var emptyArg = ActivityArgumentHelper.ConvertArgInstValue(ActivityInstance, arg.ActivityPromptArgument, null);
                userTask.PromptForTaskStateInfo.Add(new StateInfoEntry
                {
                    Name = emptyArg.Name,
                    StateInfoActivity = ActivityInstance,
                    StateInfoArgument = arg.ActivityPromptArgument,
                    StateInfoValue    = emptyArg
                });
            }

            context.SetUserTask(userTask.Cast <BaseUserTask>());

            return(false);
        }
コード例 #3
0
        public static Dictionary <string, object> GetOutput(this WorkflowRun run)
        {
            var outputArgIds = run.WorkflowBeingRun.OutputArguments.Select(a => a.Id);

            var outputInfo = run.StateInfo.Where(si => outputArgIds.Contains(si.StateInfoArgument.Id));

            var result = new Dictionary <string, object>();

            foreach (var si in outputInfo)
            {
                var outputArg = si.StateInfoArgument;
                var valueArg  = si.StateInfoValue;
                var value     = ActivityArgumentHelper.GetArgParameterValue(valueArg);

                result.Add(outputArg.Name, value);
            }

            return(result);
        }
コード例 #4
0
        /// <summary>
        /// Load up any state from the run.
        /// </summary>
        public void SyncFromRun()
        {
            using (Profiler.Measure("RunStateBase.SyncFromRun"))
            {
                var run = WorkflowRun;

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

                var sb = new StringBuilder("");
                sb.AppendFormat("Workflow: {0}. Loading state from workflow run ({1}). Values: ",
                                GetSafeWorkflowDescription(), run.Id);
                sb.Append(Environment.NewLine);

                foreach (var entry in run.StateInfo)
                {
                    var activity   = entry.StateInfoActivity;
                    var argument   = entry.StateInfoArgument;
                    var stateValue = entry.StateInfoValue;

                    var value = ActivityArgumentHelper.GetArgParameterValue(stateValue);

                    if (value != null)
                    {
                        if (activity == null || (run.WorkflowBeingRun != null && activity.Id == run.WorkflowBeingRun.Id))
                        {
                            SetArgValue(argument, value);
                        }
                        else
                        {
                            SetArgValue(activity, argument, value);
                        }

                        var act = "[Empty]";
                        var arg = "[Empty]";
                        if (activity != null)
                        {
                            if (!string.IsNullOrEmpty(activity.Name))
                            {
                                act = activity.Name;
                            }
                            else
                            {
                                act = "[" + activity.Id + "]";
                            }
                        }
                        if (argument != null)
                        {
                            if (!string.IsNullOrEmpty(argument.Name))
                            {
                                arg = argument.Name;
                            }
                            else
                            {
                                arg = "[" + argument.Id + "]";
                            }
                        }

                        sb.AppendLine(string.Format("{0}.{1} ", act, arg));
                    }
                }

                EventLog.Application.WriteInformation(sb.ToString());
            }
        }
コード例 #5
0
        /// <summary>
        /// Update the provided run with the cached values in the runstate
        /// </summary>
        /// <param name="writableRun"></param>
        public void SyncToRun(WorkflowRun writableRun)
        {
            using (Profiler.Measure("RunStateBase.SyncToRun"))
            {
                writableRun.WorkflowRunExitPoint = ExitPointId != null?Entity.Get <ExitPoint>(ExitPointId) : null;

                writableRun.HasTimeout      = HasTimeout;
                writableRun.PendingActivity = PendingActivity;
                writableRun.RunStepCounter  = writableRun.RunStepCounter.HasValue
                    ? writableRun.RunStepCounter.Value + StepsTakenInSession
                    : StepsTakenInSession;
                writableRun.TotalTimeMs            = (writableRun.TotalTimeMs.HasValue ? writableRun.TotalTimeMs.Value : 0) + (int)TimeTakenInSession.ElapsedMilliseconds;
                writableRun.WorkflowRunStatus_Enum = RunStatus;
                writableRun.RunCompletedAt         = CompletedAt;

                StepsTakenInSession = 0;
                TimeTakenInSession.Reset();

                var stateInfo  = writableRun.StateInfo;
                var deleteList = stateInfo.Select(e => e.Id).ToList();

                stateInfo.Clear();

                Entity.Delete(deleteList);

                // write a message to the log
                var sb = new StringBuilder();

                sb.AppendLine("Saving state to workflow run. Values: ");

                foreach (var cacheValue in GetArgValues())
                {
                    WfActivity       activity = cacheValue.Item1;
                    ActivityArgument arg      = cacheValue.Item2;
                    object           value    = cacheValue.Item3;

                    ActivityArgument valueArg = ActivityArgumentHelper.ConvertArgInstValue(activity, arg, value);

                    stateInfo.Add(new StateInfoEntry
                    {
                        Name = valueArg.Name,
                        StateInfoActivity = activity.Id != writableRun.WorkflowBeingRun.Id ? activity : null,
                        // Don't store the workflow as an activity
                        StateInfoArgument = arg,
                        StateInfoValue    = valueArg
                    });

                    sb.Append(valueArg.Name);
                    sb.Append(": \t");
                    if (value is IEntity)
                    {
                        sb.AppendFormat("Resource {0}\n", ((IEntity)value).Id);
                    }
                    else if (value == null)
                    {
                        sb.AppendLine("[Null]");
                    }
                    else
                    {
                        sb.AppendLine(value.ToString());
                    }
                }

                EventLog.Application.WriteInformation(sb.ToString());
            }
        }