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無し)