Example #1
0
 public void QueueExecution(IEnumerable<ExecutionRequestParameters> requestParameters)
 {
     var executor = new ActivityExecutor();
     var response = executor.Execute(requestParameters);
     if (ExecutionComplete != null)
     {
         var args = new ExecutionResponseEventArgs(response);
         ExecutionComplete(this,args);
     }
 }
Example #2
0
        public void PreExecute(Guid processId)
        {
            var processInstance = Builder.GetProcessInstance(processId);

            //从这里分析什么是SystemProcessParameters,系统参数
            PersistenceProvider.FillSystemProcessParameters(processInstance);

            var activity = processInstance.ProcessScheme.FindActivity(processInstance.CurrentActivityName);
            var currentActivity = processInstance.ProcessScheme.InitialActivity;
            if (activity.State != currentActivity.State)
                return; //TODO Workflow Temporary

            var executor = new ActivityExecutor(true);

            processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterProcessId, processId));
            processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId));

            if (currentActivity.HavePreExecutionImplementation)
            {
                var response = executor.Execute(new List<ExecutionRequestParameters>
                                     {
                                         ExecutionRequestParameters.Create(processInstance.ProcessId,
                                                                           processInstance.ProcessParameters,
                                                                           processInstance.ProcessScheme.InitialActivity,
                                                                           ConditionDefinition.Always,
                                                                           true)
                                     });

                if (PreExecuteProcessResponse(processInstance, response)) return;
            }

            do
            {
                if (!string.IsNullOrEmpty(currentActivity.State))
                    processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentState, (object)currentActivity.State));

                var transitions =
                    processInstance.ProcessScheme.GetPossibleTransitionsForActivity(currentActivity).Where(t => t.Classifier == TransitionClassifier.Direct);

                currentActivity = null;

                var autotransitions = transitions.Where(t => t.Trigger.Type == TriggerType.Auto);

                var newExecutionParameters = FillExecutionRequestParameters(processId, processInstance, autotransitions);

                if (newExecutionParameters.Count > 0)
                {
                    var response = executor.Execute(newExecutionParameters);

                    if (!PreExecuteProcessResponse(processInstance, response))
                    {
                        currentActivity =
                            processInstance.ProcessScheme.FindTransition(response.ExecutedTransitionName).To;
                    }
                }

                if (currentActivity == null)
                {
                    var commandTransitions = transitions.Where(t => t.Trigger.Type == TriggerType.Command);

                    if (commandTransitions.Count(t => t.Condition.Type == ConditionType.Always && !t.Condition.ResultOnPreExecution.HasValue) < 2) //Это не является ошибкой валидациии при разных командах
                    {
                        newExecutionParameters = FillExecutionRequestParameters(processId, processInstance,
                                                                                commandTransitions);

                        if (newExecutionParameters.Count > 0)
                        {
                            var response = executor.Execute(newExecutionParameters);

                            if (!PreExecuteProcessResponse(processInstance, response))
                            {
                                currentActivity =
                                    processInstance.ProcessScheme.FindTransition(response.ExecutedTransitionName).To;

                            }
                        }
                    }
                }

            } while (currentActivity != null && !currentActivity.IsFinal);
        }
