Ici comme pour les ressources et l’internationalisation vous pourrez réaliser les exercices de différentes manières:
-
en architecture modulaire ou non (commencer par l’option "non modulaire")
-
avec un déploiement sur fichier ou en jar.
Exercices
Recherche dynamique du service de Catalogue
L’objectif est de consulter le catalogue de Vehicule
s
à partir de l’interface graphique QuestionReponse
.
Si on a bien assimilé le fonctionnement de cette interface graphique
on comprendra qu’il faudra écrire un Repondeur
qui recevra une partie
de la marque du Véhicule et qui devra rendre une chaine listant les
véhicules correspondants.
Ce Repondeur
a une particularité: il ne connait pas l’implantation
du CatalogueVehicule2
(on a ici mis un numero pour le distinguer
d’une autre version de CatalogueVehicule
mais vous n'êtes pas obligés de recopier exactement
ce détail).
//changer le package si nécessaire
package com.garaje.commons;
import java.util.Iterator;
public interface CatalogueVehicule2 extends Iterable<Vehicule>{
// autres méthodes (voir par exemple CatalogueVehicule et critère de recherche)
Iterator<Vehicule> get(String masqueMarque);
}
Il va donc chercher le service correspondant.
-
Ecrire (si vous ne l’avez pas déjà fait lors d’un exercice précédent) un code simulacre qui implante l’interface.
-
Ecrire le
RepondeurCatalogueVehicule
qui fait cette recherche de service et qui fait la recherche des véhicules correspondant à la requête. -
Mettre en place la configuration qui permettra de trouver le code simulacre écrit précédemment.
-
Modifier le
main
de lancement pour lui passer le bonRepondeur
Propositions de solutions:
-
fichier de configuration (dans
META-INF/services/com.garaje.commons.CatalogueVehicule2
Reprendre ensuite l’exercice avec une architecture modulaire et écrire des directives uses
et provides
.
Exemples
Recherche dynamique du service de Catalogue
package com.garaje.simulacres;
import com.garaje.commons.CatalogueVehicule2;
import com.garaje.commons.Vehicule;
import com.garaje.deploy.Moto;
import com.garaje.deploy.Voiture;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class PseudoCatalogue2 implements CatalogueVehicule2 {
static Vehicule[] tableauBidon = {
new Voiture("EZ44", "Wartburg", "1020", 425, 220),
new Moto("HHX", "Mamuth", "986", 160, 120), //etc, etc...
};
public Vehicule[] getVehicules() {
return tableauBidon ;
}
private List<Vehicule> liste = Arrays.asList(getVehicules());
@Override
public Iterator<Vehicule> get(String masqueMarque) {
ArrayList<Vehicule> res = new ArrayList<Vehicule>();
for (Vehicule vehicule : liste) {
// serait plus performant de simplement parcourir le tableau
// ceci est juste pour exemple
if (vehicule.getMarque().contains(masqueMarque)) {
res.add(vehicule);
}
}
return res.iterator();
}
@Override
public Iterator<Vehicule> iterator() {
return liste.iterator();
}
}
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;
public class RepondeurCatalogueVehicule 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 RepondeurCatalogueVehicule() {
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);
while(it.hasNext()){
stb.append(it.next()).append('\n');
}
return stb.toString();
}
}
# classe qui implante le catalogue
com.garaje.simulacres.PseudoCatalogue2
#com.garaje.simulacres.PseudoCatalogue2bis
package com.garaje.testservice;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import org.labs.ihm.QuestionReponse;
import org.labs.ihm.Repondeur;
public class LanceurCatalogue {
public static void main(String[] args) throws Exception {
final Frame fen = new Frame("catalogue de Véhicules");
Repondeur repondeur = new RepondeurCatalogueVehicule() ;
fen.add(new QuestionReponse("tapez ci après partie de la marque... ", repondeur));
fen.pack() ;
fen.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt){
fen.dispose() ;
}
});
fen.setVisible(true);
}
}