Digesterの命でもあるルールを勉強なのだ。ルールを極めるものはDigesterを制す。
用語
- ルートオブジェクト
- 一番最初に作られたオブジェクト
- トップオブジェクト
- 一番出口に近いオブジェクトを差す
- 親オブジェクト
- トップオブジェクトの一つ前に作成されたオブジェクト
- 子オブジェクト
- トップオブジェクトと同意
object-create-rule
オブジェクト作成し、Digesterが使うオブジェクトスタックにプッシュする。
<pattern value="items/user">
<object-create-rule classname="com.daipresents.digester18.UserVO" />
</pattern>
set-properties-rule
属性をトップオブジェクトに設定する。
<user name="藤原" age="20" />
というのが入力要素にあり、ルールで
<pattern value="items/user">
<object-create-rule classname="com.daipresents.digester18.UserVO" />
<set-properties-rule/>
</pattern>
と記述すると、UserVOを作って、setName、setAgeメソッドに属性の値を設定してくれる。属性名がセッターの名前になって、設定する値は属性の値となる。属性名とVOのメソッド名に差異がある場合はエイリアスを使えば解決する。
<pattern value="items/user">
<object-create-rule classname="com.daipresents.digester18.UserVO" />
<set-properties-rule>
<alias prop-name="name" attr-name="username" />
</set-properties-rule>
</pattern>
これだと、属性名usernameの値をUserVOのsetNameメソッドに入れてくれる。
set-property-rule
XMLの要素に指定された2つの属性を利用して、トップオブジェクトに値を設定する。
例えば、
<name attr="type" usertype="superuser">藤原</name>
とあったとき、
<pattern value="items/user/name">
<bean-property-setter-rule propertyname="name"/>
<set-property-rule name="attr" value="usertype" />
</pattern>
- まずはトップオブジェクトの「setNameメソッド」が呼ばれる
- さらにトップオブジェクトの「setTypeメソッド」に「superuser」という値を設定する
nameで指定されたセッターに、usertypeで指定された「superuser」という値が入る。
これ不便だ。
bean-property-setter-rule
トップオブジェクトの属性に値を設定する。この場合、トップオブジェクトのセッターが呼ばれるので、以下の場合
<pattern value="items/user/name">
<bean-property-setter-rule propertyname="name"/>
</pattern>
トップオブジェクト.setName()が使われ、設定する値は要素の値が使われる。配列もいけるらしいが、ルールXMLの書き方が不明。
set-next-rule
親オブジェクトのメソッドを呼び出す。以下の例だと、ArrayListの一つ前に作成されたオブジェクトの「setTelListメソッド」が呼ばれ、作成したArrayListを引数に設定する。
<pattern value="items/user/telList">
<object-create-rule classname="java.util.ArrayList" />
<set-next-rule methodname="setTelList" />
</pattern>
set-root-rule
ルートオブジェクトのメソッドを呼び出す。引数はトップオブジェクト。
<set-root-rule methodname="setTelList" paramtype="java.lang.String"/>
上記例では、ルートオブジェクトの「setTelListメソッド」を呼び出している。引数の型も指定しなければならない。
set-top-rule
トップオブジェクトのメソッドを呼び出す。引数は親オブジェクト。
<set-top-rule methodname="add" paramtype="java.lang.Object" />
call-method-rule&call-param-rule
トップオブジェクトのメソッドを呼び出す。
<call-method-rule methodname="print" />
呼び出すメソッドに引数が必要の場合、call-param-ruleを使って指定することができる。
<pattern value="items/user/telList">
<object-create-rule classname="java.util.ArrayList" />
<set-next-rule methodname="setTelList" />
</pattern>
<pattern value="items/user/telList/tel">
<call-method-rule methodname="add" paramcount="1" />
<call-param-rule paramnumber="0" />
</pattern>
要素の属性を引数にしたい場合はattrname属性を利用する。
<call-param-rule paramnumber="0" attrname="home" />
SetNestedPropertiesAliasRule
SetPropertiesAliasRule
FactoryCreateRule
NodeCreateRule
ObjectParamRule
PathCallParamRule
PluginCreateRule
PluginDeclarationRule
SetNestedPropertiesRule
作成中ですわ