Urule开源版系列5——RuleSetParser解析过程
接上期Urule开源版系列4——Core包核心接口之规则解析过程
之前源码到了Parser,这期详细解析下RuleSetParser的解析过程
1.主流程
- 特殊处理一个属性
- 循环处理元素
- 当元素名称是规则时,调用ruleParser
- 当元素名称是循环规则时,调用loopRuleParser
- 当元素名称时import-variable-library时,添加变量库
- 当元素名称时import-constant-library时,添加常数库
- 当元素名称时import-action-library时,添加动作数库
- 当元素名称时import-parameter-library时,添加参数库
- 当元素名称时remark时,设置备注信息
- 调用RulesRebuilder.rebuildRules 重构所有的规则
上面的流程意味着如果要增加一类库文件,RuleSetParser必需配合进行修改。
1.1 RuleParser.parse
这个方法其实没有任何逻辑,处理逻辑直接交给了抽象类的方法-parseRule
1.2 AbstractRuleParser.parseRule
这个方法有点长,大概有60行左右,但逻辑就是两大段
- 处理属性,处理各个属性赋值给Rule对象实例
- 循环处理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 为例
- 递归调用CriterionParser.parseCriterion 方法,处理元素递归解析
- 处理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解析过程的更多相关文章
- Urule开源版系列4——Core包核心接口之规则解析过程
Urule运行规则文件,是如何进行的,通过一个请求doTest来探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- PureMVC(JS版)源码解析:总结
PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...
- PureMVC(JS版)源码解析
PureMVC(JS版)源码解析:总结 PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写 ...
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
- dig理解DNS的解析过程 - 阿权的书房
关于DNS的常识,可以阅读附录的一些参考资料.本文旨在尝试举例用dig命令理解这个过程,并非权威知识,仅供参考.测试域名为阿权的书房的域名 www.aslibra.com 和 www.163.com. ...
随机推荐
- 如何快速系统学会使用SPSS?
SPSS是一款数据统计与数据分析工具,操作简单属于数据分析的入门工具. 想要灵活使用SPSS,需要掌握两个方面内容:数据分析相关知识.SPSS操作 1 数据分析 在使用数据分析工具之前,首先要了解数据 ...
- Java动态代理(二)——jdk动态代理
一.什么是动态代理?代理类在程序运行时创建的代理方式被成为动态代理.动态代理的代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的.相比于静态代理, 动态代理的 ...
- Oracle数据库教程-数据定义语言(表操作)
创建表 建表语法: CREATE TABLE 表名 ( 列1 数据类型 [primary key], 列2 数据类型 default 默认值 [not null], …, constraint 约束名 ...
- HP Probook 4230s 更换 CPU 过程
HP Probook 4230s 更换 CPU 过程 原来使用的 CPU 是 i5-2540M 更换为 i7-2760QM 1.松开 硬盘线 硬盘线插头上有一片黑色的胶片,可以用来拔起插头 硬盘 ...
- CF1349A Orac and LCM 题解
题意分析 给出$n$个数,求这$n$个数两两的最小公倍数的最大公约数 思路分析 通过分析样例可以发现,如果要成为这$n$个数两两的最小公倍数的公约数,至少要是这$n$个数中$n-1$个数的约数,否则就 ...
- python3+pyqt5+opencv3简单使用
python3+pyqt5+opencv3简单使用(转载) 关于python3下搭建pyqt5(pycharm)参考这条链接. 对于pyqt的使用个人比较建议ui设计与逻辑功能分开开发. 下面介绍下简 ...
- 注册github时总卡在第一步无法验证的解决办法
从github官网可以看出问题所在,所以造成这一问题的极大可能就是浏览器的问题. 最简单的方法就是换手机浏览器进行注册
- 通过WordCount解析Spark RDD内部源码机制
一.Spark WordCount动手实践 我们通过Spark WordCount动手实践,编写单词计数代码:在wordcount.scala的基础上,从数据流动的视角深入分析Spark RDD的数据 ...
- Codeforces 1321D Navigation System
题意 有个人要从\(s\)走到\(t\),经过的路径给定.导航系统每次会显示当前节点到\(t\)的最短路,有多条就显示其中之一.这个人如果按照导航走,那么啥都没变.如果没有按导航走导航就会重新导航.问 ...
- Jwt快速入门(copy即可)
Jwt 什么是jwt JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法. 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和 ...