Maverick & CookXML BELKHADRA Sofiane BERNABE Thomas RESSE Romain Présentation Etant donné que nous avons déjà fait une présentation succincte des deux frameworks utilisés, nous n’allons pas nous étendre de nouveau sur le sujet ; nous parlerons surtout de l’utilisation de ces frameworks et des problèmes que nous avons rencontrés. Ce rapport est un complément à la présentation que nous avons faite vendredi 15 mai. Maverick Comme nous l’avions dit lors de la présentation, maverick était apparemment un framework simple d’utilisation, étant donné qu’il suffisait d’ajouter le maverick.jar aux librairies web et qu’il fallait juste configurer un maverick.xml afin que ce framework fonctionne. Nous nous sommes basés sur l’exemple qui était disponible sur le site de maverick, à savoir le friendbook-jsp, permettant de gérer une sorte d’annuaire, ou plutôt un réseau social. Malheureusement, ceci n’a pas fonctionné pour nous, car nous avons eu un problème directement au niveau de la servlet fournie dans le maverick : la servlet Dispatcher est indisponible. Cette erreur est revenue sur plusieurs autres groupes. Cependant, chez certains autres, maverick est fonctionnel. A savoir que ces groupes nous ont gracieusement aidé notamment en nous donnant un fichier war de test maverick (test de liens avec maverick, ce programme devait afficher un lien, qui lorsqu’il était sélectionné, renvoyait vers un .m qui permettait d’obtenir la nouvelle page jsp…), mais cela n’a pas fonctionné et nous avons encore une fois rencontré la même erreur… De plus, il n’existe que très peu de documentation liée à maverick sur le net, vu que ce framework n’est pas si utilisé que ça. Effectivement, nous avons activement recherché les erreurs possibles du servlet Dispatcher mais il n’y a aucunes réponses viables à ce problème sur internet… Suite à cela, nous avons donc décidé de coder nous même nos propres servlets et jsp afin de faire fonctionner le deuxième framework que nous avons choisit : cookXML Voici le code du maverick.xml : <?xml version="1.0"?> <maverick version="2.0" default-view-type="document" default-transform-type="document"> <views> <view id="loginRequired" path="loginRequired.jsp"> <transform path="trimOutside.jsp"/> </view> </views> <commands> <command name="welcome"> <view path="welcome.jsp"> <transform path="trimOutside.jsp"/> </view> </command> <command name="loginSubmit"> <controller class="controlleurs.LoginSubmit" /> <view name="success" type="redirect"/> <view name="error" path="loginFailed.jsp"> <transform path="trimOutside.jsp"/> </view> </command> <command name="signup"> <view path="signup.jsp"> <transform path="trimOutside.jsp"/> </view> </command> <command name="signupSubmit"> <controller class="controlleurs.SignupSubmit"/> <view name="success" type="redirect" path="edit.m"/> <view name="error" path="signup.jsp"> <transform path="trimOutside.jsp"/> </view> </command> <command name="edit"> <controller class="controlleurs.Edit"/> <view ref="loginRequired"/> <view name="success" path="edit.jsp"> <transform path="trimInside.jsp"/> </view> </command> <command name="editSubmit"> <controller class="controlleurs.EditSubmit"/> <view ref="loginRequired"/> <view name="success" type="redirect" path="friends.m"/> </command> <command name="addFriend"> <controller class="controlleurs.EditFriend"/> <view ref="loginRequired"/> <view name="success" type="redirect" path="friends.m"/> </command> <command name="changePassword"> <controller class="controlleurs.ChangePassword"/> <view ref="loginRequired"/> <view name="success" path="changePassword.jsp"> <transform path="trimInside.jsp"/> </view> </command> <command name="changePasswordSubmit"> <controller class="controlleurs.ChangePasswordSubmit"/> <view ref="loginRequired"/> <view name="success" type="redirect" path="friends.m"/> <view name="error" path="changePassword.jsp"> <transform path="trimInside.jsp"/> </view> </command> <command name="logout"> <controller class="controlleurs.Logout"/> <view ref="loginRequired"/> <view name="success" type="redirect" path="welcome.m"/> </command> <command name="friends"> <controller class="controlleurs.Friends"/> <view ref="loginRequired"/> <view name="success" path="friends.jsp"> <transform path="trimInside.jsp"/> </view> </command> </commands> </maverick> CookXML CookXML est un framework qui permet de créer des instances de classes java (objets) à partir de xml suivant ses tags. Cependant CookXML ne fonctionne que dans un seul sens, à savoir créer du java objet à partir du xml mais pas l’inverse, nous ne pouvions donc pas ajouter les fonctionnalités d’ajout, de suppression et de modification d’un contact. Voici l’arborescence du projet : Nous avons donc importé le package cookxml.jar et nous avons créé un Creator, indispensable à son fonctionnement. La mise en place de cookxml est très simple lorsque l’on a compris comment fonctionnaient les creators, adders, setters et converters. Voici le code de la classe Converter : package cookXML; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import modele.Adresse; import modele.Annuaire; import modele.Contact; import modele.Email; import modele.Telephone; import modele.User; import modele.Utilisateur; import cookxml.core.CookXml; import cookxml.core.adder.DefaultAdder; import cookxml.core.creator.DefaultCreator; import cookxml.core.setter.DefaultSetter; import cookxml.core.taglibrary.SingleNSTagLibrary; public class Creator { SingleNSTagLibrary libUser; SingleNSTagLibrary libContact; Annuaire annuaire; User user; public Creator() { SingleNSTagLibrary tagContact = new SingleNSTagLibrary(); SingleNSTagLibrary tagUser = new SingleNSTagLibrary(); tagContact.setCreator("annuaire", DefaultCreator .getCreator(Annuaire.class)); tagContact.setCreator("contact", DefaultCreator .getCreator(Contact.class)); tagContact.setCreator("email", DefaultCreator.getCreator(Email.class)); tagContact .setCreator("tel", DefaultCreator.getCreator(Telephone.class)); tagContact.setCreator("adresse", DefaultCreator .getCreator(Adresse.class)); tagContact.setSetter(null, null, DefaultSetter.getInstance()); tagContact.setAdder(null, DefaultAdder.getInstance()); libContact = tagContact; tagUser.setCreator("user", DefaultCreator.getCreator(User.class)); tagUser.setCreator("utilisateur", DefaultCreator.getCreator(Utilisateur.class)); tagUser.setSetter(null, null, DefaultSetter.getInstance()); tagUser.setAdder(null, DefaultAdder.getInstance()); libUser = tagUser; } public void createObject() throws IOException { try { DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); CookXml cookXmlContact = new CookXml(builder, libContact, (Object) null); annuaire = (Annuaire) cookXmlContact.xmlDecode("C:\\teste.xml"); CookXml cookXmlUser = new CookXml(builder, libUser, (Object) null); user = (User) cookXmlUser.xmlDecode("C:\\utilisateur.xml"); } catch (Exception ex) { ex.printStackTrace(); } } public Annuaire getAnnuaire() { return annuaire; } public User getUser() { return user; } public void afficherAnnuaire(Annuaire annuaire) { System.out.println(annuaire); System.out.println("Nom de l'annuaire : " + annuaire.getName()); for (int i = 0; i < annuaire.getContactList().size(); i++) { System.out.println("Annuaire " + i); for (int j = 0; j < annuaire.getContactList().get(i) .getAdresseList().size(); j++) { System.out.println("Valeur de adresse : " + annuaire.getContactList().get(i).getAdresseList() .get(j).getValeur()); } for (int j = 0; j < annuaire.getContactList().get(i).getMailList() .size(); j++) { System.out.println("Valeur de mail : " + annuaire.getContactList().get(i).getMailList().get(j) .getValeur()); } for (int j = 0; j < annuaire.getContactList().get(i).getPhoneList() .size(); j++) { System.out.println("Valeur de telephone : " + annuaire.getContactList().get(i).getPhoneList() .get(0).getValeur()); } System.out.println("Valeur de nom : " + annuaire.getContactList().get(i).getNom()); System.out.println("Valeur de prenom : " + annuaire.getContactList().get(i).getPrenom()); System.out.println("Valeur de sexe : " + annuaire.getContactList().get(i).getSexe()); } } public void afficherUser(User user){ System.out.println(user); for(int i = 0; i < user.getUtiliList().size();i++){ System.out.println("Utilisateur " + i); System.out.println("Valeur de log "+user.getUtiliList().get(i).getLog()); System.out.println("Valeur de pass "+user.getUtiliList().get(i).getPass()); System.out.println("Valeur de estAdmin "+user.getUtiliList().get(i).getEstAdmin()); } } } On créé donc des objets à partir des xml grâce à ces caractéristiques de cookXML. Creators : lie le tag du nœud à une classe java. Adders : lie un objet à un autre objet (nœuds imbriqués). Utilise par défaut la méthode add(Object objet). Setters : récupère les paramètres des nœuds. Utilise par défaut la méthode setValeur(). Converters : Nous n’en avons pas utilisé, mais ceux-ci servent à convertir certaines informations dont on a besoin, juste en ajoutant un objet de type converter. Il faut tout de même savoir qu’il faut une classe java par nœud contenus dans le xml. Il faut de plus que ces classes aient un constructeur vide et une fonction add qui permet d’ajouter des objets java. Comme vous l’avez vu lors de la présentation, cela fonctionne bien. Le seul problème est celui de la redirection lorsque l’on entre un faux couple login/pass… Conclusion Nous avons donc réalisé ce projet en partie, mais ceci ne dépendait pas forcément de notre bon vouloir ; les deux frameworks que nous avons choisit ne sont pas encore finalisés et ne sont pas près de l’être vu qu’ils sont très peu utilisés et que d’autres font bien mieux qu’eux tout en étant beaucoup plus simple d’utilisation (plus besoin de coder une classe entière par exemple si l’on remplace cookXML… mais ceci est une autre histoire.). Info importante Placer les test.xml et utilisateur.xml à la racine du disque C:/.