S-JIS[2013-12-23] 変更履歴
Asakusa Toad Editorの逆変換方法の説明です。
Toad Editorで逆変換と言っているのは、既存のAsakusa DSL(Javaのクラス)からtoadファイルを作成することを指しています。
逆変換を行うにはいくつか条件があります。
逆変換の方法は、AsakusaFW本体の“Asakusa DSLのコンパイル方法”と似ています。
すなわち、Batch DSLやFlow DSLのクラスのインスタンスを作り、describeメソッドを呼び出して構造を取得します。
(DSLクラスのJavaソースをソースとして解析している訳では無い為、describeメソッド内部のコメント類や変数の受け渡し等は取得できません)
このようにFlow
DSLクラスのインスタンスを作る必要がある為、フロー演算子(FlowPart)のクラスのコンストラクターで値引数を渡すようになっている場合は、何らかの値を指定する必要があります。
逆変換ウィザードではユーザーに仮の値を入力してもらうようになっています。
ただ、普通は値引数(の変数)をdescribeメソッド内部で使っているでしょうが、どう使っているのかを(このコンパイル方法では)把握できません。
describeメソッド内部の演算子の引数として使った場合、演算子に何らかの値が渡ってきていることは分かりますが、それが値引数の変数の値だったのかどうかは分かりません。
その為、値引数のあるフロー演算子を逆変換した場合、正しい内容になりません。
例を挙げましょう。
以下のフロー演算子ではvalueという変数が値引数となっています。
@FlowPart
public class ValueFlowPart extends FlowDescription {
/** 入力 */
private final In<ErrorRecord> in;
/** 出力 */
private final Out<ErrorRecord> out;
/** 値引数 */
private String value;
public ValueFlowPart(In<ErrorRecord> in, Out<ErrorRecord> out, String value) { this.in = in; this.out = out; this.value = value; }
@Override
public void describe() {
ValueOperatorFactory operators = new ValueOperatorFactory();
// 更新演算子
Update update = operators.update(this.in, "length=" + this.value.length());
this.out.add(update.out);
}
}
見て分かる通り、describeメソッド内の演算子updateに、ValueFlowPartの値引数を使っています。
そして、このクラスのインスタンスを作る為に、値引数valueに適当な値を与えます。
(In, Outにはコンパイル時に使用する専用のインスタンスを渡しますのでここでは考慮する必要はありません)
FlowDescription flow = new ValueFlowPart(in, out, "dummy");
これでdescribeメソッドを呼び出すと、describeメソッド内の演算子の呼び出し状態が取得できます。
また、演算子のFactoryクラスはAsakusaFWが生成したクラスなので、この時に引数を取得するような仕組みが入っています。
が、updateメソッドに渡ってきた値は「length=5
」という文字列です。
元のValueFlowPartの引数との関係はAsakusaFWコンパイラーには分かりませんorz
その為、このフロー演算子を逆変換した場合、以下のようなDSLと同等のものになってしまいます。
@Override
public void describe() {
ValueOperatorFactory operators = new ValueOperatorFactory();
// 更新演算子
Update update = operators.update(this.in, "length=5");
this.out.add(update.out);
}
これが、「値引数のあるFlowPartは正しく逆変換できない」という理由です。
Toad Editorの逆変換は以下のような手順で行います。