/// <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); }
/// <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); }
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); }
/// <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()); } }
/// <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()); } }