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