Exemplo n.º 1
0
        /// <summary>
        /// on_event_statement :
        ///    (ON EVENT key | EXPIRE AFTER delay) switch_state+
        ///     ;
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override object VisitOn_event_statement([NotNull] WorkflowParser.On_event_statementContext context)
        {
            List <(string, ResultRuleConfig)> resultActions = new List <(string, ResultRuleConfig)>();
            Func <RunContext, bool>           whenRule      = null;
            string whenRuleText = string.Empty;
            var    key          = context.key();

            IncomingEventConfig incomingEvent = new IncomingEventConfig();

            if (key != null)
            {
                incomingEvent.Name = (string)VisitKey(key);
            }

            if (context.EXPIRE() != null)
            {
                incomingEvent.Name = Constants.Events.ExpiredEventName;
                int delay = (int)VisitDelay(context.delay());
                whenRule = (ctx) =>
                {
                    var i = ctx.IncomingEvent.ExtendedDatas()["CurrentState"];
                    if (i.GetValue == null)
                    {
                        return(false);
                    }
                    var j = i.GetValue(ctx)?.ToString();
                    return(ctx.Workflow.CurrentState == j);
                };
                whenRuleText = $"@IncomingEvent.CurrentState == @Workflow.CurrentState";

                AddExpirationActions(resultActions, delay);
            }

            InsertTransitions(context, whenRule, incomingEvent, whenRuleText);

            return(incomingEvent, resultActions);
        }
Exemplo n.º 2
0
        private void InsertTransitions(WorkflowParser.On_event_statementContext context, Func <RunContext, bool> whenRule, IncomingEventConfig incomingEvent, string ruleText)
        {
            var switchs = context.switch_state();

            foreach (var item in switchs)
            {
                var s = (TransitionConfig)VisitSwitch_state(item);
                if (whenRule != null)
                {
                    if (s.WhenRule == null)
                    {
                        s.WhenRule     = whenRule;
                        s.WhenRuleText = ruleText;
                    }
                    else
                    {
                        var r = s.WhenRule;
                        s.WhenRule      = (ctx) => whenRule(ctx) && r(ctx);
                        s.WhenRuleText += " && " + ruleText;
                    }
                }
                incomingEvent.AddTransition(s);
            }
        }
 /// <summary>
 /// Visit a parse tree produced by <see cref="WorkflowParser.on_event_statement"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitOn_event_statement([NotNull] WorkflowParser.On_event_statementContext context)
 {
     return(VisitChildren(context));
 }
 /// <summary>
 /// on_event_statement :
 ///    (ON EVENT key | EXPIRE AFTER delay) switch_state+
 ///     ;
 /// </summary>
 /// <param name="context"></param>
 /// <returns></returns>
 public override object VisitOn_event_statement([NotNull] WorkflowParser.On_event_statementContext context)
 {
     return(base.VisitOn_event_statement(context));
 }