コード例 #1
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
        }
コード例 #2
0
        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>();
        }
コード例 #3
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
            }
        }
コード例 #4
0
        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>();
        }
コード例 #5
0
        public void ProcessReturn(WorkflowContextData returnContextData)
        {
            Data.State = WorkflowRuntimeState.ProcessReturn;

            Data.ReturnedContextData        = returnContextData;
            Data.ReturnedContextData.Parent = null;
            Data.ReturnedSuccessFlag        = ReturnedContextData.SuccessFlag;
        }
コード例 #6
0
 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;
 }
コード例 #7
0
        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);
        }
コード例 #8
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
        }
コード例 #9
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
        }
コード例 #10
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
                }
            }
        }
コード例 #11
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
        }
コード例 #12
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        private static WorkflowContextData Clone(WorkflowContextData contextData)
        {
            var cloner = new WorkflowContextDataCloner();

            return(cloner.Clone(contextData));
        }
コード例 #13
0
ファイル: WorkflowEngine.cs プロジェクト: tilekchubakov/CISSA
        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);
        }
コード例 #14
0
 public WorkflowContextData(WorkflowProcess process, WorkflowContextData parent, Guid userId)
     : this(process, userId)
 {
     Parent = parent;
 }
コード例 #15
0
 public WorkflowContextData(WorkflowProcess process, WorkflowContextData parent)
     : this(process, parent.UserId)
 {
     Parent = parent;
 }