Maven2 で Coverage を取る
EMMA を emma-maven-plugin で利用。
: <build> <pluginManagement> <plugins> : <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>emma-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> : </plugins> </pluginManagement> </build> : <reporting> <plugins> : <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>emma-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> : </plugins> </reporting> :
あとは mvn emma:emma を実行すれば target/site/emma/ の下にレポートが出来るので、index.html から参照すれば OK。
Hudson の EMMA Plugin はチャートを生成するものですが、マルチモジュールなプロジェクトに対応していない (パス指定でワイルドカードが使えない) ので、基本的に HTML を見る方向。HTML のレポートでは Java コード内の日本語が文字化けしますが、emma 本体 (に同梱されている properties ファイルで ISO-8859-1 と指定されている) に手を入れないと対応できなさそうなので、あきらめます。
Maven2 & Cobertura の interface 追加問題にぶつかる
Maven2 で Cobertura を使ってカバレッジを見ようとしたところ、ご多分に漏れず getInterfaces() と getGenericInterfaces() の数が違う、という問題に遭遇。(参考:[Seasar-user:16661], Maven2 surefire レポート作成時に ArrayIndexOutOfBoundsException)
Seasar2 に手を入れるのは本末転倒な感じなので、EMMA を試してみる方向で検討。
Cubby 用 InjectionResolver 更新
以前公開したものを更新。使っている人がいるかどうかわかりませんが。
- CubbyInjectionResolver で Mayaa ファイルにカスタムタグ定義をしているとき、その子が有効になるようにした。
- CubbyErrorsTag でインデックス指定をできるようにした。
インデックス付きメッセージ (入力タグをループした場合) は、index 指定のために Mayaa 側に記述が必要。
今回は zip を作っていないので extensions から取得してください。
S2Mai のテンプレートパスを少し指定できるように
S2Mai は手軽にメール送信メソッドを作れる、という印象。だけれども、テンプレートのパスがパッケージ込みクラス+メソッド名で固定になっているので、「運用者がテンプレートを書き換えたい」場合にはちょっとわかりづらい。
そこで、クラスパス上という制限だけはそのままに、ファイル名をメソッド単位で指定できるようにしてみた。具体的にはメソッドにアノテーションを付け、そこでファイル名(拡張子除く)を指定する形。
前提として MaiMetaDataFactory の実装および MaiMetaData の実装を作成し、s2mai.dicon および s2mai-core.dicon を別名で定義してそっちを使うようにする。ここは詳細略。MaiMetaDataFactory の方も MaiMetaData の実装インスタンスを変えるだけなので略。
作成したアノテーション。
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MailTemplatePath { /** * テンプレートファイルパスの部分文字列。 * <p> * クラスパスのルートから、この文字列 + "." + 拡張子を探す。 * 先頭は "/" 無し、拡張子を除いたファイル名を指定する。 * {@see ClassLoader#getResource(java.lang.String)} * </p> * @return テンプレートファイルパスの部分文字列。 */ String value(); }
MaiMetaData の実装。org.seasar.mai.meta.impl.MaiMetaDataImpl を extends して、getTemplatePath を override。あと ext が private なので別に保持するように変更。
org.seasar.mai.meta.impl.MaiMetaDataImpl の拡張 public synchronized String getTemplatePath(Method method) { String path = templatePathCache.get(method); if (path != null) { return path; } MailTemplatePath annotation = method.getAnnotation(MailTemplatePath.class); if (annotation == null) { Class<?> maiClass = method.getDeclaringClass(); path = maiClass.getName().replaceAll("\\.", "/") + "_" + method.getName() + "." + ext; } else { path = annotation.value() + "." + ext; } templatePathCache.put(method, path); return path; }
あとは XxxMai のメソッドに @MailTemplatePath("foo/bar") と書けば、クラスパスルートから foo/bar.ftl というファイルを探してテンプレートとして使用される。
Eclipse の RSS View
Hudson を置いたサーバからメールを送れないような場合、RSS で代替。
- http://www.junginger.biz/eclipse/ を Software Updates で指定して、RSS View をインストール。
- Window > Show View > Other... > RSS/Atom Feed View > Feed で View を開く。
- (Hudson)/rssFailed をフィードとして登録
- フィルタで Newer than current time を有効にし、以後は確認した時間でボタンを押すことで既読管理する。
Cubby 用 InjectionResolver
以前言っていたものを extensions という名の拡張サンプル置き場に置きました。細かな説明は CubbyInjectionResolver の javadoc を参照。
簡単に効能を述べると
- HTML の属性を Cubby のカスタムタグに自動コピー
- 特定の条件では Cubby のカスタムタグを勝手に定義 (mayaa に書かなくて良い)
- 同梱の errors タグでエラーメッセージの特定位置表示対応
簡単に動作を見てみるには、Cubby 1.1.6 のサンプル war に この zip の中身を上書きしてください。(cubby-examples/mayaa/components.html, mayaa)
多少魔術っぽくなるのが難点ですが、それが嫌ならカスタムタグの定義だけでもしておけば、属性コピーだけを利用することもできます。この点だけだと SAStruts には不要ですね。(DynamicAttribute ではないので)
7/29追記 ちょっと更新 (zip無し)