public void SaveStartEventNameAtTheFirstHistoryEntry() { var model = ProcessModel.Create() .AddEventCatcher( "start", CatchAnyEventCatcher.Create() ) .AddEventCatcher( "middle", CatchAnyEventCatcher.Create() ) .AddEventThrower( "end", SilentEventThrower.Instance ) .AddSequenceFlow("start", "middle") .AddSequenceFlow("middle", "end"); var instance = ProcessInstance.Create(Guid.Parse(model.Id)); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent( context, new object() ); instance.History.First().ExecutionPoint.Should().Be("start"); }
public void FinishWhenMeetingTheEnd() { var model = ProcessModel.Create() .AddEventCatcher( "start", CatchAnyEventCatcher.Create() ) .AddEventCatcher( "middle", CatchAnyEventCatcher.Create() ) .AddEventThrower( "end", SilentEventThrower.Instance ) .AddSequenceFlow("start", "middle") .AddSequenceFlow("middle", "end"); var instance = ProcessInstance.Create(model.Id); var context = new ExecutionContext(null, model, instance, instance.Token, null); // start instance.HandleEvent( context, new object() ).Should().BeEquivalentTo(instance.Token); // middle instance.HandleEvent( context, new object() ).Should().BeEmpty(); instance.IsRunning.Should().BeFalse(); instance.IsDone.Should().BeTrue(); }
public void ReturnTwoTokensWhenStartEventHaveTwoOutcomingConnections() { var model = ProcessModel.Create() .AddEventCatcher( "start", CatchAnyEventCatcher.Create() ) .AddEventCatcher( "middle1", CatchAnyEventCatcher.Create() ) .AddEventCatcher( "middle2", CatchAnyEventCatcher.Create() ) .AddEventThrower( "end", SilentEventThrower.Instance ) .AddSequenceFlow("start", "middle1") .AddSequenceFlow("start", "middle2") .AddSequenceFlow("middle1", "end") .AddSequenceFlow("middle2", "end"); var instance = ProcessInstance.Create(model.Id); var context = new ExecutionContext(null, model, instance, instance.Token, null); var tokens = instance.HandleEvent(context, new object()); tokens.Count().Should().Be(2); tokens.Select(token => token.ExecutionPoint) .Should().BeEquivalentTo("middle1", "middle2"); }
//根据公文射频流程实例processId创建其实例,该实例包括了审批流程的公文流转审批流程ProcessDefinition /// <summary> /// 根据公文射频流程实例processId创建其实例,该实例包括了审批流程的公文流转审批流程ProcessDefinition /// </summary> /// <param name="processId"></param> /// <param name="processName"></param> /// <param name="parameters"></param> /// <returns></returns> public ProcessInstance CreateNewProcess(Guid processId, string processName, IDictionary <string, IEnumerable <object> > parameters) { SchemeDefinition <TSchemeMedium> schemeDefinition = null; try { //根据参数和处理实例类别processName,构建工作流处理实例定义 schemeDefinition = SchemePersistenceProvider.GetProcessSchemeWithParameters(processName, parameters, true); } catch (SchemeNotFoundException) { //创建新的流程,如没有《建设项目选址意见书》这个流程 var schemeId = Guid.NewGuid(); var newScheme = Generator.Generate(processName, schemeId, parameters); try { SchemePersistenceProvider.SaveScheme(processName, schemeId, newScheme, parameters); schemeDefinition = new SchemeDefinition <TSchemeMedium>(schemeId, newScheme, false, false); } catch (SchemeAlredyExistsException) { schemeDefinition = SchemePersistenceProvider.GetProcessSchemeWithParameters(processName, parameters, true); } } return(ProcessInstance.Create(schemeDefinition.Id, processId, GetProcessDefinition(schemeDefinition), schemeDefinition.IsObsolete, schemeDefinition.IsDeterminingParametersChanged)); }
public void BeRunningAfterHandlingValidStartEvent() { var model = ProcessModel.Create() .AddEventCatcher( "start", CatchAnyEventCatcher.Create() ) .AddEventCatcher( "middle", CatchAnyEventCatcher.Create() ) .AddEventThrower( "end", SilentEventThrower.Instance ) .AddSequenceFlow("start", "middle", "end"); var instance = ProcessInstance.Create(Guid.Parse(model.Id)); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent( context, new object() ); instance.IsRunning.Should().BeTrue(); instance.Token.ExecutionPoint.Should().Be("middle"); }
public void UpdateTheDataInputCurrentValue() { var output = new DataOutput("a"); var element1 = new NullElement(); element1.Outputs.Add(output); var input = new DataInput("a"); var element2 = new NullElement(); element2.Inputs.Add(input); var model = ProcessModel.Create() .AddNullElement("element1", element1) .AddNullElement("element2", element2) .AddDataAssociation("assoc", DataAssociation.Create("element1", "a", "element2", "a")); var models = new InMemoryProcessModelsStore(); models.Store(model); var manager = new ProcessManager( models, new InMemoryProcessInstancesStore() ); var instance = ProcessInstance.Create(model); manager.Attach(instance); var context = new ExecutionContext(manager, model, instance, instance.Token, null); output.Update(context, "element1", "Hello World"); input.GetCurrentValue(context, "element2").Should().Be("Hello World"); }
public IEnumerable <HandleResult> HandleEvent(object e) { var models = ModelsStore.GetAll() .Where(model => { var context = new ExecutionContext(this, model, null, null, null); return(model.CanStartWith(context, e)); }); var result = new List <HandleResult>(); foreach (var model in models) { var instance = ProcessInstance.Create(Guid.Parse(model.Id)); var context = new ExecutionContext(this, model, instance, instance.Token, null); var tokens = instance.HandleEvent(context, e); result.Add(new HandleResult( Guid.Parse(model.Id), Guid.Parse(instance.Id), tokens.Select(token => token.Id).ToList() )); // TODO: It can be late? InstancesStore.Store(instance); } return(result); }
public ProcessInstance GetProcessInstance(Guid processId) { var schemeDefinition = SchemePersistenceProvider.GetProcessSchemeByProcessId(processId); return(ProcessInstance.Create(schemeDefinition.Id, processId, GetProcessDefinition(schemeDefinition), schemeDefinition.IsObsolete, schemeDefinition.IsDeterminingParametersChanged)); }
/// <summary> /// 根据ProcessInstance的ID从数据库获取ProcessInstance实例 /// </summary> /// <param name="processId"></param> /// <returns></returns> public ProcessInstance GetProcessInstance(Guid processId) { //根据ProcessInstance实例processId获取该实例基于的ProcessScheme的审批流程方案ProcessScheme,ProcessScheme是可以基于 //WorkflowScheme模板派生出多种变化 var schemeDefinition = SchemePersistenceProvider.GetProcessSchemeByProcessId(processId); return(ProcessInstance.Create(schemeDefinition.Id, processId, GetProcessDefinition(schemeDefinition), schemeDefinition.IsObsolete, schemeDefinition.IsDeterminingParametersChanged)); }
public void CreateWithSingleActivity() { var passed = false; var model = ProcessModel.CreateWithSingleActivity( LambdaActivity.Create(() => passed = true) ); var instance = ProcessInstance.Create(model); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent(context, new object()); passed.Should().BeTrue(); }
public void TokenShouldNotBeActiveWhenProcessIsDone() { var model = ProcessModel.Create() .AddEventCatcher("start", CatchAnyEventCatcher.Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "end"); var instance = ProcessInstance.Create(model.Id); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent(context, new object()); instance.Token.WasReleased.Should().BeTrue(); instance.Token.IsActive.Should().BeFalse(); }
public void BasicSetup() { var passed = false; var model = ProcessModel.Create() .AddEventCatcher("start", CatchAnyEventCatcher.Create()) .AddActivity("activity", LambdaActivity.Create(() => passed = true)) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "activity", "end"); var instance = ProcessInstance.Create(model.Id); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent(context, new object()); passed.Should().BeTrue(); }
public void ThrowArgumentExceptionWhenTryingToAttachInstanceWithUnrecognizedModel() { var model = ProcessModel.Create() .AddAnyEventCatcher("start") .AddEventThrower("end"); var manager = new ProcessManager( new InMemoryProcessModelsStore(), new InMemoryProcessInstancesStore() ); var instance = ProcessInstance.Create(model); Action sut = () => manager.Attach(instance); sut.Should().Throw <ArgumentException>(); }
public void RefuseEventsWhenItIsDone() { var count = 0; var model = ProcessModel.Create() .AddEventCatcher("start", CatchAnyEventCatcher.Create()) .AddActivity("a1", LambdaActivity.Create(() => count++)) .AddActivity("a2", LambdaActivity.Create(() => count++)) .AddActivity("a3", LambdaActivity.Create(() => count++)) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "a1", "a2", "a3", "end"); var instance = ProcessInstance.Create(model.Id); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent(context, new object()); instance.HandleEvent(context, new object()); count.Should().Be(3); }
public void RespectEventTypes() { var model = ProcessModel.Create() .AddEventCatcher("start", TypedEventCatcher <Start> .Create()) .AddEventCatcher("middle1", TypedEventCatcher <Middle1> .Create()) .AddEventCatcher("middle2", TypedEventCatcher <Middle2> .Create()) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "middle1", "middle2", "end"); var processInstance = ProcessInstance.Create(model.Id); // nothing happens var context = new ExecutionContext(null, model, processInstance, processInstance.Token, null); processInstance.HandleEvent(context, new object()); processInstance.Token.ExecutionPoint.Should().BeNull(); processInstance.HandleEvent(context, new Start()); processInstance.Token.ExecutionPoint.Should().Be("middle1"); processInstance.HandleEvent(context, new Start()); processInstance.Token.ExecutionPoint.Should().Be("middle1"); processInstance.HandleEvent(context, new Middle2()); processInstance.Token.ExecutionPoint.Should().Be("middle1"); processInstance.HandleEvent(context, new Middle1()); processInstance.Token.ExecutionPoint.Should().Be("middle2"); processInstance.HandleEvent(context, new Middle1()); processInstance.Token.ExecutionPoint.Should().Be("middle2"); processInstance.HandleEvent(context, new Middle2()); processInstance.Token.ExecutionPoint.Should().BeNull(); processInstance.HandleEvent(context, new Middle2()); processInstance.Token.ExecutionPoint.Should().BeNull(); processInstance.History.Count().Should().Be(4); processInstance.IsDone.Should().BeTrue(); processInstance.Token.WasReleased.Should().BeTrue(); }
public void ExecuteActivitiesBetweenEvents() { var count = 0; var model = ProcessModel.Create() .AddEventCatcher("start", CatchAnyEventCatcher.Create()) .AddActivity("a1", LambdaActivity.Create(() => count++)) .AddActivity("a2", LambdaActivity.Create(() => count++)) .AddActivity("a3", LambdaActivity.Create(() => count++)) .AddEventThrower("end", SilentEventThrower.Instance) .AddSequenceFlow("start", "a1", "a2", "a3", "end"); var instance = ProcessInstance.Create(model.Id); var context = new ExecutionContext(null, model, instance, instance.Token, null); instance.HandleEvent(context, new object()); instance.IsDone.Should().BeTrue(); instance.IsRunning.Should().BeFalse(); instance.History.Count().Should().Be(8); count.Should().Be(3); }
public void BeNotRunnuingBeforeHandlingValidStartEvent() { var instance = ProcessInstance.Create(Guid.NewGuid()); instance.IsRunning.Should().BeFalse(); }
public void HaveAToken() { var instance = ProcessInstance.Create(Guid.NewGuid()); instance.Token.Should().NotBeNull(); }