- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*はじめに [#m4b5e765]
[[Commons Digester:http://jakarta.apache.org/commons/digester/]]はXMLファイルをJavaオブジェクトにマッピングするツールです。Digesterでは、
d.addObjectCreate("address-book/person", Person.class);
d.addSetProperties("address-book/person");
d.addSetNext("address-book/person", "addPerson");
d.addCallMethod("address-book/person/email", "addEmail", 2);
d.addCallParam("address-book/person/email", 0, "type");
d.addCallParam("address-book/person/email", 1);
d.addSetNestedProperties("address-book/person/address");
のようにどのタグに行き当たったら何をするかのルールを設定した後、
AddressBook book = new AddressBook();
d.push(book);
File srcfile = new File(filename);
d.parse(srcfile);
とするとオブジェクトが構築されます。(上記のコードはDigesterのソースに添付されているexamples/api/addressbookです)
*Digester.addXXXXXXXX() [#n0d87e84]
まず、ルールの追加部分を見てみましょう。
public void addObjectCreate(String pattern, Class clazz) {
addRule(pattern,
new ObjectCreateRule(clazz));
}
public void addSetProperties(String pattern) {
addRule(pattern,
new SetPropertiesRule());
}
ということで各メソッドは個別のRule実装クラスを構築しルールを登録しているみたいです。addRule()はこんな感じ、
public void addRule(String pattern, Rule rule) {
rule.setDigester(this);
getRules().add(pattern, rule);
}
getRules()はRulesインターフェースを実装しているRulesBaseオブジェクトを返しています。というわけでRulesBase.add()を見てみましょう。
public void add(String pattern, Rule rule) {
...略...
List list = (List) cache.get(pattern);
if (list == null) {
list = new ArrayList();
cache.put(pattern, list);
}
list.add(rule);
rules.add(rule);
...略...
}
cacheはHashMap、rulesはArrayListのインスタンス変数です。cacheだけでいいような気がするのですが、そこら辺がどうなっているかは後から見ることにしましょう。