Aptinaやってみよう

id:koichikさん(王手おめでとうございます)にAptinaを教えてもらいました、ありがとうございます。DIコンテナとか依存はなくJUnit除けばjarも1個で簡単に試せます。
Processorでちょこちょこっと作って実際にアノテーション宣言した時にうまく機能しなかった時が全然、原因がわからんので、やっぱテストクラスさえ作って確認しとけばと思ってました。非常にタイムリーです。まだソース生成するのは試してませんが軽く警告メッセージがでるかなーって確認してみました。試すのに必要なのはhttp://maven.seasar.org/maven2-snapshot/org/seasar/aptina/aptina-unit/0.0.0-SNAPSHOT/から最新のjarをクラスパスに通すだけです。

@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("com.waki.aptsample.FatWarning")
public class FatWarningProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv) {
    	
        for(TypeElement annotation : annotations) {
        	
            for(Element element : roundEnv.getElementsAnnotatedWith(annotation)) {
            	
                FatWarning warning = element.getAnnotation(FatWarning.class);

                if(isFat(warning.value())) {
                    Messager messager = processingEnv.getMessager();
                    String   message  = String.format("「%s」は100kg以下で指定してね", warning.value());
                    messager.printMessage(Diagnostic.Kind.WARNING, message, element);
                }
            }
        }
        return true;
    }

    // 100kg超えて設定したか判定
    private boolean isFat(int weight)
    {
    	if (Integer.valueOf(weight) > 100) {
            return true;    		
    	}
    	return false;
    }

って感じで、まずはProcessorです。FatWarningというアノテーションで指定値が100超えたら警告するようにします。でテスト対象ソースが

public class WakiBean {

  @FatWarning(200)
  private int getWeight() {return 0;}

  @FatWarning(99)
  private int getPreviousWeight() {return 0;}
}

って感じ。そして、テストケースが

public class FatWarningProcessorTest extends AptinaTestCase {

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        addSourcePath("src");
    }

    public void test() throws Exception {
        // テスト対象の Annotation Processor を生成して追加
        FatWarningProcessor processor = new FatWarningProcessor();
        addProcessor(processor);
        
        // コンパイル対象を追加
        addCompilationUnit(WakiBean.class);

        // コンパイル実行
        compile();

    }

って実行するとコンソールに

src\com\waki\aptsample\client\WakiBean.java:8: 警告:「200」は100kg以下で指定してね

と1行だけ表示されました!マンセー!!本当はMessagerから文字列とれればいいんだけどとれないからしょうがない。でもくだらないミスはこれでつぶせるので安心です。今度はソース生成したやつでも試してみたいと思います。またJavaDocが丁寧に書いてあるので、それだけで結構ドキュメントとしても十分な感じになってます、ここらへんも見習いたいと思いました(><;