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が丁寧に書いてあるので、それだけで結構ドキュメントとしても十分な感じになってます、ここらへんも見習いたいと思いました(><;