java.util.ResourceBundle のキャッシュ

私のマシンで TomcatKaffe で起動すると1分以上かかるのに、Sun JDK で起動すると10数秒。理由を調べると GNU Classpathjava.util.ResourceBundle の読み込みが遅いようだ。

ResourceBundle は getBundle() でロードしたバンドルを内部的にキャッシュしているのだが、現在の実装ではそのキャッシュの積極性が足りないように思う。例えば MyResource というリソースを ja_JP というロケールでロードする場合、システムは MyResource_ja_JP, MyResource_ja, MyResource という3つのリソースを読み込む必要がある。GNU Classpath の現在の実装では3つのうち MyResource_ja_JP しかキャッシュしていないが、残りの2つもキャッシュすべきだと思われる。

たぶん起動がかなり速くなると思うが、こういう提案は bugzilla で出しても受け入れられにくいかも。とりあえず積極的なキャッシュを実装してみるけど。結局、私だけのプライベートパッチが増えていく……。

Struts on Tomcat/Kaffe/GNU Classpath

Apache Strutsアプリケーション開発入門」(ASIN:4797327790)に添付のサンプルプログラムを Kaffe で動かそうとしても動かない。Tomcatlocalhost_log にえらい長いスタックダンプが出ているのでスタックオーバーフローらしい。gnu.xml.pipeline.ValidationConsumer$ChildrenRecognizer.acceptElement() で無限再帰している感じ。

コードをあれこれ調べるとどう考えても無限再帰する設計になってるとしか思えないので、バグ検索してみると同じ問題にぶつかってる人が既にレポートを出していた。修正を急かすためにコメントを追加しておいた。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23910

ちょっとしたバグならパッチくらい自分で書くのだが、XML の validation アルゴリズムは詳しくないし。このバグをとりあえず回避するには javax.xml.parsers.SAXParserFactory.setValidating() を書き換えて、引数に true が指定されても無視するようにすればいい。(ひでぇ)