private WorkflowContext Run(WorkflowProcess process, Dictionary <String, object> processParameters) { var contextData = new WorkflowContextData(process != null ? process.Id : Guid.Empty, UserId); var context = new WorkflowContext(contextData, Provider); context.SetVariables(processParameters); if (process != null) { if (process.StartActivityId == Guid.Empty) { throw new ApplicationException("Для процесса не задан StartActivity"); } ScriptManager.LoadScript(process.Script); context.RunActivity(process.StartActivityId); return(RunActivities(context)); } context.ThrowException("No Process", "Процесс не существует!"); return(context); }
public WorkflowContext(WorkflowContextData data, IAppServiceProvider provider) { if (data == null) { throw new ArgumentNullException(@"data"); } if (provider == null) { throw new ArgumentNullException(@"provider"); } Provider = provider; _dataContext = Provider.Find <IMultiDataContext>() ?? Provider.Get <IDataContext>(); Data = data; _docRepo = Provider.Get <IDocRepository>(); _userRepo = Provider.Get <IUserRepository>(); _defRepo = Provider.Get <IDocDefRepository>(); _orgRepo = Provider.Get <IOrgRepository>(); _enumRepo = Provider.Get <IEnumRepository>(); _sqlQueryBuilderFactory = Provider.Get <ISqlQueryBuilderFactory>(); _sqlQueryReaderFactory = Provider.Get <ISqlQueryReaderFactory>(); }
public ExternalProcessExecuteResult RunGate(string gateName, WorkflowContextData contextData) { //var requestContext = new WorkflowContext(contextData, Provider); var result = new ExternalProcessExecuteResult { Data = contextData, Type = ExternalProcessExecuteResultType.Failed }; try { var processGate = Repository.LoadGateByName(gateName); if (processGate != null) { var process = Repository.LoadProcessById(processGate.ProcessId); if (process != null) { var userProvider = Provider.Get <IUserDataProvider>(); var processContextData = new WorkflowContextData(process, contextData, userProvider.UserId); var processContext = Run(process, new WorkflowContext(processContextData, Provider)); result.ReturnData = processContext.Data; result.Type = ExternalProcessExecuteResultType.Success; /*var responseContext = new WorkflowContext(processContext.Parent, Provider); * responseContext.ProcessReturn(processContext.Data);*/ return(result); } result.Type = ExternalProcessExecuteResultType.ProcessNotFound; return(result); } result.Type = ExternalProcessExecuteResultType.GateNotFound; return(result); } catch (Exception e) { result.Type = ExternalProcessExecuteResultType.Failed; result.Message = e.Message; try { using (var writer = new StreamWriter(Logger.GetLogFileName("WorkflowGate"), true)) { writer.WriteLine("{0}: \"{1}\", \"{2}\": '{3}' message: \"{4}\"", DateTime.Now, contextData.ProcessName, contextData.UserId, GetType().Name, e.Message); if (e.InnerException != null) { writer.WriteLine(" - inner exception: \"{0}\"", e.InnerException.Message); } writer.WriteLine(" -- Stack: {0}", e.StackTrace); } } catch (Exception) { // ignored } return(result); } }
public WorkflowContext(WorkflowContextData data, IDataContext dataContext) { if (data == null) { throw new ArgumentNullException(@"data"); } if (dataContext == null) { throw new ArgumentNullException(@"dataContext"); } _dataContext = dataContext; Data = data; var factory = AppServiceProviderFactoryProvider.GetFactory(); Provider = factory.Create(); /*_docRepo = new DocRepository(DataContext, UserId); * _userRepo = new UserRepository(DataContext); * _defRepo = new DocDefRepository(DataContext, UserId); * _orgRepo = new OrgRepository(DataContext/*, Data.UserId#1#); * _enumRepo = new EnumRepository(DataContext);*/ _docRepo = Provider.Get <IDocRepository>(); _userRepo = Provider.Get <IUserRepository>(); _defRepo = Provider.Get <IDocDefRepository>(); _orgRepo = Provider.Get <IOrgRepository>(); _enumRepo = Provider.Get <IEnumRepository>(); _sqlQueryBuilderFactory = Provider.Get <ISqlQueryBuilderFactory>(); _sqlQueryReaderFactory = Provider.Get <ISqlQueryReaderFactory>(); }
public void ProcessReturn(WorkflowContextData returnContextData) { Data.State = WorkflowRuntimeState.ProcessReturn; Data.ReturnedContextData = returnContextData; Data.ReturnedContextData.Parent = null; Data.ReturnedSuccessFlag = ReturnedContextData.SuccessFlag; }
public WorkflowProcessExecutionTask(Guid taskId, WorkflowContextData contextData, Action action) { Id = taskId; State = RUNNING; ContextData = contextData; Task = new Task(action); Created = DateTime.Now; UserId = contextData != null ? contextData.UserId : Guid.Empty; ProcessId = contextData != null ? contextData.ProcessId ?? Guid.Empty : Guid.Empty; ProcessName = contextData != null ? contextData.ProcessName : string.Empty; }
private static object GetVariableFrom(WorkflowContextData data, string name) { if (data == null || data.Variables == null) { return(null); } var variable = data.Variables.Find(v => String.Equals(v.Name, name, StringComparison.OrdinalIgnoreCase)); var objectVariable = variable as ObjectVariable; if (objectVariable != null) { return(objectVariable.Value); } var documentVariable = variable as DocumentVariable; if (documentVariable != null) { return(documentVariable.Value); } var attributeVariable = variable as AttributeVariable; if (attributeVariable != null) { return(attributeVariable.Value); } var valueVariable = variable as EnumValueVariable; if (valueVariable != null) { return(valueVariable.Value); } var listVariable = variable as ObjectListVariable; if (listVariable != null) { return(listVariable.Value); } var docListVariable = variable as DocListVariable; if (docListVariable != null) { return(docListVariable.Value); } return(null); }
public WorkflowContextData Continue(WorkflowContextData contextData) { var context = new WorkflowContext(contextData, Provider); DataContext.BeginTransaction(); try { var returnContext = RunActivities(context); DataContext.Commit(); if (returnContext != null) { return(returnContext.Data); } } catch { DataContext.Rollback(); throw; } return(null); }
public WorkflowContextData Run(Guid processId, WorkflowContextData contextData) { var process = Repository.LoadProcessById(processId); DataContext.BeginTransaction(); try { var context = Run(process, new WorkflowContext(contextData, Provider)); DataContext.Commit(); if (context != null) { return(context.Data); } } catch { DataContext.Rollback(); throw; } return(null); }
private WorkflowContext RunProcessActivities(WorkflowContext context) { while (true) { switch (context.State) { case WorkflowRuntimeState.Finish: if (context.Parent != null && context.Parent.State == WorkflowRuntimeState.ProcessCall) { var callContext = new WorkflowContext(context.Parent, Provider); callContext.ProcessReturn(context.Data); context = callContext; break; } return(context); case WorkflowRuntimeState.Run: var runActivity = Repository.LoadActivityById(context.ActivityId); if (runActivity == null) { context.ThrowException("No Activity", "Операции не существует!"); } else { new WorkflowActivityEngine(runActivity, Provider, DataContext).Execute(context); } break; case WorkflowRuntimeState.ProcessCall: var process = Repository.LoadProcessById(context.ProcessId ?? Guid.Empty); if (process != null) { var processContext = new WorkflowContextData(process, context.Data); context = RunSubProcess(process, new WorkflowContext(processContext, Provider)); /*if (context.State == WorkflowRuntimeState.Finish) * { * context.ProcessReturn(returnedContext.Data); * context.Data.ReturnedExceptionFlag = false; * } * else if (returnedContext.State == WorkflowRuntimeState.Exception) * { * context.ProcessReturn(returnedContext.Data); * context.Data.ReturnedExceptionFlag = true; * }*/ } else { context.ThrowException("No Process", "Процесс не найден"); } break; case WorkflowRuntimeState.GateProcessCall: var gateRef = Repository.LoadGateRefById(context.GateId ?? Guid.Empty); if (gateRef != null) { context = new WorkflowContext( RunExternalProcess(gateRef, context.GateProcessName, context.Data), Provider); } else { context.ThrowException("No GateRef", "Ссылка на шлюз внешнего процесса не найдена"); } break; case WorkflowRuntimeState.ProcessReturn: var processReturnActivity = Repository.LoadActivityById(context.ActivityId); if (processReturnActivity != null) { new WorkflowActivityEngine(processReturnActivity, Provider, DataContext) .AfterExecution(context); } else { context.ThrowException("No Activity", "Действие не найдено"); } break; case WorkflowRuntimeState.ShowReturn: case WorkflowRuntimeState.ShowSelectReturn: case WorkflowRuntimeState.UploadFileReturn: var returnActivity = Repository.LoadActivityById(context.ActivityId); if (returnActivity != null) { new WorkflowActivityEngine(returnActivity, Provider, DataContext) .AfterExecution(context); } else { context.ThrowException("No Activity", "Действие не найдено"); } break; case WorkflowRuntimeState.Exception: return(HandleException(context)); default: return(context); } } }
private WorkflowContext RunNext(WorkflowContext context) { if (context.State == WorkflowRuntimeState.Finish) { if (context.Parent != null && context.Parent.State == WorkflowRuntimeState.ProcessCall) { var callContext = new WorkflowContext(context.Parent, Provider); callContext.ProcessReturn(context.Data); return(RunNext(callContext)); } return(context); } if (context.State == WorkflowRuntimeState.Run) { return(Continue(context, context.ActivityId /*CurrentActivity.Id*/)); } if (context.State == WorkflowRuntimeState.ProcessCall) { var process = Repository.LoadProcessById(context.ProcessId ?? Guid.Empty); if (process != null) { var processContext = new WorkflowContextData(process, context.Data); return(Run(process, new WorkflowContext(processContext, Provider))); } context.ThrowException("No Process", "Процесс не найден"); } if (context.State == WorkflowRuntimeState.GateProcessCall) { var gateRef = Repository.LoadGateRefById(context.GateId ?? Guid.Empty); if (gateRef != null) { context = new WorkflowContext(RunExternalProcess(gateRef, context.GateProcessName, context.Data), Provider); return(RunNext(context)); } context.ThrowException("No GateRef", "Ссылка на шлюз внешнего процесса не найдена"); } if (context.State == WorkflowRuntimeState.ProcessReturn) { var activity = Repository.LoadActivityById(context.ActivityId /*CurrentActivity.Id*/); if (activity != null) { new WorkflowActivityEngine(activity, Provider, DataContext).AfterExecution(context); return(RunNext(context)); } context.ThrowException("No Activity", "Действие не найдено"); } if (context.State == WorkflowRuntimeState.ShowReturn || context.State == WorkflowRuntimeState.ShowSelectReturn || context.State == WorkflowRuntimeState.UploadFileReturn) { var activity = Repository.LoadActivityById(context.ActivityId); if (activity != null) { new WorkflowActivityEngine(activity, Provider, DataContext).AfterExecution(context); return(RunNext(context)); } context.ThrowException("No Activity", "Действие не найдено"); } if (context.State == WorkflowRuntimeState.Exception) { return(HandleException(context)); } /* * if (context.State == WorkflowRuntimeState.ShowForm) * return context; * if (context.State == WorkflowRuntimeState.ShowMessage) * return context; * if (context.State == WorkflowRuntimeState.ShowReport) * return context; * if (context.State == WorkflowRuntimeState.SendFile) * return context; */ return(context); }
private static WorkflowContextData Clone(WorkflowContextData contextData) { var cloner = new WorkflowContextDataCloner(); return(cloner.Clone(contextData)); }
public WorkflowContextData RunExternalProcess(WorkflowGateRef gateRef, string processName, WorkflowContextData contextData) { var context = new WorkflowContext(contextData, Provider); if (gateRef != null) { try { var launcher = Provider.Get <IExternalProcessLauncher>(); context.Data.ReturnData = null; var result = launcher.Launch(gateRef, processName, Clone(contextData)); context.Data.ReturnData = new ExternalProcessReturnData { ResultType = result.Type, Correct = false, WithException = false }; switch (result.Type) { case ExternalProcessExecuteResultType.Success: context.ProcessReturn(result.ReturnData); if (result.ReturnData.State == WorkflowRuntimeState.Finish) { context.ReturnData.Correct = true; return(context.Data); } if (result.ReturnData.State != WorkflowRuntimeState.Exception) { /*context.ThrowException("Process invalid state", * String.Format("Процесс \"{0}\", на внешнем сервисе, вернул неверный статус завершения", processName));*/ context.ReturnData.ExceptionMessage = String.Format( "Процесс \"{0}\", на внешнем сервисе, вернул неверный статус завершения", processName); return(context.Data); } /*context.ThrowException("Process failed", * String.Format("Ошибка при выполнении процесса \"{0}\" на внешнем сервисе: {1}", processName, result.ReturnData.ExceptionName));*/ context.ReturnData.WithException = true; context.ReturnData.ExceptionMessage = String.Format("Ошибка при выполнении процесса \"{0}\" на внешнем сервисе: {1}", processName, result.ReturnData.ExceptionName); return(context.Data); case ExternalProcessExecuteResultType.GateNotFound: context.ThrowException("Gate not Found", result.Message ?? "Интерфейс доступа на внешнем сервисе не найден"); break; case ExternalProcessExecuteResultType.ProcessNotFound: context.ThrowException("Process not Found", result.Message ?? "Процесс на внешнем сервисе не найден"); break; case ExternalProcessExecuteResultType.Failed: context.ThrowException("Process failed", result.Message ?? "Ошибка при выполнении процесса на внешнем сервисе"); break; } } catch (Exception e) { var msg = String.Format("Произошла ошибка при вызове внешнего процесса \"{0}\"", processName); context.ThrowException(e.Message, msg); var fileName = Logger.GetLogFileName("ExProccessLaunch"); Logger.OutputLog(fileName, e, msg); return(context.Data); } } else { context.ThrowException("No Process Gate", "Не могу запустить внешний процесс, индерфейс доступа к внешнему сервису не найден!"); } return(context.Data); }
public WorkflowContextData(WorkflowProcess process, WorkflowContextData parent, Guid userId) : this(process, userId) { Parent = parent; }
public WorkflowContextData(WorkflowProcess process, WorkflowContextData parent) : this(process, parent.UserId) { Parent = parent; }