Example #3
0
        public void ExecuteCommand(WorkflowCommand command, string identityId, string impersonatedIdentityId)
        {
            IEnumerable<TransitionDefinition> list;
            ProcessInstance processInstance = this.Builder.GetProcessInstance(command.ProcessId);
            this.SetProcessNewStatus(processInstance, ProcessStatus.Running);
            try
            {
                this.PersistenceProvider.FillSystemProcessParameters(processInstance);
                if (processInstance.CurrentActivityName != command.ValidForActivityName)
                {
                    throw new InvalidOperationException(string.Format("Impossible to execute command {0} valid for activity {1}. Current activity {2}.", command.CommandName, command.ValidForActivityName, processInstance.CurrentActivityName));
                }
                list = processInstance.ProcessScheme.GetCommandTransitionForActivity(processInstance.CurrentActivity, command.CommandName, ForkTransitionSearchType.Both).ToList<TransitionDefinition>();
                if (!list.Any<TransitionDefinition>())
                {
                    throw new InvalidOperationException();
                }
            }
            catch (Exception exception)
            {
                this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                throw;
            }
            try
            {
                foreach (CommandParameter parameter in command.Parameters)
                {
                    ParameterDefinition parameterDefinition = processInstance.ProcessScheme.FindParameterDefinition(parameter.ParameterName);
                    if (parameterDefinition == null)
                    {
                        continue;
                    }
                    processInstance.AddParameter(ParameterDefinition.Create(parameterDefinition, parameter.Value));
                }
                processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentCommand, command.CommandName));
                processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIdentityId, identityId));
                processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterImpersonatedIdentityId, impersonatedIdentityId));
                this.PersistenceProvider.SavePersistenceParameters(processInstance);
                this.PersistenceProvider.FillPersistedProcessParameters(processInstance);
            }
            catch (Exception exception1)
            {
                this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                throw;
            }
            List<TransitionDefinition> transitionDefinitions = (
                from t in list
                where t.IsFork
                select t).ToList<TransitionDefinition>();
            List<TransitionDefinition> list1 = (
                from t in list
                where !t.IsFork
                select t).ToList<TransitionDefinition>();
            if (transitionDefinitions.Any<TransitionDefinition>())
            {
                ActivityExecutor activityExecutor = new ActivityExecutor(this, false);
                try
                {
                    List<ExecutionRequestParameters> executionRequestParameters = new List<ExecutionRequestParameters>();
                    executionRequestParameters.AddRange(
                        from at in transitionDefinitions
                        select ExecutionRequestParameters.Create(processInstance, at));
                    executionRequestParameters.ForEach((ExecutionRequestParameters p) => p.Methods = new ActionDefinitionReference[0]);
                    ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters);
                    if (!this.PreExecuteProcessResponse(executionResponseParameter))
                    {
                        TransitionDefinition transitionDefinition = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName);
                        this.CreateSubprocesses(processInstance, new List<TransitionDefinition>()
						{
							transitionDefinition
						}, null);
                    }
                    if (!list1.Any<TransitionDefinition>())
                    {
                        this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                    }
                }
                catch (Exception exception3)
                {
                    Exception exception2 = exception3;
                    this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                    throw new Exception(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), exception2);
                }
            }
            if (list1.Any<TransitionDefinition>())
            {
                try
                {
                    processInstance.SetStartTransitionalProcessActivity();
                    List<ExecutionRequestParameters> executionRequestParameters1 = new List<ExecutionRequestParameters>();
                    executionRequestParameters1.AddRange(
                        from at in list1
                        select ExecutionRequestParameters.Create(processInstance, at));
                    this.Bus.QueueExecution(executionRequestParameters1);
                }
                catch (Exception exception5)
                {
                    Exception exception4 = exception5;
                    this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                    throw new Exception(string.Format("Error Execute Command Workflow Id={0}", processInstance.ProcessId), exception4);
                }
            }
        }
Example #4
0
        internal void ExecuteTimer(Guid processId, string timerName)
        {
            ProcessInstance processInstance = this.Builder.GetProcessInstance(processId);
            this.PersistenceProvider.FillProcessParameters(processInstance);
            TransitionDefinition transitionDefinition = processInstance.ProcessScheme.GetTimerTransitionForActivity(processInstance.CurrentActivity, ForkTransitionSearchType.Both).FirstOrDefault<TransitionDefinition>((TransitionDefinition p) => p.Trigger.Timer.Name == timerName);
            if (transitionDefinition != null)
            {
                try
                {
                    this.SetProcessNewStatus(processInstance, ProcessStatus.Running);
                    processInstance.ExecutedTimer = timerName;
                    processInstance.CurrentCommand = DefaultDefinitions.CommandTimer.Name;
                    processInstance.IdentityId = null;
                    processInstance.ImpersonatedIdentityId = null;
                    List<ExecutionRequestParameters> executionRequestParameters = new List<ExecutionRequestParameters>()
					{
						ExecutionRequestParameters.Create(processInstance, transitionDefinition)
					};
                    if (!transitionDefinition.IsFork)
                    {
                        processInstance.SetStartTransitionalProcessActivity();
                        this.Bus.QueueExecution(executionRequestParameters);
                    }
                    else
                    {
                        ActivityExecutor activityExecutor = new ActivityExecutor(this, false);
                        executionRequestParameters.ForEach((ExecutionRequestParameters p) => p.Methods = new ActionDefinitionReference[0]);
                        ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters);
                        if (!this.PreExecuteProcessResponse(executionResponseParameter))
                        {
                            TransitionDefinition transitionDefinition1 = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName);
                            this.CreateSubprocesses(processInstance, new List<TransitionDefinition>()
							{
								transitionDefinition1
							}, null);
                        }
                        this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                    }
                }
                catch (Exception exception1)
                {
                    Exception exception = exception1;
                    this.SetProcessNewStatus(processInstance, ProcessStatus.Idled);
                    throw new Exception(string.Format("Error Timer Complete Workflow Id={0}", processInstance.ProcessId), exception);
                }
            }
        }
