#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