Пример #1
0
        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");
        }
Пример #2
0
        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();
        }
Пример #3
0
        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");
        }
Пример #4
0
        //根据公文射频流程实例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));
        }
Пример #5
0
        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");
        }
Пример #6
0
        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");
        }
Пример #7
0
        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);
        }
Пример #8
0
        public ProcessInstance GetProcessInstance(Guid processId)
        {
            var schemeDefinition = SchemePersistenceProvider.GetProcessSchemeByProcessId(processId);

            return(ProcessInstance.Create(schemeDefinition.Id,
                                          processId,
                                          GetProcessDefinition(schemeDefinition),
                                          schemeDefinition.IsObsolete, schemeDefinition.IsDeterminingParametersChanged));
        }
Пример #9
0
        /// <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));
        }
Пример #10
0
        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();
        }
Пример #11
0
        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();
        }
Пример #12
0
        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();
        }
Пример #13
0
        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>();
        }
Пример #14
0
        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);
        }
Пример #15
0
        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();
        }
Пример #16
0
        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);
        }
Пример #17
0
        public void BeNotRunnuingBeforeHandlingValidStartEvent()
        {
            var instance = ProcessInstance.Create(Guid.NewGuid());

            instance.IsRunning.Should().BeFalse();
        }
Пример #18
0
        public void HaveAToken()
        {
            var instance = ProcessInstance.Create(Guid.NewGuid());

            instance.Token.Should().NotBeNull();
        }