XMLEncoderでTimestampを使う

Fess の設定情報を XMLEncoder/XMLDecoder で XML でまるごと操作できるようにしたのだけど、そのときにいくつかハマったので書いておく。まず、java.sql.Timestamp をデフォルトでは扱えん。というわけで、

XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(out));
PersistenceDelegate pd = encoder.getPersistenceDelegate(Date.class);
encoder.setPersistenceDelegate(Timestamp.class, pd);
encoder.writeObject(dataSet);
encoder.close();

みたいな感じで、PersistenceDelegate を取得して、Timestamp にも登録した。どうやら、BigDecimal もできないような情報があるけど、そのときは Date.class の代わりに Integer.class とかからとって、セットすれば良いみたい。

もう一つハマったのが、出力された XML で最後の java 閉じタグが表示されないこと。これは、XMLEncoder の動きとして、flush で最後の閉じタグ前まで出力して、close で最後のタグを記述する感じ。close の内部で flush を読んでいるから、つまり、最後は必ず、XMLEncoder は close 呼ばんときちんとした XML にならん(細かい設定方法があるのかもしれないけど、直感的でないからちょっと仕様的に微妙な気もするのだけど…)。

という感じで、XMLEncoder/XMLDecoder で目的なことはできた。

JSPのプリコンパイルのMavenプラグイン

jspc-maven-plugin を使うと、pom.xml に追記するだけで、JSPをプリコンパイルしてくれて、war に含まれるようになる。これは便利だ。ただし、2.0-alpha-3 だと、web.xml をシステムエンコーディングで扱うので、web.xml に日本語があると、うまくいかない場合があると思う(Windowsとかだと)。それは対応しようかな。

<build>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo.jspc</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<!-- Use the Tomcat 6 JSP compiler -->
<dependencies>
<dependency>
<groupId>org.codehaus.mojo.jspc</groupId>
<artifactId>jspc-compiler-tomcat6</artifactId>
<version>2.0-alpha-3</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>${pom.basedir}/target/jspweb.xml</webXml>
</configuration>
</plugin>

追記: http://jira.codehaus.org/browse/MJSPC-44 にバグとパッチを上げておいた。groovy で記述された Mojo は意外だった。

jar のバージョンを取得する

以前に s2container が自分のバージョンチェックをするような修正が入ったのは知っていたけど、どう取得しているのか、そのときはちらっと見ただけで記憶に残らなかったがちょっと必要になったのでしらべてみる。Mavenでビルドされたjarに限定されている話だと思うが、jarの中のMETA-INFのプロパティを見ればよいみたい。たとえば、META-INF/maven/org.seasar.container/s2-tiger/pom.propertiesとか。なるほど、これすれば、簡単に取れるな。