HOWTO développement Sashipa

 

 Supprimer en cascade avec Sashipa-Melba.

Votre utilisateur en a marre de supprimer un à un tous les enregistrements dépendants pour pouvoir supprimer une fiche. Il préfèrerait que tous les enregistrements dépendants soient supprimés en lot lors de la suppression de la fiche.

 

Avertissement !

Cette opération n'est pas implémentée par le convertisseur Sashipa vers Melba. Il faut donc retoucher à la main un des fichiers Java générés, puis recompiler. Cette opération reste donc réservée aux initiés à Java.

De plus il faudra re-modifier le fichier généré à chaque fois qu'il sera modifié. Dans le cas d'une architecture client-database, cette opération sera le plus souvent trop lourde pour être intéressante. Mais elle reste envisageable avec une architecture client-servlet-database car le fichier retouché est celui de la servlet. La servlet ne doit être mise à jour que lors d'un changement dans les parties environnement ou architecture du code Sashipa.

 

Etape 1 : récupérer le source approprié

Voici la marche à suivre :

  • a) Générez votre application.

  • b) Récupérez le fichier source Java dans <melbalab-home>/work/src_java/. Si vous êtes en architecture clientDatabase, c'est l'unique fichier Java. Sinon, c'est le fichier Java de la servlet.

  • c) Editez-le avec un éditeur qui accepte le caractère LF comme retour chariot (ie. pas notepad !) et recherchez la classe qui hérite de PacketFromClientAnalyser.

Il nous faut maintenant ajouter le code Java pour la suppression en cascade.

 

Etape 2 : Modifier le code Java

Certaines méthodes de la classe XxxAnalyser renvoient la valeur null. Parmi celles-là, une méthode doActionBeforeExecute attend en paramètre une requête de suppression (object MpDeleteQuery). Nous allons ajouter notre code dans cette méthode.

Dans notre exemple, nous souhaitons que les adresses du contact à supprimer, soient supprimées avec le contact.

  protected String doActionBeforeExecute(
        ClientSession session, MpDeleteQuery query, 
        MpBufferUpdate bufferUpdate
        ) throws FatalException { 
    String dbTable = query.getSchemaTable();
    if (dbTable.equalsIgnoreCase("CONTACT")) {
      try {
        ConstList lstPkValue = query.getPkValueList();
        for (int i=0; i < lstPkValue.size(); i++) {
          MpPkValue pkValue = (MpPkValue) lstPkValue.get(i);
          // - delete dependencies in CONTACTADRESSE
          deleteDependentRecord(
            query.getDbms(), query.getDatabase(),
            "CONTACTADRESSE",
            new String[] {"ContactRef"},
            pkValue, 
            bufferUpdate
          );
        }
        return null;            // ok, no error
      }
      catch (Throwable x) {
        return "Erreur lors de la suppression des adresses par" +
               " lot.\n\n" + x.getMessage();
      }
    }
    return null;
  }

La méthode renvoie null si elle ne voit pas d'inconvénient à ce que la suppression principale ait lieue. Autrement elle renvoit un message d'erreur ce qui stoppera le processus de suppression, puis le message sera journalisé et remonté à l'utilisateur.

Un objet MpDeleteQuery contient un ensemble de valeurs de clef primaire à supprimer. Dans notre code nous exécutons une requête de suppression de type "DELETE FROM CONTACTADRESSE WHERE ContactRef=XXX" pour chaque valeur de clef primaire, XXX étant la valeur de clef primaire. Pour info on travaille sur des tableaux pour prendre en compte les cas de clefs complexes.

 

Etape 3 : Compiler

La marche à suivre :

  • a) Puisque vous venez de générer votre application, vous disposez du fichier <melbalab-home>/work/classes/melba_classes.jar.

  • b) Il faut inclure ce fichier dans le class-path de la compilation. Si vous travaillez sans environnement de développement, votre commande shell ressemblera à ceci :
    javac -classpath .;"<melbalab>/work/classes/melba_classes.jar;chemin_vers_servlet.jar" MonFichier.java
    
    Note : penser à remplacer le point-virgule (;) par deux points (:) sous Linux.

  • c) Si vous êtes en mode client-servlet-database, vous aurez juste à copier les fichiers .class générés au bon endroit sur votre serveur de servlets. Si vous êtes en mode client-database, il vous faudra encore regénérer un fichier jar (cf commande jar du jdk).

Une fois l'opération terminée, une bonne habitude est de faire un copier/coller du code de votre méthode Java, dans un commentaire à la fin de votre fichier source XML.

 

Et voilà ! Un peu compliqué mais bon, ça existe...

 

© Copyright 2003 Sashipa-Melba Team. Ce document de la technologie Sashipa-Melba est sous licence GNU FDL Vous pouvez le copier et modifier librement les copies tant que cette mention apparaît clairement.