はじめに

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()

まず、ルールの追加部分を見てみましょう。

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