1 / 48

Xooctory – Projet GL

Xooctory – Projet GL. Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN. Présentation de l’application Architecture adoptée Refactoring et utilisation de Triplesec Réalisation de la persistance en base (Hibernate)

pearl
Download Presentation

Xooctory – Projet GL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIAMatthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

  2. Présentation de l’application Architecture adoptée Refactoring et utilisation de Triplesec Réalisation de la persistance en base (Hibernate) Configuration de l’application (Spring) Tests unitaires Conclusion Plan

  3. Présentation du projet

  4. Objectif du projet (1/2) Etat actuel de l’application : Application Persistance LDAP

  5. Objectif du projet (2/2) Etat souhaité de l’application : Application Persistance Persistance LDAP Base de données

  6. Outils utilisés Wicket : Framework Web permettant de développer des pages HTML dynamiques en Java Utilisée pour les IHM Compréhension nécessaire pour pouvoir l’utiliser Hibernate : Outil de mapping objet-relationnel Conseillé par notre client Spring : Outil utile pour les configurations de l’application Triplesec : Permet la communication avec un serveur LDAP

  7. Organisation du travail Conception Réalisation découpé en 2 sous-équipes : Un binôme sur Wicket et Triplesec Un trinôme sur Spring et Hibernate Tests

  8. Architecture des paquetages (1/2)

  9. Architecture des paquetages (2/2) Réorganisation des paquetages Séparation des couches métier, vue et persistance

  10. Architecture des classes (1/3) Actuellement : Utilisation de classes Triplesec dans les éléments utilisés par Wicket : Modèles et Panels Utilisation de modèles : adaptateur des données de la couche métier aux composants de Wicket Composants de Wicket : objets permettant de modéliser un élément d’affichage Ex : wicket.markup.html.form.Button représente un bouton

  11. Architecture des classes (2/3) Exemple des rôles dans l'application existante : Conséquences : • Modification de ces éléments afin qu’ils ne fassent pas appel à Triplesec (directement ou indirectement) • Ajout d’une couche d’abstraction

  12. Architecture des classes (3/3) Exemple des rôles :

  13. Refactoring - Méthodologie Extraction du code spécifique à Triplesec dans les classes Analyse du service rendu par ces portions de code Création de l’interface Remplacement du code spécifique à Triplesec par des appels aux méthodes de l’interface Déplacement du code spécifique à Triplesec afin d’implémenter les méthodes de l’interface

  14. Refactoring (1/3) Paquetage : org.xoocode.xooctory.web Configuration de l’application Panels Mise en place de l’arborescence Code spécifique à Triplesec

  15. Refactoring (2/3) Code spécifique à Triplesec • Fonction du code Triplesec : • Sauvegarde • Suppression • Récupération de toutes les instances stockées dans la couche de persistance • Objets Triplesec : • Equivalent aux modèles définies

  16. Refactoring (3/3) Code initial Code spécifique à Triplesec Code équivalent utilisant les fonctions de l’interface Code indépendant

  17. Refactoring – Exemple (1/3) publicPermissionPanel(String id, Imodel model, Tree tree) { super(id, model, tree); setLegend("Existing Permission"); PermissionModel permissionModel = new PermissionModel(getPermission()); getForm().setModel(new CompoundPropertyModel(permissionModel)); [...] } protectedvoidonDelete() { [Code Triplesec pour la suppression] } protected AdministeredEntity onSave() { [Code triplesec pour la sauvegarde] } private Permission getPermission() { return (Permission) ((DefaultMutableTreeNode) getModelObject()).getUserObject(); } Exemple avec le panel gérant les permissions

  18. Refactoring – Exemple (2/3) publicPermissionPanel(String id, Imodel model, Tree tree) { super(id, model, tree); setLegend("Existing Permission"); PermissionModel permissionModel = new PermissionModel(getPermission()); getForm().setModel(new CompoundPropertyModel(getPermission())); [...] } protectedvoidonDelete() { Locator.getSecurityManagementService().deletePermission(getPermission()); } protected AdministeredEntityModelonSave() { returnLocator.getSecurityManagementService().savePermission( getPermission(), (PermissionModel) getForm().getModelObject()); } private PermissionModelgetPermission() { return (PermissionModel) ((DefaultMutableTreeNode) getModelObject()).getUserObject(); }

  19. Refactoring – Exemple (3/3) private TriplesecPermissionDAO permissionDAO = new TriplesecPermissionDAO(); [...] public AdministeredEntityModel savePermission(PermissionModel oldPermission, PermissionModel newPermission) { returnpermissionDAO.save(oldPermission, newPermission); } publicvoiddeletePermission(PermissionModel permission) { permissionDAO.delete(permission); } [...] TriplesecSecurityManagementService TriplesecPermissionDAO [...] publicvoiddelete(PermissionModel permission) { [Code Triplesec pour la suppression] } public AdministeredEntityModel save(PermissionModel oldPermission, PermissionModel newPermission) { [Code Triplesec pour la sauvegarde] } [...]

  20. Persistance en base de données Utilisation d’Hibernate Informations stockées dans la même base que celle déjà existante Mapping des modèles réalisées dans les classes *Model

  21. Architecture des classes à mapper Choix technique : Mapping des classes AdministeredEntityModel et LocalUserModel

  22. Choix techniques retenus (1/4) La classe AdministeredEntityModel : Mapping en représentant une table par classe concrète Pas de table AdministeredEntity Toutes les tables mappant des classes héritant de AdministeredEntityModel contiennent les données de la classe mère

  23. Choix techniques retenus (2/4) La classe LocalUserModel : Hiérarhie dû au framework Triplesec 3 types d’utilisateurs : LocalUser, ExternalUser et HauskeysUser Mapping représentant une table par hiérarchie : une seule table User Uniquement des utilisateurs LocalUser

  24. Choix techniques retenus (3/4) Tables principales : • Ajout des classes faisant l’objet d’un mapping dans le fichier de configuration spring-config-hb.xml : <property name="annotatedClasses"> <list> ... <value>org.xoocode.xooctory.web.directory.security.model.AdministeredEntityModel</value> <value>org.xoocode.xooctory.web.directory.security.model.ApplicationModel</value> <value>org.xoocode.xooctory.web.directory.security.model.GroupModel</value> <value>org.xoocode.xooctory.web.directory.security.model.LocalUserModel</value> <value>org.xoocode.xooctory.web.directory.security.model.PermissionModel</value> <value>org.xoocode.xooctory.web.directory.security.model.ProfileModel</value> <value>org.xoocode.xooctory.web.directory.security.model.RoleModel</value> <value>org.xoocode.xooctory.web.directory.security.model.UserModel</value> </list> </property>

  25. Choix techniques retenus (4/4) D’autres tables pour stocker les associations : Table Profile_Grants pour stocker l’ensemble des privilèges associés aux profils Table …. ATTENTION : diapo 22 -> modifié l’image

  26. Problème rencontré (1/2) Tous les modèles héritent de AdministeredEntityModel et mapping représentant une table par classe concrète @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) publicabstractclassAdministeredEntityModelimplements Serializable { private String creatorsName; private String modifiersName; private Date createTimestamp; private Date modifyTimestamp; … } • Exception au démarrage de l’application : org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor': ... nested exception is org.hibernate.AnnotationException: No identifier specified for entity: org.xoocode.xooctory.web.directory.security.model.AdministeredEntityModel

  27. Problème rencontré (2/2) Causes : Pas d’identifiant précisé au modèle avec l’annotation @Id La classe mère n’a pas d’identifiant, ils sont dans les sous-classes Correction : Utilisation de l’annotation @MappedSuperClass @MappedSuperclass publicabstractclass AdministeredEntityModel implements Serializable { private String creatorsName; private String modifiersName; private Date createTimestamp; private Date modifyTimestamp; … }

  28. Implémentation des DAO Hibernate (1/2) Accès à la base de données Hibernate en utilisant un ensemble de DAO Chaque DAO hérite de la classe HibernateDaoSupport du framework Spring : Accès à Hibernate par les méthodes de cette classe public class HbGroupDAO extends HibernateDaoSupport { @Transactional(readOnly = false) public AdministeredEntityModel add(GroupModel group) { String id = (String) getHibernateTemplate().save(group); group.setId(id); returngroup; } … }

  29. Implémentation des DAO Hibernate (2/2) Instanciation d’une SessionFactory obligatoire : Création d’un bean pour chaque DAO dans spring-config.xml <bean id="permissionDAO" class="org.xoocode.xooctory.web.directory.security.manager. hibernate.HbPermissionDAO"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> • Chaque bean possède une propriété SessionFactory récupérée à l’aide du bean sessionFactory présent dans spring-config-hb.xml • ?????????? Vérifier le nom du fic

  30. Choix de l’implémentation (1/3) Objectifs : Facilité pour changer d’implémentation de la sécurité Pas de modification de code source Solution : utilisation de Spring pour faire la configuration

  31. Choix de l’implémentation (2/3) Utilisation du fichier spring-config-security.xml Création de 2 beans Mise en commentaire du bean non choisi

  32. Choix de l’implémentation (3/3) Création d’un locator :

  33. Les DAO Hibernate (1/3) Homogénéité avec les DAO existants

  34. Les DAO Hibernate (2/3) Ajout d’un bean pour chaque DAO dans le fichier spring-config.xml

  35. Les DAO Hibernate (3/3) Dans spring-config-hb.xml : <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.annotation. AnnotationSessionFactoryBean"> <property name="dataSource"><ref local="dataSource"/></property> <property name="annotatedClasses"> <list> ... <value>org.xoocode.xooctory.web.directory.security.model.AdministeredEntityModel</value> <value>org.xoocode.xooctory.web.directory.security.model.ApplicationModel</value> <value>org.xoocode.xooctory.web.directory.security.model.GroupModel</value> <value>org.xoocode.xooctory.web.directory.security.model.LocalUserModel</value> <value>org.xoocode.xooctory.web.directory.security.model.PermissionModel</value> <value>org.xoocode.xooctory.web.directory.security.model.ProfileModel</value> <value>org.xoocode.xooctory.web.directory.security.model.RoleModel</value> <value>org.xoocode.xooctory.web.directory.security.model.UserModel</value> </list> </property>

  36. Les problèmes rencontrés Dans spring-config-hb.xml Dans spring-config.xml

  37. Solution provisoire Erreur : java.lang.ClassNotFoundException: ${jdbc.driver.class}

  38. Tests existants Avant Après

  39. Nouveaux tests test web Une classe de tests par DAO Ajout Mise à jour Consultation Suppression

  40. Scénarios des nouveaux tests Ajout d’un élément Vérification que l’élément ait bien été créé Modification de l’élément Vérification que les modifications aient été prises en compte Suppression de l’élément Vérification que l’élément n’existe plus

  41. Management – Diagramme de Gantt

  42. Management – Planification des tâches

  43. Management – Ecart de planning

  44. Conclusion Projet très intéressant Découverte de nouveaux outils Refactoring de code Utilisation d’Hibernate (approfondissement du cours) Merci à Xavier Hanin pour son aide

More Related