接上期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的部分了。

Urule开源版系列5——RuleSetParser解析过程的更多相关文章

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

    Urule运行规则文件,是如何进行的,通过一个请求doTest来探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  6. PureMVC(JS版)源码解析:总结

    PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...

  7. PureMVC(JS版)源码解析

    PureMVC(JS版)源码解析:总结   PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写 ...

  8. FineUI(开源版)v6.0中FState服务器端验证的实现原理

    前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...

  9. dig理解DNS的解析过程 - 阿权的书房

    关于DNS的常识,可以阅读附录的一些参考资料.本文旨在尝试举例用dig命令理解这个过程,并非权威知识,仅供参考.测试域名为阿权的书房的域名 www.aslibra.com 和 www.163.com. ...

随机推荐

  1. Better Key Sizes (and Attacks) for LWE-Based Encryption

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文 Abstract 基于“learning with errors”(LWE)问题,分析了理 ...

  2. Java面试题(Spring Boot/Spring Cloud篇)

    Spring Boot/Spring Cloud 104.什么是 spring boot? SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring ...

  3. ZERO:从搜索用户来看SEO

    http://www.wocaoseo.com/thread-63-1-1.html SEO是个奇怪的东西,一方面因为SEO流量往往占到网站流量几十个百分点,而且看上去它是免费的,因此许多人认为SEO ...

  4. 从String类型发散想到的一些东西

    值类型 引用类型 值类型表示存储在栈上的类型,包括简单类型(int.long.double.short).枚举.struct定义: 引用类型表示存在堆上的类型,包括数组.接口.委托.class定义: ...

  5. opencv 截图并保存

    opencv 截图并保存(转载) 代码功能:选择图像中矩形区,按S键截图并保存,Q键退出. #include<opencv2/opencv.hpp> #include<iostrea ...

  6. python123期末四题编程题 -无空隙回声输出-文件关键行数-字典翻转输出-《沉默的羔羊》之最多单词

    1. 无空隙回声输出 描述 获得用户输入,去掉其中全部空格,将其他字符按收入顺序打印输出. ‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬ ...

  7. php利用快递100接口获取物流信息

    PHP使用CURL调用快递100接口查询运单信息 类代码如下: <?php/** * 快递100接口调用类 * @author 齐云海 * date: 2019/05/29 */ class E ...

  8. Application.LoadLevel

    Unity在场景切换之间清理下内存 http://www.cnblogs.com/dongz888/p/4920714.html

  9. 令人蛋疼的错误提示 0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab

    原文地址:http://www.cnblogs.com/pcchinadreamfly/archive/2012/04/26/2471317.html参考地址:http://blog.csdn.net ...

  10. 最详细不过的CUDA的下载安装使用、环境变量配置,有这一篇就够了

    在上一期中,我们介绍了为什么使用GPU可以加速计算和处理图像,以及查看自己的电脑能否使用GPU加速,不知道的可以去看上一期文章,这期我们正式的来下载与安装GPU加速工具CUDA,并检查是否安装成功. ...