倭マン's BLOG

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

改・NamespaceContext の実装を考える (1) : クラス階層

以前 javax.xml.namsepece.NamespaceContext インターフェースの実装クラスを考えてましたが(一覧)、不具合の修正とリファクタリングのため、もう一度 NamespaceContext の実装を考えていきます。 クラス名やメソッド名が少々変わってますが、基本的なアプローチは同じです(一覧)。

作成するクラスの階層構造


今回は作成するクラスの階層構造を考えます。 クラス図は下図のようになります:

普通のクラス図と少々違いますが、意味は分かるかと。 念のため、継承関係を書いておきましょう:

public abstract AstractNamespaceContext implements NamespaceContext{...}

public EmptyNamespaceContext extends AbstractNamespaceContext{...}

public abstract AstractCompositeNamespaceContext extends AbstractNamespaceContext{...}

public MapNamespaceContext extends AbstractCompositeNamespaceContext{...}

各クラスの役割


踏み込んだ内容は次回以降にして、今回は各クラスの大まかな役割を見ていきます:

AbstractNamespaceContext

このクラスは、getNamespaceContext() や getPrefix() 等のメソッドで、「特別な引数」に対する「特別な返り値」を返す(例えば getNamespaceURI() メソッドは、引数が "xml" なら"http://www.w3.org/XML/1998/namespace" を返さなければならない等)処理を行うクラスです。 以前の記事での AbstractNamespaceContext とは少し役割が異なります。

EmptyNamespaceContext

これは名前空間宣言がない場合の NamespaceContext に対応するもので、以前の記事では MapNamespaceContext のコンストラクタに渡した NULL_CONTEXT にあたるクラスです。

AbstractCompositeNamespaceContext

このクラスは親ノードの NamespaceContext などのベースとなる NamespaceContext をもとにして、さらに新に名前空間宣言を加えられるような NamespaceContext です。 概ね、以前の記事での AbstractNamespaceContext にあたるクラスです。

MapNamespaceContext

これは以前の記事での MapNamespaceContext と役割は同じです。 ベースとなる NamespaceContext を持ち(持たなくても良い)、加えて新に名前空間 URI と接頭辞のペアを登録できるような NamespaceContext の具象実装クラスです。