5.JAVAソース生成plugin vol.2
こんにちは、今回は前回説明した「JAVAソース生成」pluginの続きで、自動生成されたリソースの内容について説明したいと思います。pluginによって生成されるリソースは「From」「Action」「properties」の3つであることは前回説明しました。今回はその中のFormクラスの詳細について説明いたします。
1.HTMLの入出力項目を格納するForm.javaソース
Fromクラスの構成は以下のようになります。
前回の説明でも利用しましたSample.htmlを例に説明します。実際のFromクラスのソースは、ここにあります。
// Sample.htmlのFormクラス
public class SampleForm {/ 入出力用プロパティー(input系タグやtg:outタグの値を格納するフィールド)
public String name
...
public ListresultList = new ArrayList (); // インナークラス(tg:loopタグの1行分の情報を格納するクラス)
// 上記resultListに格納されます。
public static class Result { ... }// 定数クラス(tg:labelのname属性やselectタグ等の選択値)
public static class VC { ... }// 妥当性チェックメソッド(validateメソッド)
public boolean validate() { ... }
}
画面の入出力項目や定数および妥当性検査を行うFormクラスの構成は上記の通りです。
これらの内容は開発者がマニュアルで記述しても問題はありませんが、決まりきった作業であり、上記ソースの内容はhtmlまたはセッティングsheet(xls)に1度記述した内容になります。と考えればDRY(Don't Repeat Yourself)の精神からすれば、マニュアルで記述するのはナンセンスということで、自動生成の対象となっています。ここで問題になるのが、ソース自動生成のジレンマがあります。
自動生成は、何らかの元ネタとなるリソース(今回でいえばhtml,セッティングsheet)を読み込み、その情報からソースを自動生成することになります。
自動生成されたソースをそのまま利用できれば問題はないのですが、開発者が拡張する場合が多いのが事実です。また拡張は容易に行えなければなりません。
しかし、自動生成する元ネタに変更が発生した場合(例えばHTMLの項目が追加になったとか)に、再度自動生成すると開発者が拡張した内容を上書きして
しまっては、元も子もありません。今回の自動生成pluginは、この問題も解決した方法を提供しています。以前にも紹介した、この機能です。
自動生成されたソースコードには「/* TRYGEN_SOURCE_REPLACE_BEGIN */」と「/* TRYGEN_SOURCE_REPLACE_FINAL */」が記述されます。自動生成pluginは「/* TRYGEN_SOURCE_REPLACE_BEGIN */」から「/* TRYGEN_SOURCE_REPLACE_FINAL */」に囲まれたソースのみを置き換えます。つまり、開発者が拡張したコード(自動生成されたコードを拡張した場合も含む)を「TRYGEN_SOURCE_REPLACE_...」コメント外に記述しておくことにより、再度自動生成した場合でも拡張コードは保護されます。
以下に実際に「TRYGEN_SOURCE_REPLACE_...」が含まれたソースをサンプルとして記述します。
説明の便宜上インナークラスと定数クラスは省きます。
public class SampleForm {
public int count1; ... 1
/* TRYGEN_SOURCE_REPLACE_BEGIN */
public int count2; ... 2
public String name;
...
public ListresultList = new ArrayList ();
/* TRYGEN_SOURCE_REPLACE_FINAL */
public int count3; ... 3// validate
public boolean validate() {
// チェック結果を保持する属性の宣と初期化をないます。
EzMessage ezMessage = new EzMessage(PROPERTY);
// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.validate(this.userid);
...
}
public void testMethod() { ... 4
System.out.println("テスト");
}
}
上記の場合、1,3,4に記述されたコードは、再度ソースを自動生成しても保護されます。対して2に記述されたコードは、
置き換えコメント「TRYGEN_SOURCE_REPLACE_...」に囲まれた位置ですので、再度、自動生成を行うと置き換えられます。
上記ソースで気になる点はvalidateメソッドです。自動生成されたコードは「validate」メソッドを「TRYGEN_SOURCE_REPLACE_...」コメント外に作成
します。つまり、自動生成を再度行っても「validateメソッド」の内容は書き換わらないと言うことになります。
この理由は、validateメソッドの内容は、ここで説明下通りセッティングsheetで設定されますが、この内容すべてが網羅できているわけではありません。
妥当性検査には、文字、数字、レングス、必須といった単純なチェック以外にも、値の範囲であったり、最小値、最大値のチェックなどがあるかと思います。
これらのチェックは、自動生成後にチェック内容を拡張する必要が発生します。
例えば上記例でいえば「ユーザーID項目の英数チェック」に加えて「-(ハイフン)のみ入力可能」にする拡張を入れた場合は以下のようになります。
// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.include('-').validate(this.userid);
この様な拡張は、開発者が自動生成されたコードに設定を付加することで可能になるため、再度ソースを自動生成した場合にコードが上書きされてしまうと折角
の拡張が無意味になってしまうため、validateメソッドは「TRYGEN_SOURCE_REPLACE_...」コメント外に生成されます。
しかし、このままではhtmlに入力項目等が追加された場合、validateメソッドに追加項目の内容が反映されません。
そこで、このpluginでは入力項目が追加され、その項目にvalidateの設定がされていた場合は、既存のvalidateソースに追加項目の妥当性チェックを追加するようになっています。仮に以下のvalidateメソッドが存在していた場合を想定して説明します。
// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.include('-').validate(this.userid);
// 「メールアドレス」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.MAIL).digit(100).alphabet().number()
.include('@','-','.').validate(this.mail);
上記validateメソッドは、「ユーザーID」と「メールアドレス」の順番で妥当性チェックを行っているソースですが、画面に「ユーザーID」と「メールアドレス」の間に
「パスワード」項目が追加され場合は、pluginにより以下のようにコードを再生性します。
// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.include('-').validate(this.userid);
// 「パスワード」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.PASSWORD).digit(20).alphabet().number()
.validate(this.password);
// 「メールアドレス」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.MAIL).digit(100).alphabet().number()
.include('@','-','.').validate(this.mail);
既存のコードは、そのままにチェックする順番を守った上で、追加された項目「パスワード」をvalidateメソッドに追加します。
この機能により、開発者の拡張コードは保護された状態で何度でも自動生成を行うことが可能になります。