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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS