Salut !
Je suis en train de faire un projet sur l'utilisation de Proxy en Java !
Ce projet consiste à gérer une liste distante située sur un serveur web.
L'accès à cette liste se fait via un code java qui utilise un proxy et qui envoie une url paramétrée de la forme http://monServeur.fr/liste.html?nom=liste_001&commande=ajouter&elt=item1.
Cette url servira donc à exécuter la commande/méthode ajouter sur la liste nommée liste_001, pour insérer l'élément item1.
Selon l'architecture du patron (design pattern) "Procuration/Proxy" on nous demande de coder le proxy de façon à filtrer les méthodes à la volée. Soit, on a une liste de méthodes (ex. ajouter(), retirer(), vider(), toString(), taille() ...) qu'on doit examiner à chaque fois qu'une commande/méthode est invoquée dans l'url.
En autre, les noms des méthodes autorisées sont transmis lors de la création du mandataire, celui-ci lèvera une exception du type IllegalAccessException si on tente d'accéder via une méthode non-autorisée.
Voici comment se présente mon programme :
J'ai une classe :
------------------------------------------------------------------
Code :
private Liste<String> listeProxy; private Liste<String> listeInitiale; private String[] methods = null ; /** * Crée une liste distante nommée accessible via le réseau. * Cette liste dispose d'un filtre de méthodes qui, seront * passées en paramètres. * * @param String[] methodesAutorisees - Liste des méthodes autorisées. */ public ListeProxyAvecFiltrage (String[] methodesAutorisees ) { // Liste locale this.listeInitiale = new ListeImpl(); // Liste distante this.listeProxy = new ListeProxyHttp("liste_830605" ); // Liste des méthodes autorisées à l'invocation. this.methods = methodesAutorisees; } /** * Inspecte si une méthode est présente dans une liste donnée de méthodes. * * @param String[] listOfMethods - Représente la liste de méthodes * @param String element - L'élément dont il faut vérifier la présence * @return boolean - VRAI si l'élément est dans la liste de méthodes, FAUX sinon */ private boolean contains (String[] listOfMethods, String element ) { { if(element.equals(e)){ return true; } } return false; } /** * Ajoute un élément dans la liste. * * @return boolean - VRAI si l'élément est ajouté dans la liste, FAUX sinon. * @param String elt - L'élément à ajouter. */ public boolean ajouter (String elt ){ return listeProxy.ajouter(elt); } /** * Vide la liste. * * @return boolean - VRAI si la liste s'est vidée complètement, FAUX sinon. */ public boolean vider(){ return listeProxy.vider(); } // Idem pour les méthodes retirer(), taille(), toString(), estPresent() ... }
|
------------------------------------------------------------------
dont la méthode invoke() s'écrit comme suit :
------------------------------------------------------------------
Code :
{ try { if( contains(this.methods, m.getName()) ){ System. out. println("Invocation autorisée de |" + m.getDeclaringClass().getName() + "|." + m.getName()); return m.invoke(this, args); } else{ System. out. println("Invocation non-autorisée de |" + m.getDeclaringClass().getName() + "|." + m.getName()); + m.getDeclaringClass().getName() + "|." + m.getName() ); } } // catch(InvocationTargetException ite) // { System.out.println("<InvocationTargetException> levée dans l'invocation de " + m.getName()); } // catch(IllegalArgumentException iae) // { System.out.println("<IllegalArgumentException> levée dans l'invocation de " + m.getName()); } // catch(NullPointerException npe) // { System.out.println("<NullPointerException> levée dans l'invocation de " + m.getName()); } { ("<IllegalAccessException> propagée dans l'invocation de " + m.getName() + "\nCause : " + t.getCause()); } }
|
------------------------------------------------------------------
Quand je crée le proxy dans le programme de test de JUnit je mets :
------------------------------------------------------------------
Code :
public class ListeProxyAvecFiltrageTest extends junit.framework.TestCase{ public void testAccesRestreint () throws Exception{ Liste<String> l = new ListeProxyAvecFiltrage( new String[]{"ajouter", "estPresent", "taille", "toString"}); Liste<String> lpaf = (Liste<String> )Proxy. newProxyInstance( Liste.class.getClassLoader(), new Class[]{Liste.class}, (ListeProxyAvecFiltrage)l); lpaf.ajouter("titi" ); lpaf.ajouter("toto" ); System. out. println("Ma liste avant vider() : " + lpaf ); assertTrue(lpaf.taille() == 2); try{ lpaf.vider(); fail("Attention, une exception est attendue ici !" ); } System. out. println("|Throwable| t : " + t. getCause()); t.printStackTrace(); System. out. println("t est-il une instance de IllegalAccessException ? " // Ici l'assertion retourne toujours faux à l'exécution // ce qui fait échouer les tests !!!! } } }
|
------------------------------------------------------------------
En exécutant le programme, le résultat donne :
Code :
Invocation autorisée de |question1.Liste|.ajouter Invocation autorisée de |question1.Liste|.ajouter Invocation autorisée de |java.lang.Object|.toString Liste.toString() avant vider() : |titi, toto| Invocation autorisée de |question1.Liste|.taille Invocation non-autorisée de |question1.Liste|.vider |Throwable| t : java. lang. IllegalAccessException: <IllegalAccessException> propagée dans l 'invocation de viderCause : null t instance de IllegalAccessException ? false
|
Et le Stack Trace donne :
Code :
at $Proxy0.vider(Unknown Source) at question2.ListeProxyAvecFiltrageTest.testAccesRestreint(ListeProxyAvecFiltrageTest.java:26) at sun. reflect. NativeMethodAccessorImpl. invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at bluej.runtime.RemoteTestRunner.doRun(RemoteTestRunner.java:48) at bluej.runtime.ExecServer.runTestMethod(ExecServer.java:680) at bluej.runtime.ExecServer.access$700(ExecServer.java:37) at bluej.runtime.ExecServer$3.run(ExecServer.java:882) Cause : null at question2.ListeProxyAvecFiltrage.invoke(ListeProxyAvecFiltrage.java:73) ... 18 more
|
Alors la question que je me pose est la suivante :
Comment est-ce qu'on peut faire en sorte que l'exception propagée soit une instance de la classe IllegalAccessException ? Si l'instance est bonne l'assertion est vérifiée normalement ! Les tests réussissent alors !
Il se trouve que les exceptions ont été traitées correctement (selon moi) ici, mais malheureusement il y en a une qui me cause problème c'est UndeclaredThrowableException ! Quelles solutions existe-t-il pour ce genre de problème ?
Merci d'avance pour votre aide !
Voila !
malinski2006
Message édité par malinski2006 le 20-04-2007 à 20:48:16