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);
}
}