-外部エンティティ解決

MLにも出てましたが、その派生な話題。。。
Seasar2でもKijimunaでも、Maya-MLDも、DTDを利用したXML文書バリデーションを行う機能を持っています。これらはSAXプログラミングを行っている中、ハンドラ内にEntitiResolver#resolveEntity(publicId,systemId)を実装し、ネットワーク越しにDTDを取りにいかせずに、クラスパス内でDTDの読み込み解決を図っています。
Seasar2とKijimunaは、JAXPのSAXParser#parse(source,handler)によるパースを行います。これは問題ない。一方、Mayaはパーサが特殊な機能を含むのでファクトリを経由せずに直接NekoHTMLパーサもしくはXercesパーサをインスタンス化しています。そして、XMLReader#setContentHandler(handler) & #parse(source)という次第です。ここで注意。
前者のJAXPのparse(source,handler)では、引数のハンドラを、setContentHandler(handler)、setEntityResolver(handler)、setDTDHandler(handler)、setErrorHandler(handler)とやってくれますが、後者はそれらを自前でやらないといけません。そして、両者共に、LexicalHandlerは自前でセットします。これらを忘れて対応しないと、SAXハンドラにいくらEntityResolverなどを実装してもイベントが呼び出されません。
MLの投稿を見るまで、上記を忘れていて、Maya-MLDは外部エンティティ解決がきちんとできてませんでした。また、ErrorHandlerも使われてなくて、例外はハンドラでなくパーサのほうで処理してました。運よく意図した動作にはなってましたが、意図したとおりの実装ではなかったのです。