private string TryAddExecutionPointer(string pathId, BaseFlowNode flowNode, ICollection <MessageToken> outcomeValues = null)
        {
            ICollection <MessageToken> incoming = new List <MessageToken>();

            if (outcomeValues != null)
            {
                incoming = outcomeValues;
            }

            var instanceId = string.Empty;

            if (!TryAddInstance(flowNode, pathId, out instanceId))
            {
                var pointer = GetActiveExecutionPointer(pathId, instanceId);
                if (pointer != null)
                {
                    var e = new IncomingTokenAddedEvent(Guid.NewGuid().ToString(), AggregateId, Version + 1, pointer.ExecutionPathId, pointer.Id, JsonConvert.SerializeObject(incoming), DateTime.UtcNow);
                    Handle(e);
                    DomainEvents.Add(e);
                    return(pointer.Id);
                }
            }

            var id  = Guid.NewGuid().ToString();
            var evt = new ExecutionPointerAddedEvent(Guid.NewGuid().ToString(), AggregateId, Version + 1, id, pathId, instanceId, flowNode.EltId, JsonConvert.SerializeObject(incoming), DateTime.UtcNow);

            Handle(evt);
            DomainEvents.Add(evt);
            return(id);
        }
        private void Handle(IncomingTokenAddedEvent evt)
        {
            var pointer = GetExecutionPointer(evt.ExecutionPathId, evt.ExecutionPointerId);
            var tokens  = MessageToken.DeserializeLst(evt.SerializedToken);

            pointer.AddIncoming(tokens);
            Version        = evt.Version;
            UpdateDateTime = evt.CreateDateTime;
        }
        private void ConsumeMessage(ExecutionPath executionPath, MessageToken messageToken)
        {
            foreach (var pointer in executionPath.ActivePointers)
            {
                var nodeDef = GetDefinition(pointer.FlowNodeId) as BaseCatchEvent;
                if (nodeDef == null)
                {
                    continue;
                }

                if (nodeDef.EventDefinitions.Any(_ => _.IsSatisfied(this, messageToken)))
                {
                    var tokens = new List <MessageToken> {
                        messageToken
                    };
                    var evt = new IncomingTokenAddedEvent(Guid.NewGuid().ToString(), AggregateId, Version + 1, executionPath.Id, pointer.Id, JsonConvert.SerializeObject(tokens), DateTime.UtcNow);
                    Handle(evt);
                    DomainEvents.Add(evt);
                }
            }
        }