Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parIdelle Reboul Modifié depuis plus de 10 années
1
Xooctory
2
Plan Présentation du projet Architecture de l'application
3
Existant
4
Objectif Application LDAP Persistance
5
Application Objectif LDAP Choix installation Base de données Persistance
6
Outils utilisés et organisation Wicket : - utilisation de cet outil dans l'application existante - compréhension de celui-ci pour pouvoir le manipuler Hibernate : - Framework permettant de persister des objets Java en base de données relationnelles - Conseillé par notre client, X. Hanin Spring Triplesec
7
Outils utilisés et organisation => Organisation en sous-équipes (après avoir mis en place la couche d'abstraction) : - une équipe de deux personnes sur Wicket - une équipe de trois personnes sur Hibernate
8
Plan
9
Ajouter diagramme avec tous les paquetages
10
Architecture des paquetages Réorganisation des paquetages Séparation des couches métier, vue et persistance
11
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
12
Architecture des classes (1/3) A l'origine : Utilisation de classes de Triplesec dans les éléments utilisés par Wicket : Modèles et éléments de l'affichage Wicket : Définition : Framework Web permettant de développer des pages HTML dynamique en Java Utilisation de modèles : adaptateur qui adapte les 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.
13
Architecture des classes (2/3) Conséquences : Modification de ces éléments afin qu'ils ne fassent pas appel à Triplesec (directement ou indirectement) Ajout d'une couche d'abstraction Exemple des rôles dans l'application existante :
14
Exemple des rôles : Architecture des classes (3/3)
15
Plan
16
Code spécifique à triplesec Panels Configuration de L'application Mise en place de l'arborescence Paquetage : org.xoocode.xooctory.web
17
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
18
Code spécifique à triplesec Code équivalent utilisant les fonctions de l'interface Code initial Code indépendant
19
Exemple pour le panel gérant les utilisateurs public PermissionPanel(String id, Imodel model, Tree tree) { super(id, model, tree); setLegend("Existing Permission"); PermissionModel permissionModel = new PermissionModel(getPermission()); getForm().setModel(new CompoundPropertyModel(permissionModel)); [...] } protected void onDelete() { [Code Triplesec pour la suppression] } protected AdministeredEntity onSave() { [Code triplesec pour la sauvegarde] } private Permission getPermission() { return (Permission) ((DefaultMutableTreeNode) getModelObject()).getUserObject(); }
20
public PermissionPanel(String id, Imodel model, Tree tree) { super(id, model, tree); setLegend("Existing Permission"); PermissionModel permissionModel = new PermissionModel(getPermission()); getForm().setModel(new CompoundPropertyModel(getPermission())); [...] } protected void onDelete() { Locator.getSecurityManagementService().deletePermission(getPermission()); } protected AdministeredEntityModel onSave() { return Locator.getSecurityManagementService().savePermission( getPermission(), (PermissionModel) getForm().getModelObject() ); } private PermissionModel getPermission() { return (PermissionModel) ((DefaultMutableTreeNode) getModelObject()).getUserObject(); }
21
Implémentation de l'interface avec Triplesec private TriplesecPermissionDAO permissionDAO = new TriplesecPermissionDAO(); [...] public AdministeredEntityModel savePermission(PermissionModel oldPermission, PermissionModel newPermission) { return permissionDAO.save(oldPermission, newPermission); } public void deletePermission(PermissionModel permission) { permissionDAO.delete(permission); } [...] TriplesecSecurityManagementServiceLocator : TriplesecPermissionDAO : [...] public void delete(PermissionModel permission) { [Code Triplesec pour la suppression] } public AdministeredEntityModel save(PermissionModel oldPermission, PermissionModel newPermission) { [Code Triplesec pour la sauvegarde] } [...]
22
Plan Persistance en base de données
23
Utilisation d’Hibernate Informations stockées dans la même base que celle déjà utilisée Mapping des models réalisées dans les classes *Model
24
Les classes à mapper (1/2)
25
Les classes à mapper (2/2) Choix technique à faire : –Mapping des classes AdministredEntityModel et LocalUserModel
26
Choix techniques retenus (1/4) La classe AdministeredEntityModel : –Mapping en représentant une table par classe concrète –Pas de table AdministredEntity –Toutes les tables mappant des classes héritant de AdministredEntityModel contiennent les données de la classe mère
27
Choix techniques retenus (2/4) La classe LocalUserModel : –Cette hiérarchie est dû au framework Triplesec où il y a 3 types d’utilisateurs : LocalUser, ExternalUser et HauskeysUser –Mapping représentant une table par hiérarchie : une seule table User Uniquement des utilisateurs LocalUser
28
Choix techniques retenus (3/4) Tables principales : Ajout des classes faisant l'objet d'un mapping dans le fichier de configuration Spring spring-config-hb.xml... org.xoocode.xooctory.web.directory.security.model.AdministeredEntityModel org.xoocode.xooctory.web.directory.security.model.ApplicationModel org.xoocode.xooctory.web.directory.security.model.GroupModel org.xoocode.xooctory.web.directory.security.model.LocalUserModel org.xoocode.xooctory.web.directory.security.model.PermissionModel org.xoocode.xooctory.web.directory.security.model.ProfileModel org.xoocode.xooctory.web.directory.security.model.RoleModel org.xoocode.xooctory.web.directory.security.model.UserModel
29
Choix techniques retenus (4/4) D'autres tables créés par Hibernate pour stocker les listes d'éléments appartenant à nos différents modèles –Exemple : table Profile_Grants créée pour stocker l'ensemble des privilèges associés à chaque profil. –Peut être mettre un schéma pour expliquer l'exemple...
30
Problème rencontré (1/2) Tous les modèles héritent de AdministeredEntityModel et mapping représentant une table par classe concrète Exception au démarrage de l'application : @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class AdministeredEntityModel implements Serializable { private String creatorsName; private String modifiersName; private Date createTimestamp; private Date modifyTimestamp; … } 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
31
Problème rencontré (2/2) Problème rencontré : –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 public abstract class AdministeredEntityModel implements Serializable { private String creatorsName; private String modifiersName; private Date createTimestamp; private Date modifyTimestamp; … }
32
Implémentation des DAO Hibernate (1/3)
33
Implémentation des DAO Hibernate (2/3) 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); return group; } … }
34
Implémentation des DAO Hibernate (3/3) Il faut donc instancier une SessionFactory : –création d'un bean pour chaque DAO dans spring-config.xml Chaque bean possède une propriété SessionFactory récupérée à l'aide du bean SessionFactory présent dans spring- config-hb.xml. <bean id="permissionDAO" class="org.xoocode.xooctory.web.directory.security.manager.hibernate.HbPermissionDAO">
35
Plan
36
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
37
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
38
Choix de l’implémentation (3/3) Création d’un locator :
39
Les DAO Hibernate (1/3) Homogénéité avec les DAO déjà existants
40
Les DAO Hibernate (2/3) Ajout d’un bean pour chaque DAO dans le fichier spring-config.xml
41
Les DAO Hibernate (3/3) Dans spring-config-hb.xml :
42
Les problèmes rencontrés Dans spring-config.xml : Dans spring-config-hb.xml :
43
Solution provisoire java.lang.ClassNotFoundException: ${jdbc.driver.class} Erreur :
44
Plan
45
Tests
46
Tests existants AvantAprès
47
Ajout test web Une classe de tests par DAO AjoutMise à jourConsultationSuppression
48
Scénarios tests 1. ajout d’un élément 2. on vérifie il y est 3. on le modifie 4. on vérifie les modif 5. on le supprime 6. on vérifie y est plus
49
Plan
50
Management Répartition des tâches dans le temps Planification des taches au début Ecart de planning à cause des problèmes rencontrés : –Installation …
51
Conclusion Projet très intéressant Découverte nouveaux outils Refactoring de code Utilisation d’Hibernate (approfondissement du cours) Merci à Xavier Hanin pour son aide
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.