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 Vehicules à 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 bon Repondeur

Propositions de solutions:

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