倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

org.dom4j.Document を構築するビルダー

前回のビルダーを拡張し、今回は org.dom4j.Element ではなく org.dom4j.Document を構築するビルダーにします(一覧)。

サンプル・コード


サンプル・コードはこんな感じ。

def builder = new SimpleDom4jBuilder()
def doc = builder.table(customer:'c', invoice:'i'){
    join(c:'invoice_id', i:'id')
    and{
        greater('i.total':1000)
        like('c:name':'%Bill%', 'child')
    }
}

 assert doc instanceof org.dom4j.Document   

SimpleDom4jBuilder の実装


ビルダーの実装は、概ね前回と同じですが、

  • protected createNode(name, Map atts, text) メソッド
  • protected setParent(parent, child) メソッド

に少し処理を付け加えます。

createNode() メソッド

ルート要素を構築している場合 (current == null) は、構築した要素から org.dom4j.Document オブジェクトを作成して返します。 そうでない場合は前回と同じです。

    @Override
    protected createNode(name, Map atts, text) {
        Element e = this.factory.createElement(name.toString());

        // 属性と子テキストの設定。 前回と同じ。

        if(current == null)
            return this.factory.createDocument(e)
        else
            return e
    }

setParent() メソッド

親要素が Document オブジェクトの時は、ルート要素に子要素を付加します。 そうでない場合は前回と同じです。

    @Override
    protected void setParent(parent, child) {
        if(parent instanceof Document)
            parent.rootElement.add(child)
        else
            parent.add(child)
    }

前回に比べてそんなに複雑にはなりませんでした。

Groovyイン・アクション

Groovyイン・アクション