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