Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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);
        }