예제 #1
0
        private ProcessInstance UpdateScheme(ProcessInstance processInstance, IDictionary<string, object> parameters = null)
        {
            ProcessDefinition processDefinition;
            ProcessDefinition processScheme;
            ProcessInstance processInstance1;
            string str;
            if (!processInstance.CurrentActivity.IsAutoSchemeUpdate || !processInstance.IsSchemeObsolete && !processInstance.IsDeterminingParametersChanged)
            {
                return processInstance;
            }
            List<SchemaWasChangedEventArgs> schemaWasChangedEventArgs = new List<SchemaWasChangedEventArgs>();
            bool flag = false;
            try
            {
                this.SetProcessNewStatus(processInstance, ProcessStatus.Running);
                ProcessInstancesTree processInstancesTree = this.GetProcessInstancesTree(processInstance);
                ProcessInstancesTree nodeById = processInstancesTree.GetNodeById(processInstance.ProcessId, true);
                if (parameters == null)
                {
                    NeedDeterminingParametersEventArgs needDeterminingParametersEventArg = new NeedDeterminingParametersEventArgs()
                    {
                        ProcessId = processInstance.RootProcessId
                    };
                    if (this.OnNeedDeterminingParameters != null)
                    {
                        this.OnNeedDeterminingParameters(this, needDeterminingParametersEventArg);
                    }
                    if (needDeterminingParametersEventArg.DeterminingParameters == null)
                    {
                        needDeterminingParametersEventArg.DeterminingParameters = new Dictionary<string, object>();
                    }
                    parameters = needDeterminingParametersEventArg.DeterminingParameters;
                }
                str = (string.IsNullOrEmpty(processInstance.ProcessScheme.RootSchemeCode) ? processInstance.ProcessScheme.Name : processInstance.ProcessScheme.RootSchemeCode);
                ProcessDefinition processDefinition1 = this.Builder.CreateNewProcessScheme(str, parameters);
                if (processInstance.IsSubprocess)
                {
                    string name = nodeById.Name;
                    TransitionDefinition transitionDefinition = null;
                    try
                    {
                        transitionDefinition = processDefinition1.FindTransition(name);
                    }
                    catch (TransitionNotFoundException transitionNotFoundException)
                    {
                    }
                    ProcessInstance processInstance2 = this.Builder.GetProcessInstance(processInstancesTree.Root.Id);
                    processScheme = processInstance2.ProcessScheme;
                    if (transitionDefinition == null)
                    {
                        if (this.OnStartingTransitionNotFound == null)
                        {
                            this.DropProcesses(new List<Guid>()
							{
								processInstance.ProcessId
							}, processInstancesTree);
                            this.SaveProcessInstancesTree(processInstancesTree);
                            flag = true;
                            processInstance1 = null;
                            return processInstance1;
                        }
                        else
                        {
                            StartingTransitionNotFoundEventArgs startingTransitionNotFoundEventArg = new StartingTransitionNotFoundEventArgs(processInstance.ProcessId, processInstancesTree.Root.Id, processScheme, processDefinition1, name);
                            this.OnStartingTransitionNotFound(this, startingTransitionNotFoundEventArg);
                            if (startingTransitionNotFoundEventArg.Decision == StartingTransitionNotFoundEventArgs.SubprocessUpdateDecision.DropProcess)
                            {
                                this.DropProcesses(new List<Guid>()
								{
									processInstance.ProcessId
								}, processInstancesTree);
                                this.SaveProcessInstancesTree(processInstancesTree);
                                flag = true;
                                processInstance1 = null;
                                return processInstance1;
                            }
                            else if (startingTransitionNotFoundEventArg.Decision == StartingTransitionNotFoundEventArgs.SubprocessUpdateDecision.Ignore)
                            {
                                processInstance1 = processInstance;
                                return processInstance1;
                            }
                            else if (startingTransitionNotFoundEventArg.Decision == StartingTransitionNotFoundEventArgs.SubprocessUpdateDecision.StartWithNewTransition)
                            {
                                transitionDefinition = processDefinition1.FindTransition(startingTransitionNotFoundEventArg.NewTransitionName);
                            }
                        }
                    }
                    processDefinition = this.Builder.CreateNewSubprocessScheme(processDefinition1, transitionDefinition);
                }
                else
                {
                    processScheme = processInstance.ProcessScheme;
                    processDefinition = processDefinition1;
                }
                this.BindProcessToNewScheme(processInstance, processDefinition, schemaWasChangedEventArgs);
                this.UpdateChildrenSchemes(nodeById, processScheme, processDefinition1, schemaWasChangedEventArgs);
                this.SaveProcessInstancesTree(nodeById);
                if (this.OnSchemaWasChanged != null)
                {
                    foreach (SchemaWasChangedEventArgs schemaWasChangedEventArg in schemaWasChangedEventArgs)
                    {
                        this.OnSchemaWasChanged(this, schemaWasChangedEventArg);
                    }
                }
                this.PersistenceProvider.FillProcessParameters(processInstance);
                return processInstance;
            }
            finally
            {
                if (!flag)
                {
                    this.SetIdledStatusAfterSchemaUpdated(processInstance);
                }
            }
            return processInstance1;
        }
