tp6

Le pattern Proxy (mandataire)

Lectures préalables : le pattern Proxy


Un mandataire "HTTP"

Question :
Selon le patron "Procuration/Proxy", installez un mandataire (classe ListeProxyHttp) qui pour chaque opération sur la liste locale (classe ListeImpl) engendre cette même opération sur la liste distante associée.
Si une incohérence entre la liste locale et la liste distante est détectée, une exception sera levée.

 

Le mandataire demandé : la classe ListeProxyHttp,

 

Pour cette question vous disposez :

Exemple 1 :

Liste<String> liste = new ListeProxyHttp("liste_777");
liste.ajouter("essai");

déclenche la méthode ajouter sur la liste locale et effectue une requête avec l'URL ci dessous
http://pc5357c.esiee.fr:8788/tests/tp_proxy.html?nom=liste_777&commande=ajouter&elt=essai

dans laquelle le paramètre nom représente un identifiant de cette liste, le paramètre commande reflète l'action choisie et elt l'élément

Exemple 2 :

Une ébauche possible de la méthode ajouter
public boolean ajouter(String elt){
  // requête au protocole HTTP, liste distante
  Connexion connect = new Connexion(this.url,"nom=" + this.nom
                                    + "&commande=ajouter&elt="+ elt);
  Boolean resultatLocal = liste.ajouter(elt);

  String resultatDistant = // le résultat de la connexion
  //si le resultatLocal est différent du resultatDistant
alors levée de CoherenceListeException("ajouter");
return resultatLocal; }
AIDE : On peut comparer les 2 résultats sous forme de booléens ou sous forme de String.
Attention !   == compare les références alors que equals() compare bien le contenu des objets.

Récapitulatif des associations méthodes Java / requêtes HTTP :

  • Le site gestionnaire est en http://pc5357c.esiee.fr:8788/tests/tp_proxy.html

méthodes "java"

http://pc5357c.esiee.fr:8788/tests/tp_proxy.html

Formulaires HTML

public boolean ajouter(E elt); nom=liste_777&commande=ajouter&elt=essai

nom : elt :

public boolean retirer(E elt); nom=liste_777&commande=retirer&elt=essai

nom : elt :

public boolean vider(); nom=liste_777&commande=vider

nom :

public boolean estPresent(E elt); nom=liste_777&commande=estPresent&elt=essai

nom : elt :

public int taille(); nom=liste_777&commande=taille

nom :

public Iterator<E> iterator(); non implémentée  
public String toString(); nom=liste_777&commande=toString

nom :

notez que

  1. Les données manipulées sont des "String", limitées à cette expression régulière : [A-Za-z0-9]+
  2. Toute requête engendre la création de la liste distante, si celle-ci n'existait pas encore sur le serveur
  3. L'identifiant associé à votre liste doit être unique, choisissez plutôt un nom comme : "liste_XXXXXX", où XXXXXX est un nombre à 6 chiffres ( les listes sont placées dans la même table de la base de données côté serveur).

La présence d'un identifiant dans cette table peut être vérifiée avec ce test

identifiant :
Soumettre cette question à JNews.


Un nouveau mandataire

Toujours selon, l'architecture du patron "Procuration/Proxy", proposer un nouveau mandataire qui filtre le nom des méthodes. Les noms de ces méthodes sont définis à l'exécution, ce mandataire utilise les classes "DynamicProxy".

Les noms des méthodes autorisés sont transmis lors de la création du mandataire, celui-ci lève une exception de type IllegalAccessException si une tentative d'accès est effectuée sur une méthode inhibée.

Lire attentivement la classe de tests

 

Exemple d'utilisation d'une liste avec un accès restreint : seules les méthodes "ajouter,estPresent,taille,toString" sont permises

            public void testAccesRestreint1() throws Exception{

              String méthodesPermises[] = new String[]{"ajouter","estPresent","taille","toString"};

                        Liste<String> liste =  DynamicProxyFiltre.getProxy(new ListeImpl("listeA"), méthodesPermises);

                        try{

                          liste.ajouter("test");

                          liste.ajouter("test2");

                        }catch(Exception e){

                          fail("une exception pour une méthode autorisée ???");

                        }

                        assertTrue(liste.taille()==2);

                        try{

                          liste.vider();

                          fail("une exception est attendue pour une méthode inhibée !");

                        }catch(Throwable e){

                          assertTrue( "IllegalAccessException est attendue ?", e.getCause() instanceof IllegalAccessException);

                        }

            }

Document conseillé pour la réalisation :

Soumettre cette question à JNews.