倭マン's BLOG

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

改・NamespaceContext の実装を考える (6) : Dom4jNamespaceContext

以前に org.dom4j.Element クラス用に NamespaceContext のサブクラスを定義して、AspectJ を用いてその取得用のメソッドを織り込むということをやりました(一覧)。 新に作成した AbstractCompositeNamespaceContext クラスを用いて、同様のことをやっておきましょう。 ただし、AspectJ を用いた織り込みは省略。

// import 分は省略。
/** @author waman */
public class Dom4jNamespaceContext
       extends AbstractCompositeNamespaceContext {

    private final Element element;
    
    public Dom4jNamespaceContext(Element element){
        this.element = element;
    }

    @Override
    protected NamespaceContext getParentContext() {
        Element parent = this.element.getParent();
        if(parent == null)
            return EmptyNamespaceContext.INSTANCE;
        else
            return parent.getNamespaceContext();
    }
    
    @Override
    protected String getNamespaceURILocally(String prefix) {
        
        for(Object obj: this.element.declaredNamespaces()){
            Namespace ns = (Namespace)obj;
            if(ns.getPrefix().equals(prefix))
                return ns.getNamespaceURI();
        }
        
        return null;
    }

    @Override
    protected Set<String> getPrefixSetLocally(String uri) {

        Set<String> prefixes = new HashSet<String>();
        
        for(Object obj: this.element.declaredNamespaces()){
            Namespace ns = (Namespace)obj;
            if(ns.getNamespaceURI().equals(uri))
                prefixes.add(ns.getPrefix());
        }
        
        return prefixes;
    }
}

まぁ、特に変わりはないですね。