Anbindungspunktmethoden erstellen und ausführen, die vor und nach integrierten oder mit Annotationen versehenen Methoden ausgeführt werden

Sie können mithilfe der Schnittstelle com.ibm.pdq.runtime.statement.Hook Methoden erstellen, die vor und nach integrierten oder mit Annotationen versehenen Methoden ausgeführt werden.
Falls für ein Objekt Data, das von integrierten Methoden verwendet wird, oder für eine generierte Implementierung einer mit Annotationen versehenen Schnittstelle ein Hook registriert ist, werden die folgenden Schritte ausgeführt, wenn eine Methode durch eine Anwendung aufgerufen wird:

Die Schnittstelle Data, durch die integrierte Methoden definiert werden, enthält eine Reihe von JDBC-Methoden für Connection-Objekte, etwa close(), commit(), rollback(), setAutoCommit() und getAutoCommit(). Sie können diese Methoden nicht zusammen mit den Methoden pre() und post() in eckige Klammern einschließen.

Beispiel

Die mit Annotationen versehene Methode sendFormLetter() beispielsweise beinhaltet einen Parameter int, der den Code bereitstellt, mit dem ein zu verwendender Formularbrief angegeben wird. Die Methode enthält auch String-Parameter, die Informationen bereitstellen, die in den Formularbrief eingefügt werden sollen, desweiteren Stadt, Bundesland und Postleitzahl für den Versand des Formularbriefs. Schließlich wird durch die Methode sendFormLetter() eine Tabelle aktualisiert, in der verfolgt wird, ob ein Brief gedruckt und gesendet werden muss.

Angenommen, eine Anwendung, von der die Methode sendFormLetter() aufgerufen wird, gibt weder Stadt, Bundesland noch Postleitzahl oder vielleicht nur zwei der drei Elemente an. Sie können Anwendungslogik schreiben, um das Vorhandensein aller drei Werte zu prüfen. Dies ist jedoch in der Datenbank nicht ohne Weiteres möglich, ebenso wenig in der Definition der Methode sendFormLetter(). Eine Stelle, an der Sie diese Anwendungslogik schreiben können, ist ein Anbindungspunkt, den Sie wie folgt definieren könnten:

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;  // keine Aktion
  }
}
  1. Importieren Sie das Paket, das die Schnittstelle Hook enthält.
  2. Definieren Sie die Methode pre().
    String methodName
    Von pureQuery wird die Signatur der Methode an die Methode pre() übergeben.
    Data dataInstance
    Von pureQuery wird das Objekt übergeben, durch das die Schnittstelle Data implementiert wird.
    SqlStatementType sqlStatementType
    Von pureQuery wird der Typ der SQL-Anweisung übergeben: SELECT, UPDATE, INSERT usw.
    Object... parameters
    Von pureQuery werden die Parameter übergeben, die an die Methode sendFormLetter() übergeben werden.
  3. Stellen Sie Logik bereit, um die Stadt oder das Bundesland anhand der Postleitzahl oder die Postleitzahl anhand der Stadt und des Bundeslands zu ermitteln. Aktualisieren Sie die Parameter, bevor Sie sie an die Methode sendFormLetter() übergeben.
  4. Definieren Sie die Methode post() so, dass damit keine Aktion ausgeführt wird.

Wenn die Methode sendFormLetter() in der Schnittstelle com.company.NotSpam definiert wird, könnte die Anwendungslogik zum Zuordnen einer Instanz von Hook ZipHook unter Verwendung der Methode sendFormLetter() folgendermaßen aussehen:

Connection con = DriverManager.getConnection(...);                    1 
ZipHook zHook = new ZipHook();                               2 
Data db = DataFactory.getData(NotSpam.class, con, zHook);    3 

Der Code führt die folgenden Schritte aus:

  1. Stellt eine Verbindung zur Datenbank her.
  2. Erstellt eine Instanz der Implementierung der Schnittstelle ZipHook.
  3. Erstellt eine Instanz der Implementierung der Schnittstelle Data. Durch diese Implementierung wird die Schnittstelle NotSpam implementiert, und ihr wird Hook ZipHook zugeordnet.

Feedback