#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だけでいいような気がするのですが、そこら辺がどうなっているかは後から見ることにしましょう。