S2Utilプロジェクトが始まりました。

Seasar2 からスピンアウトしたユーティリティ集ということでSeasarプロジェクトのSandboxでS2Utilプロジェクトが始まりました。

要はS2ContainerやS2Tigerにあるユーティリティを切り出して単品で使えるようにしようということです。Java6対応も含む。

メンバーは@koichikさん、@shinsuke_sugayaさんと僕も微力ながら参加させてもらっています。

経緯としては
Seasar3開発中止 - yvsu pron. yas
にあるようにSeasar3の開発が中止になり、Seasar2.5の企画も
[seasar-dev:1164] Seasar2.5
からはじまるスレッドにあるようになくなりましたが、ここでの話し合いをきっかけにS2Utilプロジェクトが始まりました。

ちなみに現状のSeasar2.4のユーティリティがなくなるというわけではありません。

S2Utilのその後の経緯は
[seasar-dev:1189] S2Util
からはじまるスレッドにある通りなのですが、プロジェクト申請からわずか1週間でS2ContainerやS2Tigerからの移行もほぼ完了しています。

実作業はs2util/signup - SeasarWikiにあるようにほぼ@koichikさんと@shinsuke_sugayaさんがやっています。

ユーティリティというと枯れたものとしてはcommons系がありますが、ジェネリクス対応がされていなかったりするので、Seasarのユーティリティは魅力的です。かりにDIコンテナとしてSeasar使わなかったとしてもね。

ただたとえばユーティリティとしてs2tigerを使おうとしたけどJBoss5とあわせるとうまくいかなかったり(原因不明。やり方が悪いのかも。)するので、ユーティリティとして切り出されているとうれしいと思う人も多いはずです。

またs2tigerのBeansのcreateAndCopyなんかはJavassist依存なのですが、S2Utilではこれがなくなっています。

ほかにはログは logger.log(format("EXXX0001", a, b, c), t) というふうになっています。a,b,cの部分は可変長引数。

可変長引数を使ったログとしてありがちなのは

(String messageCode, Throwable cause, Object... args)

ですが、例外も含めて個人的にこの形式はいまいちだと思ってます。

たしかにこの形式なら

(String messageCode, Throwable cause, Object[] args)

の場合と比べて、argsの部分をnew Object[]{...}としなくて楽なのですが、使い方を間違えて例外がargsにいってしまって消えてしまったケースを見たので採用には慎重になったほうがいいと思っています。

ちなみにS2Utilでも例外について議論がありましたが、現状では

(final String messageCode, final Object[] args, final Throwable cause)

という古い形式になっています。

このへんのAPIに関してはまだ変更される可能性もありますが、いまはこんなところです。

個人的にあると便利だと思っているのは、日付関連、日本語チェック、プロパティ(commons-collectionのorg.apache.commons.collections.ExtendedProperties 相当)、CSVリーダあたりなので、軽めのところからおいおいやっていこうかなと。

commons以外で参考になるのはT2Frameworkのユーティリティ、Google Collection Library, guavaあたりだと思っているので見ていこうと思います。とりあえずClosableUtilはあってもいいかな。