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