예제 #2
0
        private void UpdateChildrenSchemes(ProcessInstancesTree currentNode, ProcessDefinition oldRootScheme, ProcessDefinition newRootScheme, List<SchemaWasChangedEventArgs> changes)
        {
            if (!currentNode.Children.Any<ProcessInstancesTree>())
            {
                return;
            }
            foreach (ProcessInstancesTree child in currentNode.Children)
            {
                ProcessInstance processInstance = this.Builder.GetProcessInstance(child.Id);
                bool flag = false;
                try
                {
                    this.SetProcessNewStatus(processInstance, ProcessStatus.Running);
                    this.PersistenceProvider.FillSystemProcessParameters(processInstance);
                    if (processInstance.CurrentActivity.IsAutoSchemeUpdate)
                    {
                        TransitionDefinition transitionDefinition = null;
                        try
                        {
                            transitionDefinition = newRootScheme.FindTransition(child.Name);
                        }
                        catch (TransitionNotFoundException transitionNotFoundException)
                        {
                        }
                        if (transitionDefinition != null)
                        {
                            ProcessDefinition processDefinition = this.Builder.CreateNewSubprocessScheme(newRootScheme, transitionDefinition);
                            this.BindProcessToNewScheme(processInstance, processDefinition, changes);
                        }
                        else if (this.OnStartingTransitionNotFound == null)
                        {
                            this.DropProcesses(new List<Guid>()
							{
								processInstance.ProcessId
							}, currentNode);
                            flag = true;
                            continue;
                        }
                        else
                        {
                            StartingTransitionNotFoundEventArgs startingTransitionNotFoundEventArg = new StartingTransitionNotFoundEventArgs(processInstance.ProcessId, processInstance.RootProcessId, oldRootScheme, newRootScheme, child.Name);
                            this.OnStartingTransitionNotFound(this, startingTransitionNotFoundEventArg);
                            if (startingTransitionNotFoundEventArg.Decision == StartingTransitionNotFoundEventArgs.SubprocessUpdateDecision.DropProcess)
                            {
                                this.DropProcesses(new List<Guid>()
								{
									processInstance.ProcessId
								}, currentNode);
                                flag = true;
                                continue;
                            }
                            else if (startingTransitionNotFoundEventArg.Decision == StartingTransitionNotFoundEventArgs.SubprocessUpdateDecision.Ignore)
                            {
                                continue;
                            }
                            else if (startingTransitionNotFoundEventArg.Decision == StartingTransitionNotFoundEventArgs.SubprocessUpdateDecision.StartWithNewTransition)
                            {
                                transitionDefinition = newRootScheme.FindTransition(startingTransitionNotFoundEventArg.NewTransitionName);
                                ProcessDefinition processDefinition1 = this.Builder.CreateNewSubprocessScheme(newRootScheme, transitionDefinition);
                                this.BindProcessToNewScheme(processInstance, processDefinition1, changes);
                            }
                        }
                    }
                    this.UpdateChildrenSchemes(child, oldRootScheme, newRootScheme, changes);
                }
                finally
                {
                    if (!flag)
                    {
                        this.SetIdledStatusAfterSchemaUpdated(processInstance);
                    }
                }
            }
        }