Rule定義の書き方と実行方法
こちらではRule定義の作成と実行方法について解説します。
Rule定義の作成
ルール定義はXML形式で、ルートタグ「rules」内に記述します。
- XMLを作成する
- ルートタグにrulesタグを記述し、使用する機能にあわせたXMLスキーマを読込む
※XMLスキーマの参照パスの間違いに注意してください
- 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;
}