以前 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 の具象実装クラスです。