xooctory. plan présentation du projet architecture de l'application
TRANSCRIPT
![Page 1: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/1.jpg)
Xooctory
![Page 2: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/2.jpg)
Plan
• Présentation du projet
• Architecture de l'application
![Page 3: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/3.jpg)
Existant
![Page 4: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/4.jpg)
Objectif
Application
LDAP
Persistance
![Page 5: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/5.jpg)
Application
Objectif
LDAP
Choix installation
Base de données
Per
sist
ance
Per
sist
ance
![Page 6: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/6.jpg)
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
![Page 7: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/7.jpg)
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
![Page 8: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/8.jpg)
Plan
![Page 9: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/9.jpg)
• Ajouter diagramme avec tous les paquetages
![Page 10: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/10.jpg)
Architecture des paquetages
Réorganisation des paquetages
Séparation des couches métier, vue et persistance
![Page 11: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/11.jpg)
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
![Page 12: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/12.jpg)
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.
![Page 13: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/13.jpg)
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 :
![Page 14: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/14.jpg)
Exemple des rôles :
Architecture des classes (3/3)
![Page 15: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/15.jpg)
Plan
![Page 16: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/16.jpg)
Code spécifique à triplesec
PanelsConfiguration deL'application
Mise en place de l'arborescence
Paquetage : org.xoocode.xooctory.web
![Page 17: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/17.jpg)
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
![Page 18: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/18.jpg)
Code spécifique à triplesec Code équivalent utilisant les fonctions de l'interface
Code initial
Code indépendant
![Page 19: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/19.jpg)
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();
}
![Page 20: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/20.jpg)
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();}
![Page 21: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/21.jpg)
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]}[...]
![Page 22: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/22.jpg)
Plan
• Persistance en base de données
![Page 23: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/23.jpg)
Persistance en base de données
• 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
![Page 24: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/24.jpg)
Les classes à mapper (1/2)
![Page 25: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/25.jpg)
Les classes à mapper (2/2)
• Choix technique à faire :– Mapping des classes AdministredEntityModel et
LocalUserModel
![Page 26: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/26.jpg)
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
![Page 27: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/27.jpg)
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
![Page 28: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/28.jpg)
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
<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>
![Page 29: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/29.jpg)
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...
![Page 30: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/30.jpg)
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
![Page 31: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/31.jpg)
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
@MappedSuperclasspublic abstract class AdministeredEntityModel implements Serializable {
private String creatorsName; private String modifiersName; private Date createTimestamp; private Date modifyTimestamp;
…}
![Page 32: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/32.jpg)
Implémentation des DAO Hibernate (1/3)
![Page 33: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/33.jpg)
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;
}…
}
![Page 34: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/34.jpg)
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"> <property name="sessionFactory"><ref bean="sessionFactory"/></property></bean>
![Page 35: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/35.jpg)
Plan
![Page 36: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/36.jpg)
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
![Page 37: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/37.jpg)
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
![Page 38: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/38.jpg)
Choix de l’implémentation (3/3)
Création d’un locator :
![Page 39: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/39.jpg)
Les DAO Hibernate (1/3)
Homogénéité avec les DAO déjà existants
![Page 40: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/40.jpg)
Les DAO Hibernate (2/3)
• Ajout d’un bean pour chaque DAO dans le fichier spring-config.xml
![Page 41: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/41.jpg)
Les DAO Hibernate (3/3)
Dans spring-config-hb.xml :
![Page 42: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/42.jpg)
Les problèmes rencontrés
Dans spring-config.xml :
Dans spring-config-hb.xml :
![Page 43: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/43.jpg)
Solution provisoire
java.lang.ClassNotFoundException: ${jdbc.driver.class}
Erreur :
![Page 44: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/44.jpg)
Plan
![Page 45: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/45.jpg)
Tests
![Page 46: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/46.jpg)
Tests existants
Avant Après
![Page 47: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/47.jpg)
Ajouttest
web
Une classe de tests par DAO
Ajout Mise à jour Consultation Suppression
![Page 48: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/48.jpg)
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
![Page 49: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/49.jpg)
Plan
![Page 50: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/50.jpg)
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 …
![Page 51: Xooctory. Plan Présentation du projet Architecture de l'application](https://reader035.vdocument.in/reader035/viewer/2022062512/551d9dcd497959293b8e51cd/html5/thumbnails/51.jpg)
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