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です)
まず、ルールの追加部分を見てみましょう。
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だけでいいような気がするのですが、そこら辺がどうなっているかは後から見ることにしましょう。