Digester1.8のルール

感想おまちしてます!

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

作成中ですわ