Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

2. Digesterのスタックとパターン

2.1. スタック

Digesterの内部にはスタックがあり、ルールによって作成したインスタンスが順につまれて行きます。 スタックとは本のようにデータを積み重ねていくデータ構造です。

DigesterではXML文書を上から解析し、指定したパターンが来た時にインスタンスを作成し、スタックに積みます(push)。 積まれたインスタンスは指定したパターンが閉じられた時にスタックから取り除かれます(pop)。 オブジェクトを作成しないルールの場合、通常ではスタックの一番上のインスタンスが対象となります。 またルールによっては、上から二番目のインスタンスを対象とすることもあります。

前章でのXML文書とルールを例に、スタックの遷移を見て行きます。
1:<object>
2:    <param1>param1</param1>
3:    <param2>param2</param2>
4:    
5:    <parent>
6:        <child>child</child>
7:    </parent>
8:</object>
Digester d = new Digester();

d.addObjectCreate("object", DigesterBean.class);
d.addBeanPropertySetter("object/param1");
d.addBeanPropertySetter("object/param2");
d.addObjectCreate("object/parent", Parent.class);
d.addSetNext("object/parent", "setParent");
d.addBeanPropertySetter("object/parent/child");

DigesterBean bean = (DigesterBean)d.parser(new File("sample.xml"));

System.out.println(bean.toString());
上記のXMLを読み込むプログラムを実行した際のスタックの遷移を追っていきます。

1行目

|              |
| DigesterBean |
+--------------+
addObjectCreate()メソッドにより、ObjectCreateルールが追加されています。
ObjectCreate("object",DigesterBean.class)ルールにより、DigesterBeanクラスのインスタンスが作成され、スタックの一番上に積まれます。

2,3行目
addBeanPropertySetter()メソッドにより、BeanPropertySetterルールが追加されています。
BeanPropertySetter("object/param1")ルールおよびBeanPropertySetter("object/param2")ルールにより、 スタックの一番上のDigesterBeanクラスのインスタンスにそれぞれのプロパティが設定されます。

5行目

|              |
|    Parent    |
+--------------+
| DigesterBean |
+--------------+

addObjectCreate()メソッドにより、ObjectCreateルールが追加されています。 ObjectCreate("object/parent", Parent.class)ルールにより、Parentクラスのインスタンスが作成され、スタックの一番上に積まれます。
addSetNext()メソッドによって、SetNextルールが追加されています。 SetNext("object/parent", "setParent")ルールにより、上から二番目のインスタンスを対象にsetParentメソッドが呼ばれます。 setNextルールはスタックの最上位のオブジェクトを引数に、上から二番目のインスタンスの指定したメソッドを呼ぶルールです。 親子関係を表現するのに使用します。
ここではDigesterBean.setParent(Parent parent)メソッドを呼んでいます。

6行目
d.addBeanPropertySetter()により、BeanPropertySetterルールが追加されています。 スタックの最上位のオブジェクトのプロパティを設定します。
BeanPropertySetter("object/parent/child")ルールにより、Parentオブジェクトのchildというプロパティが設定されます。

7行目

|              |
| DigesterBean |
+--------------+

Parentタグが閉じたので、Parentクラスのインスタンスがスタックから取り除かれます。

8行目

|        |
+--------+

objcetタグが閉じたので、Objectタグが開始した際に作られた、DigesterBeanクラスのインスタンスがスタックより取り除かれます。



前のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa