Création et exécution de méthodes Hook s'exécutant avant et après les méthodes intégrées ou annotées.

Vous pouvez utiliser l'interface com.ibm.pdq.runtime.statement.Hook pour créer des méthodes qui s'exécuteront avant et après les méthodes intégrées ou annotées.
Si un objet Data utilisé par des méthodes intégrées ou une implémentation générée d'une interface annotée possède un Hook enregistré, les étapes suivantes se déroulent lorsqu'une application appelle une méthode :

L'interface Data, qui définit les méthodes intégrées, contient un certain nombre de méthodes JDBC sur des objets Connection, tels que close(), commit(), rollback(), setAutoCommit() et getAutoCommit(). Vous ne pouvez pas encapsuler ces méthodes par les méthodes pre() et post().

Exemple

Par exemple, la méthode annotée sendFormLetter() possède un paramètre int qui fournit le code identifiant un formulaire de lettre à utiliser. La méthode contient également des paramètres String qui fournissent des informations à intégrer au formulaire ainsi que la ville, l'état et le code postal de l'adresse de destination du formulaire. Enfin, la méthode sendFormLetter() met à jour une table qui surveille si une lettre doit être imprimée et envoyée.

Supposons qu'une application qui appelle la méthode sendFormLetter() ne puisse pas fournir la ville, l'état ou le code postal, ou éventuellement ne fournisse que deux de ces trois éléments. Vous souhaitez écrire une logique d'application qui vérifie la présence de ces trois valeurs, mais vous ne pouvez pas le faire facilement dans la base de données et cette opération est impossible dans la définition de la méthode sendFormLetter(). Vous pouvez écrire cette logique d'application dans un Hook que vous pourriez définir ainsi :

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"))
      { // méthode correcte ; les paramètres 2,3, & 4 sont 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;  // aucune action
  }
}
  1. Importez le package contenant l'interface Hook.
  2. Définissez la méthode pre().
    String methodName
    pureQuery transmet la signature de la méthode à la méthode pre().
    Data dataInstance
    pureQuery transmet l'objet qui implémente l'interface Data.
    SqlStatementType sqlStatementType
    pureQuery transmet le type de l'instruction SQL : SELECT, UPDATE, INSERT, etc.
    Object... parameters
    pureQuery transmet les paramètres qui sont communiqués à la méthode sendFormLetter().
  3. Fournissez la logique permettant de trouver la ville ou l'état en indiquant le code postal, ou de trouver le code postal en indiquant la ville et l'état. Mettez à jour les paramètres avant de les transmettre à la méthode sendFormLetter().
  4. Définissez la méthode post() pour ne rien faire.

Si la méthode sendFormLetter() est définie dans l'interface com.company.NotSpam, la logique d'application permettant d'associer une instance de Hook ZipHook avec l'utilisation de la méthode sendFormLetter() peut se présenter comme suit :

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

Le code effectue les opérations suivantes :

  1. Création d'une connexion à la base de données.
  2. Création d'une instance de l'implémentation de l'interface ZipHook.
  3. Création d'une instance de l'implémentation de l'interface Data. Cette dernière implémente l'interface NotSpam et est associée au Hook ZipHook.

Commentaires