/// <summary> /// Executes the chain of routing rules specified in 'input.Rules'. /// </summary> /// <param name="pipeline">Chain of routing rules.</param> /// <returns>List of Tasks which should be scheduled.</returns> internal static List <Type> GetRoutingTasks(RoutingRulesPipeline pipeline) { List <Type> ruleTypes = new List <Type>(); foreach (var rule in pipeline.Rules) { if (rule.RoutingRule == null) { rule.RoutingRule = Factory.GetRule(rule.RuleQName) as RoutingRule; } if (rule.RoutingRule.CanExecute(pipeline.EntityInstance)) { ruleTypes.AddRange(rule.RoutingRule.GetNextTasks(pipeline.EntityInstance)); } } return(ruleTypes); }
/// <summary> /// Schedules list of defined routed tasks calculated from list of specified routing rules. /// </summary> /// <param name="rulesPipeline"></param> /// <returns></returns> public Task <RoutingRuleResult>[] ScheduleRoutedTasks(TaskInput taskArgument, RoutingRulesPipeline rulesPipeline) { List <Task <RoutingRuleResult> > tasks = new List <Task <RoutingRuleResult> >(); if (rulesPipeline == null || rulesPipeline.Rules == null) { return(tasks.ToArray()); } // We set the instance which will be checked by rule. // Not every rule can process every instance. rulesPipeline.EntityInstance = taskArgument; var routingTasks = RulesManager.GetRoutingTasks(rulesPipeline); foreach (var routingTaskType in routingTasks) { tasks.Add(m_Context.ScheduleTask <RoutingRuleResult>(routingTaskType, taskArgument)); } return(tasks.ToArray()); }