今回は、前回作成したの2つのインターフェースの実装クラス JDefaultHandler, JAttributesImpl クラスを作成します。
JDefaultHandler クラス
JDefaultHandler は org.xml.sax.helpers.DefaultHandler を拡張して作成します。 各メソッドの実装の概要は以下の通り:
- org.xml.sax.ContentHandler に定義されている startElement(), endElement() メソッドは、QName オブジェクトを引数にとるメソッドに処理を委譲する。
- QName オブジェクトを引数にとるstartElement(), endElement() メソッドは何も処理をしない。
実際の実装はこんな感じ:
import javax.xml.namespace.QName; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class JDefaultHandler extends DefaultHandler implements JContentHandler{ @Override public final void startElement(String uri, String name, String qname, Attributes atts) throws SAXException { startElement(newQName(uri, name, qname), new JAttributesImpl(atts)); } @Override public final void endElement(String uri, String name, String qname) throws SAXException { endElement(newQName(uri, name, qname)); } public void startElement(QName qname, JAttributes atts)throws SAXException{} public void endElement(QName qname)throws SAXException{} }
newQName(String, String, String) メソッドの実装は「名前空間 URI」「ローカル名」「QName(文字列)」から javax.xml.namespace.QName オブジェクトを生成するユーティリティ・メソッドです。 このメソッドは JAttributesImpl でも使用するので、実際にはユーティリティ・クラスを作成してそこに定義する方がよいでしょう。 JAttributesImpl については次節。
JAttributesImpl クラス
JAttributesImpl は org.xml.sax.helpers.AttributesImpl クラスを拡張 して作成します。 新たに定義するメソッドは JAttributes インターフェースに定義したメソッドと、QName を用いて属性値などを設定するメソッド(addAttribute(), setAttribute() メソッド)です。 これらのメソッドの実装は、QName オブジェクトから名前空間 URI やローカル名を取得し、それらを用いて他のメソッドを呼び出しているだけです:
import javax.xml.namespace.QName; import org.waman.tools.xutil.QNameUtils; import org.xml.sax.Attributes; import org.xml.sax.helpers.AttributesImpl; public class JAttributesImpl extends AttributesImpl implements JAttributes{ public static final String DEFAULT_TYPE = "CDATA"; public JAttributesImpl() {super();} public JAttributesImpl(Attributes atts) {super(atts);} public QName getQualifiedName(int i) { return new QName(getURI(i), getLocalName(i), getQName(i)); } public int getIndex(QName qname) { return getIndex(qname.getNamespaceURI(), qname.getLocalPart()); } public String getType(QName qname) { return getType(qname.getNamespaceURI(), qname.getLocalPart()); } public String getValue(QName qname) { return getValue(qname.getNamespaceURI(), qname.getLocalPart()); } public void addAttribute(QName qname, String value) { addAttribute(qname, DEFAULT_TYPE, value); } public void addAttribute(QName qname, String type, String value) { addAttribute( qname.getNamespaceURI(), qname.getLocalPart(), QNameUtils.toPrefixedName(qname), type, value); } public void setAttribute(int index, QName qname, String value) { setAttribute(index, qname, DEFAULT_TYPE, value); } public void setAttribute(int index, QName qname, String type, String value) { setAttribute( index, qname.getNamespaceURI(), qname.getLocalPart(), QNameUtils.toPrefixedName(qname), type, value); } }
QNameUtils.toPrefixedName() メソッドは以前の記事で書いたメソッドです。 以上で完了。