Example #1
0
        private async Task <bool> Execute(BPMNExecutionContext context, CancellationToken token)
        {
            var pointer = context.Pointer;
            var nodeDef = context.Instance.GetDefinition(pointer.FlowNodeId);
            var res     = await _processorFactory.Execute(context, nodeDef, token);

            var result      = res as BPMNExecutionResult;
            var isRestarted = result.IsRestarted;

            if (result.IsNext)
            {
                var ids = context.Instance.CompleteExecutionPointer(pointer, result.NextFlowNodeIds, result.Tokens.ToList());
                if (result.IsEltInstanceCompleted)
                {
                    context.Instance.CompleteFlowNodeInstance(pointer.InstanceFlowNodeId);
                }

                if (result.IsNewExecutionPointerRequired)
                {
                    context.Instance.LaunchNewExecutionPointer(pointer);
                }

                foreach (var id in ids)
                {
                    var executionPointer    = context.Instance.GetExecutionPointer(pointer.ExecutionPathId, id);
                    var newExecutionContext = context.New(executionPointer);
                    var secondResult        = await Execute(newExecutionContext, token);

                    isRestarted = isRestarted || secondResult;
                }
            }

            return(isRestarted);
        }
        private async Task Execute(BPMNExecutionContext context, CancellationToken token)
        {
            var pointer = context.Pointer;
            var nodeDef = context.Instance.GetDefinition(pointer.FlowNodeId);
            var result  = (await _processorFactory.Execute(context, nodeDef, token)) as BPMNExecutionResult;

            if (result.IsNext)
            {
                var ids = context.Instance.CompleteExecutionPointer(pointer, result.NextFlowNodeIds, result.Tokens);
                if (result.IsEltInstanceCompleted)
                {
                    context.Instance.CompleteFlowNodeInstance(pointer.InstanceFlowNodeId);
                }

                if (result.IsNewExecutionPointerRequired)
                {
                    context.Instance.LaunchNewExecutionPointer(pointer);
                }

                foreach (var id in ids)
                {
                    var executionPointer    = context.Instance.GetExecutionPointer(pointer.ExecutionPathId, id);
                    var newExecutionContext = context.New(executionPointer);
                    await Execute(newExecutionContext, token);
                }
            }
        }
Example #3
0
        public async Task Execute(CasePlanInstanceAggregate casePlanInstance, CancellationToken cancellationToken)
        {
            var terminateSub = await _subscriberRepository.TrySubscribe(casePlanInstance.AggregateId, CMMNConstants.ExternalTransitionNames.Terminate, cancellationToken);

            if (casePlanInstance.State == null)
            {
                casePlanInstance.MakeTransition(CMMNTransitions.Create);
            }

            if (casePlanInstance.State == CaseStates.Active)
            {
                var executionContext = new CMMNExecutionContext {
                    Instance = casePlanInstance
                };
                foreach (var fileItem in casePlanInstance.FileItems)
                {
                    await _processorFactory.Execute(executionContext, fileItem, cancellationToken);
                }

                await _processorFactory.Execute(executionContext, casePlanInstance.StageContent, cancellationToken);

                if (casePlanInstance.StageContent.State == TaskStageStates.Completed)
                {
                    casePlanInstance.MakeTransition(CMMNTransitions.Complete, false);
                    return;
                }

                if (casePlanInstance.StageContent.State == TaskStageStates.Terminated)
                {
                    casePlanInstance.MakeTransition(CMMNTransitions.Terminate, false);
                    return;
                }

                if (terminateSub.IsCaptured)
                {
                    await _subscriberRepository.TryReset(casePlanInstance.AggregateId, null, CMMNConstants.ExternalTransitionNames.Terminate, cancellationToken);

                    casePlanInstance.MakeTransition(CMMNTransitions.Terminate);
                }
            }
        }
        private async Task ExecuteNode(CMMNExecutionContext executionContext, BaseCasePlanItemInstance node, CancellationToken token)
        {
            await _processorFactory.Execute(executionContext, node, token);

            var domainEvts = executionContext.Instance.DomainEvents.Where((evt) =>
            {
                var r = evt as CaseElementTransitionRaisedEvent;
                if (r == null)
                {
                    return(false);
                }

                return(r.ElementId == node.Id);
            }).Cast <CaseElementTransitionRaisedEvent>()
                             .Select(_ => new IncomingTransition(_.Transition, _.IncomingTokens)).ToList();
            var nextNodes = executionContext.Instance.GetNextCasePlanItems(node);

            foreach (var nextNode in nextNodes)
            {
                executionContext.Instance.ConsumeTransitionEvts(nextNode, node.Id, domainEvts);
                await ExecuteNode(executionContext, nextNode, token);
            }
        }
Example #5
0
 private async Task HandleCasePlan(CMMNExecutionContext executionContext, BaseCasePlanItemInstance casePlanElementInstance, CancellationToken token)
 {
     await _processorFactory.Execute(executionContext, casePlanElementInstance, casePlanElementInstance.GetType(), token);
 }