Exercices

Bien que ça ne soit pas toujours le cas nous vous conseillons de mettre en place un Logger au niveau d’un package.

Gestion d’une trace simple

Bien que les opérations de logging soient plutot courantes pour émettre des rapports d’erreurs nous allons dans cet exercice réaliser des traces d’exécution (pour journalisation).

Exercice préliminaire: créer une classe de portée package PackCst qui centralise tout ce qui concerne le package. Ici nous créerons le Logger du package qui sera utilisé par les autres classes (au moyen d’un import static) .

Reprendre le code Repondeur et pour chaque demande tracer la chaîne passée en paramètre et le nombre de réponses (utiliser le niveau INFO pour ces traces).

Propositions de solution:

Modification du comportement de trace au déploiement

Ici on reste dans une configuration spécifique à java.util.logging

Cela se fait normalement dans un code de déploiement. Pour simplifier nous allons ici utiliser un fichier de configuration (en réalité : peu commode sous Java).

Copier le fichier logging.properties situé dans le répertoire jre.lib de votre installation java dans le répertoire dans lequel vous allez exécuter votre code.

Modifier cette copie de fichier de manière à ce que la trace s’inscrive dans un fichier en XML.

Lancer l’exécution avec l’option -Djava.util.logging.config.file=logging.properties.

Consulter le fichier java0.log dans votre répertoire d’accueil.

Exemples

Gestion d’une trace simple

package com.garaje.testservice;

/**
 * classe de concentration des constantes et utilitaires du package
 *
 */
class PackCst {
   static final System.Logger CURLOG = System.getLogger("com.garaje.testservice") ;

}
package com.garaje.testservice;
import com.garaje.commons.CatalogueVehicule2;
import com.garaje.commons.Vehicule;
import org.labs.ihm.Repondeur;

import java.util.Iterator;
import java.util.ServiceLoader;
import java.lang.System.Logger.Level;

import static com.garaje.testservice.PackCst.CURLOG;

public class RepondeurCatalogueVehicule3 implements Repondeur {
   static CatalogueVehicule2 catalogue ;
    /*
      * @throws ServiceConfigurationError si META-INF/services incorrectement configuré
      */
    static {
        ServiceLoader<CatalogueVehicule2> loader = ServiceLoader.load(CatalogueVehicule2.class);
        for(CatalogueVehicule2 cat : loader){
            catalogue = cat ;
            break ; // bizarre mais ok
        }
    }
   public RepondeurCatalogueVehicule3() {
      super();
      // recherche du service CatalogueVehicule faite au load-time
   }


/**
 * Voir critique générale de cette méthode (pour parcourir des résultats)
 */
   @Override
   public String repondA(String question) throws Exception {
      StringBuilder stb = new StringBuilder() ;
      Iterator<Vehicule> it = catalogue.get(question);
      int nbRes = 0 ;
      while(it.hasNext()){
         stb.append(it.next()).append('\n');
         nbRes++ ;
      }
      CURLOG.log(Level.INFO,"demande de: " + question + "; nbRéponse:" + nbRes);
      return stb.toString();
   }

}
package com.garaje.testservice;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ResourceBundle;

import org.labs.ihm.QuestionReponse;
import org.labs.ihm.Repondeur;


public class LanceurCatalogue3 {
 public static void main(String[] args) throws Exception {
          ResourceBundle bundle = ResourceBundle.getBundle(
          "com.garaje.testservice.config.messages");
          String messVehiculeCatalogue = bundle.getString("vehicleCatalog");
          String messInvite = bundle.getString("pleaseType");

          final Frame fen = new Frame(messVehiculeCatalogue);
          Repondeur repondeur = new RepondeurCatalogueVehicule3() ;
          fen.add(new QuestionReponse(messInvite, repondeur));
          fen.pack() ;
          fen.addWindowListener(new WindowAdapter(){
              public void windowClosing(WindowEvent evt){
                        fen.dispose() ;
                    }
           });
          fen.setVisible(true);
    }
}