Java

Velocityメモ

侍ではスレッドダンプの解析結果をHTMLで書き出してJEditorPane に表示させてます。
現在のところjava.text.MessageFormatで無理矢理HTMLを構築する仕組み。
HTMLのレイアウトに沿ってJavaでゴリゴリとコードが書いてあるので、非常に美しくないです。
レイアウトに変更があったら Java コードを書き換えないといけないのは非常にメンテナンスしづらい!
HTMLを作るならJSPでしょ、って思うけど侍は当然サーブレットコンテナを搭載していないので無理。Jetty を内蔵してごにょごにょ、っていう手もあるけどそれはまた今度。

というわけでちょっと Velocity を触ってみました。
Jakarta Velocity

いまさら説明する必要はないかもしれないけど Velocity はテンプレートエンジン。HTMLなり自動送信するメール文面なりをJavaアプリケーション内でJavaコーディングレスで生成するというもの。

使い方は非常に簡単。ドキュメントも明快なので特に迷うことはなかったです。
とりあえずバイナリをダウンロードしてきて velocity-dep-1.4.jar をクラスパスに通すだけ。これには依存しているライブラリが全部入っていて505kb。
ちょっとサイズが問題になる場合はvelocity-1.4.jar と commons-collections だけでも動く。といっても150kbくらいしか節約できないけど。
Javaからどのように Velocity を呼び出すかは developer guide を、テンプレートの書式についてはuser guideを見れば良い。
書式についてコマカーイ話は VTL referenceを。
テンプレートにエラーがあった場合、パース時に例外が発生するけれども NullPointerException とかで意味不明。
こんなときはデフォルトでカレントディレクトリに書き出される velocity.log を見ればよい。
侍で読み込ませておけば Ok ね。

今回ちょっと迷ったのは以下の二点。

1. オブジェクトの null チェックは?
#if ($変数名) で判別可能。オブジェクトが null でなければ true と同等に判定される。JavaScript と同じね。

2. foreach 内でインデックスを取得するには?
#set ($i = 0)
#foreach …..
処理
#set ($i = $i + 1)
#end
とかやっても良いけど実は $velocityCount という変数が自動的に内部でアサインされる。
デフォルトではインデックスは1から始まるので注意。設定で0から始まるようにもできるらしいけど今回は必要なかった。

正確には計っていないけど全くといって良いほどパフォーマンス低下はなかった。
同時にいままでhtmlをファイルに一旦書き出していたのをやめて JEditorPane に直接セットするようにしたのでむしろパフォーマンス向上!
というわけで次のアップデートでは Velocity が含まれるのでサイズが倍くらいになる予定。といっても600〜700k程度ですが。
1/23 typo をやや修正。