Example #5
0
 private void PreExecute(Guid processId, string fromActivityName, bool ignoreCurrentStateCheck, ProcessInstance processInstance)
 {
     this.PersistenceProvider.FillPersistedProcessParameters(processInstance);
     ActivityDefinition activityDefinition = processInstance.ProcessScheme.FindActivity(processInstance.CurrentActivityName);
     ActivityDefinition to = processInstance.ProcessScheme.FindActivity(fromActivityName);
     if (!ignoreCurrentStateCheck && activityDefinition.State != to.State)
     {
         return;
     }
     ActivityExecutor activityExecutor = new ActivityExecutor(this, true);
     processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterProcessId, processId));
     processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterSchemeId, processInstance.SchemeId));
     processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterIsPreExecution, true));
     WorkflowRuntime.PreExecutionContext preExecutionContext = new WorkflowRuntime.PreExecutionContext();
     do
     {
         if (!string.IsNullOrEmpty(to.State))
         {
             processInstance.AddParameter(ParameterDefinition.Create(DefaultDefinitions.ParameterCurrentState, to.State));
         }
         IEnumerable<TransitionDefinition> transitionDefinitions = processInstance.ProcessScheme.GetPossibleTransitionsForActivity(to, ForkTransitionSearchType.NotFork).Where<TransitionDefinition>((TransitionDefinition t) =>
         {
             if (t.Classifier != TransitionClassifier.Direct)
             {
                 return false;
             }
             return t.Trigger.Type != TriggerType.Timer;
         });
         to = null;
         List<TransitionDefinition> list = (
             from t in transitionDefinitions
             where t.Trigger.Type == TriggerType.Auto
             select t).ToList<TransitionDefinition>();
         List<TransitionDefinition> list1 = (
             from t in transitionDefinitions
             where t.Trigger.Type == TriggerType.Command
             select t).ToList<TransitionDefinition>();
         List<ExecutionRequestParameters> executionRequestParameters = this.FillExecutionRequestParameters(processId, processInstance, list, preExecutionContext, list1);
         if (executionRequestParameters.Count > 0)
         {
             ExecutionResponseParameters executionResponseParameter = activityExecutor.Execute(executionRequestParameters);
             if (!this.PreExecuteProcessResponse(executionResponseParameter))
             {
                 to = processInstance.ProcessScheme.FindTransition(executionResponseParameter.ExecutedTransitionName).To;
             }
         }
         if (to != null)
         {
             continue;
         }
         if (list1.Count<TransitionDefinition>((TransitionDefinition t) =>
         {
             if (!t.IsAlwaysTransition)
             {
                 return false;
             }
             return !t.Conditions.First<ConditionDefinition>().ResultOnPreExecution.HasValue;
         }) >= 2)
         {
             continue;
         }
         executionRequestParameters = this.FillExecutionRequestParameters(processId, processInstance, list1, preExecutionContext, null);
         if (executionRequestParameters.Count <= 0)
         {
             continue;
         }
         ExecutionResponseParameters executionResponseParameter1 = activityExecutor.Execute(executionRequestParameters);
         if (this.PreExecuteProcessResponse(executionResponseParameter1))
         {
             continue;
         }
         to = processInstance.ProcessScheme.FindTransition(executionResponseParameter1.ExecutedTransitionName).To;
     }
     while (to != null && !to.IsFinal);
 }