/// <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); }
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)); }