-プログラムパターン適用コンパイラ"Etoku"

Etokuの仕様をディスカッション中。まだ試行錯誤中だけど、興味持ってもらえる人が増えないかなと思って、サンプルを書きました。Etokuは、確立されているデザインパターンほかバリデーションや例外処理、HA化機能などのプログラムパターン(DIっぽいものやAOP風のものも含む)をバイトコードパターンテンプレートとして持っておいて、コンパイル時にアノテーションやメソッド名などのヒントからを直接コンパイル結果に織り込む仕組みです。いわばCのマクロみたいなもんかな。Javaコンパイラの機能も自家製(Irenka)です。
ヒントアノテーションのRetentionは皆SOURCEなので、コンパイル結果には痕跡を残しません。アプリケーションの実行時動作は基本的にEtokuでコンパイル時に全部解決しておくので、ランタイムライブラリ無く配布が便利なように設計しています。
以下はアプリケーションのメイン。@Injectionの修飾するpersonの右辺値がnullですけど、コンパイルすると右辺はファクトリから取得してセットするコードに変わります。nullが気持ち悪ければ、モックでコード書いておけばOK。Etokuコンパイルをoffにすればそれが単体テスト(のようなもの)になります。

public class SampleMain {
  public static void main(String[] args) {
    @Injection Person person = null;
    System.out.println(person.say());
  }
}

@Factoryがファクトリ。返りの型とメソッド名で検索されるが、無くてもよい。無いと@Injectionの属性値もしくは規約に従った生成を行う。@Aspectで返値にアスペクトを仕掛けるようにするとなるとコンパイル時に完全解決できるかが難あり。悩ましい。@Propertiesはリソースバンドルから修飾するローカル変数の名前で値を引いてくる。

@Singleton
public class SampleContext {
  @Factory @Aspect(interceptor=SampleInterceptor.class)
  public Person person() {
    @Properties("org/ashikunep/etoku/msg")
    String MSG_USERNAME = null;
    return new PersonImpl(MSG_USERNAME);
  }
}

コンポーネントのインターフェイスと実装。インターフェイスを定義してもしなくてもよい。@NotZeroLengthが修飾するパラメータは、nullもしくはゼロ長の値が入ってきたらIllegalArgumentExceptionをスローするパターンがぶち込まれる。

public interface Person {
  String say();
}

public class PersonImpl implements Person {
  @Properties("org/ashikunep/etoku/msg")
  private String MSG_SAY = null;
  private String _name = null;
  public PersonImpl(@NotZeroLength String name) {
    _name = name;
  }
  public String say() {
    return _name + " " + MSG_SAY;
  }
}

アスペクトもPOJOで。コンパイル時にポイントカットへバイトコードをインライン展開する。

public class SampleInterceptor {
  public Object invoke() {
    @JoinPoint Method method = null;
    @Arguments Object [] args = null;
    System.out.println(method.getName());
    for(Object arg: args) {
      System.out.println("" + arg);
    }
    @Proceed Object ret = null;
    System.out.println("" + ret);
    return ret;
  }
}

ほか、フィールドをThreadLocal化する@ThreadLocalとか、フィールドをSoftReference化する@SoftReferenceとかを考えています。要は無くてもいいけど、あるとステキな、まさにメタ的な便利機能群がほしいかなと。Etokuはその前提となるIrenkaというコンパイラフレームワークがまだ出来てないので、しばらく先のリリースになります。たぶんGW明けぐらいかな。5月14日にプロトタイプが間に合うといいな。
基本的な指向(嗜好?)として、死ぬほどプログラムを書くのが好きな人たち向けに作ってます。