Fork me on GitHub

Urule开源版系列5——RuleSetParser解析过程

接上期Urule开源版系列4——Core包核心接口之规则解析过程

之前源码到了Parser,这期详细解析下RuleSetParser的解析过程

1.主流程

  1. 特殊处理一个属性
  2. 循环处理元素
  3. 当元素名称是规则时,调用ruleParser
  4. 当元素名称是循环规则时,调用loopRuleParser
  5. 当元素名称时import-variable-library时,添加变量库
  6. 当元素名称时import-constant-library时,添加常数库
  7. 当元素名称时import-action-library时,添加动作数库
  8. 当元素名称时import-parameter-library时,添加参数库
  9. 当元素名称时remark时,设置备注信息
  10. 调用RulesRebuilder.rebuildRules 重构所有的规则
    上面的流程意味着如果要增加一类库文件,RuleSetParser必需配合进行修改。

1.1 RuleParser.parse

这个方法其实没有任何逻辑,处理逻辑直接交给了抽象类的方法-parseRule

1.2 AbstractRuleParser.parseRule

这个方法有点长,大概有60行左右,但逻辑就是两大段

  1. 处理属性,处理各个属性赋值给Rule对象实例
  2. 循环处理if then else 分布交给对应的parse去处理

1.2.1 LhsParser.parse

双重遍历,外层迭代元素,内层迭代处理器,总共有三个处理器可选:JunctionParser(and or ) , NamedJunctionParser(),CriteriaParser(atom 原子条件)

JunctionParser NamedJunctionParser CriteriaParser
名称 条件处理器 原子条件处理器
符号 and or named-atom atom op="In"

注意:属性op即表达了操作符,in , > < = 等逻辑
接下来分别调用三个parse方法分别处理

criterionParsers=applicationContext.getBeansOfType(CriterionParser.class).values();
1.2.1.1 JunctionParser.parse 为例
  1. 递归调用CriterionParser.parseCriterion 方法,处理元素递归解析
  2. 处理and or 问题
1.2.1.2 CriterionParser.parseCriterion

递归核心,部分逻辑同LhsParser.parse , 递归element子元素,调用CriterionParser 接口去解析,再度回归

for(Object obj:element.elements()){
    for(CriterionParser parser:criterionParsers){
        if(parser.support(name)){
            Criterion criterion=parser.parse(ele);
        }
    }
}
1.2.1.3 CriteriaParser.parse

到了这个解析器,意味着递归到了结束,下面不再需要递归的子元素,分别处理left , value两个标签,获取到比较的数据对象。这里不在单独解析LeftParser 和 ValueParser 的处理逻辑。

<atom op="In">
    <left var-category="姓名" var="properties" var-label="属性" datatype="List" type="variable"></left>
    <value content="a,b" type="Input"></value>
</atom>

1.2.2 RhsParser.parse

与LhsParser不同的时,Rhs解析的是动作,所以注入的解析器从 CriterionParser 变成了 ActionParser

actionParsers=context.getBeansOfType(ActionParser.class).values();

ActionParser有4个实现类

CommonFunctionActionParser ConsolePrintActionParser ExecuteMethodActionParser VariableAssignActionParser
名称 函数动作 控制台 方法 变量赋值
标记 execute-function console-print execute-method var-assign
ActionParser不需要处理递归问题

1.2.3 OtherParser.parse

逻辑同RhsParser

总结

xml解析到规则对象的流程基本完成,下一步重点整理rebuildRule流程,应该会是大量调用antlr的部分了。

posted @ 2020-09-25 18:40  龙城飞将军  阅读(963)  评论(0编辑  收藏  举报