インライン・メソッドを定義する Data インターフェースには、Connection オブジェクトに対する複数の JDBC メソッドが含まれます (close()、commit()、rollback()、setAutoCommit()、および getAutoCommit() など)。 これらのメソッドは、pre() および post() メソッドと一緒にブラケットで囲むことはできません。
例えば、sendFormLetter() アノテーション付きメソッドには、使用する定型レターを識別するコードを提供する int パラメーターがあります。 さらにメソッドには、定型レターに入力する情報および定型レターをメールするための都市、都道府県、および郵便コードを提供する String パラメーターもあります。 最後に、sendFormLetter() メソッドは、レターを印刷して送信するかどうかを追跡する表を更新します。
sendFormLetter() メソッドを呼び出すアプリケーションが、都市、都道府県、または郵便番号を提供しないか、あるいはおそらく 3 つすべてではなく、それらのうちの 2 つを提供するとします。 3 つすべての値が存在するかどうかを調べるアプリケーション・ロジックを書こうと考えていますが、データベース内でこれを簡単に行うことはできません。また、sendFormLetter() メソッドの定義でこれを行うこともできません。そのアプリケーション・ロジックを書くことのできる場所の 1 つは、以下のように定義できる Hook 内です。
import com.ibm.pdq.runtime.statement.*; 1
public class ZipHook implements Hook
{
public void pre ( 2
String methodName, Data dataInstance, SqlStatementType sqlStatementType, Object... parameters)
{
if (methodName.startsWith(
"sendFormLetter(int, java.lang.String"))
{ // right method; params 2,3, & 4 are city, state, zip
if (parameters[1] == null || parameters[2] == null ||
parameters[3] == null)
{
... 3
}
}
}
public void post ( 4
String methodName, Data dataInstance, Object returnValue, SqlStatementType sqlStatementType, Object... parameters)
{
return; // no action
}
}
sendFormLetter() メソッドがインターフェース com.company.NotSpam で定義されている場合、Hook ZipHook のインスタンスと sendFormLetter() メソッドの使用を関連付けるアプリケーション・ロジックは以下のようになります。
Connection con = DriverManager.getConnection(...); 1
ZipHook zHook = new ZipHook(); 2
Data db = DataFactory.getData(NotSpam.class, con, zHook); 3
このコードは、以下のステップを実行します。