Urule開源版系列5——RuleSetParser解析過程

龍城飛將軍發表於2020-09-25

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

相關文章