インライン・メソッドまたはアノテーション付きメソッドの前後に実行されるフック・メソッドの作成および実行

com.ibm.pdq.runtime.statement.Hook インターフェースを使用して、インライン・メソッドまたはアノテーション付きメソッドの前後に実行されるメソッドを作成することができます。
インライン・メソッドで使用される Data オブジェクトあるいはアノテーション付きインターフェースの生成済みインプリメンテーションで、Hook が登録されている場合、アプリケーションがメソッドを呼び出すときに以下のステップが行われます。

インライン・メソッドを定義する 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
  }
}
  1. Hook インターフェースが含まれるパッケージをインポートします。
  2. pre() メソッドを定義します。
    String methodName
    pureQuery はメソッドのシグニチャーを pre() メソッドに渡します。
    Data dataInstance
    pureQuery は、Data インターフェースを実装するオブジェクトを渡します。
    SqlStatementType sqlStatementType
    pureQuery は、SELECT、UPDATE、INSERT などの SQL ステートメントのタイプを渡します。
    Object... parameters
    pureQuery は、sendFormLetter() メソッドに渡されるパラメーターを渡します。
  3. 郵便番号を使用して都市または都道府県を検索するか、あるいは都市および都道府県を使用して郵便番号を検索するロジックを提供します。 sendFormLetter() メソッドに渡す前にパラメーターを更新します。
  4. 何も行わないように post() メソッドを定義します。

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 

このコードは、以下のステップを実行します。

  1. データベースへの接続を作成します。
  2. ZipHook インターフェースのインプリメンテーションのインスタンスを作成します。
  3. Data インターフェースのインプリメンテーションのインスタンスを作成します。 このインプリメンテーションにより、NotSpam インターフェースが実装され、Hook ZipHook が割り当てられます。

フィードバック