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; }
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); } } } }