Rule定義の書き方と実行方法

こちらではRule定義の作成と実行方法について解説します。

Rule定義の作成

ルール定義はXML形式で、ルートタグ「rules」内に記述します。
  1. XMLを作成する
  2. ルートタグにrulesタグを記述し、使用する機能にあわせたXMLスキーマを読込む
    ※XMLスキーマの参照パスの間違いに注意してください
  3. ruleタグにて項目定義を記述する

   <?xml version="1.0" encoding="utf-8"?>
    <rules
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="./usax/resource/Rule.xsd"
     controller="jp.co.cam.usax.rule.bean.resource.impl.RuleResource"
     description="{定義内容の説明}">
      <rule id="sample"
       description="サンプルA">
        … 処理を定義
      </rule>
   </rules>
  
※ルールファイルは専用のxsdを使用することで簡単に定義することができます。

ルールの書き方

ruleタグを用いて処理を作成し、idにファイル内で一意となる任意の名前を付けてルールを管理します。
使用可能箇所
rules
Sub Tags
check, run, mapping

(記述例) 「sample」のルールを定義します。

   <rule id="sample"
    description="サンプル処理">
    <check>
      … 入力チェックを定義
    </check>
    <run>
      … 処理を定義
    </run>
   </rule>
  

サブBeanの参照

ルール・エンジンを取得・実行したDataBeanが保有するサブBeanを対象に処理を実行します。
※サブBeanから呼ばれたルール処理中にの親DataBeanを参照したい場合は、
 項目名の先頭に#を付けることで参照できます。 (記述例) サブBean「SUB_BEAN1」を参照して処理する。

   <rule id="sample" current="SUB_BEAN1"
    description="サンプル処理">
     … 省略
   </rule>
  

サブListの参照

ルール・エンジンを取得・実行したイベントが保有するサブListを対象に処理を行数分繰返します。 (記述例) サブリスト「SUB_LIST1」の件数分繰返し処理する。

   <rule id="sample" current="SUB_LIST1"
    description="サンプル処理">
     … 省略
   </rule>
  
(記述例) サブリスト「SUB_LIST1」の内、更新された件数分繰返し処理する。

   <rule id="sample" current="SUB_LIST1$UPDATED"
    description="サンプル処理">
     … 省略
   </rule>
  
※更新判定はDataBeanのisUpdate()にて判定されます。 ListBeanにおける更新判定 DataBeanはリクエスト・データの取込みなど(isLoading()がTrueの時)に、
そのDataBeanに格納されているデータが変更されると
更新ありの状態(isUpdate()がTrue)になります。

(注)サブBeanが更新状態になると親DataBeanも更新ありとなります。
$UPDATEDではこの更新ありのSubListBeanをリストアップしたものを参照します。 (記述例) サブリスト「SUB_LIST1」の内、削除された件数分繰返し処理する。

   <rule id="sample" current="SUB_LIST1$DELETED"
    description="サンプル処理">
     … 省略
   </rule>
  
ListBeanにおける削除判定 ListBeanは行削除メソッド「del(int)」にて削除されたSubListBeanを削除リストとして保管します。
$DELETEDではこの削除リストを参照します。

ルールの実行

Ruleファイルは、DataBeanと同じパッケージに同じ名前で保存することで、
RuleEngineFactoryを使用して取得できます。 (実装例) /example/SampleBean.ruleに記載されたルール「sample」を取得し実行する。

   // DataBean
   final DataBeanIF bean = new SampleBean();

   // ルール・エンジン
   final RuleEngineIF rule = RuleEngineFactory.create(bean, "sample");

   // 入力チェックの実行
   if (rule.check()) {
     // 処理の実行
     return rule.run();
   } else {
     return false;
   }
  
※入力チェックの実行によりエラーが発生した場合は、メソッドの戻り値にfalseが返り
 エラー・メッセージがDataBeanにセットされます。

Event処理クラスにおけるルールの取得

Event処理クラスはDataBeanでもあるため、上記の方法でルールを取得できますが、
AbstractBusinessModelComponentのサブクラスは、下記メソッド使い簡略化できます。

   // ルール・エンジン(自身のインスタンスを使ってRule定義を参照)
   final RuleEngineIF rule = super.getRuleEngine("sample");

   // 入力チェックの実行
   if (rule.check()) {
     // 処理の実行
     return rule.run();
   } else {
     return false;
   }
  


©Camel engineering LLP