52
Xooctory

Xooctory. Plan Existant Objectif Application LDAP Persistance

Embed Size (px)

Citation preview

Page 1: Xooctory. Plan Existant Objectif Application LDAP Persistance

Xooctory

Page 2: Xooctory. Plan Existant Objectif Application LDAP Persistance

Plan

Page 3: Xooctory. Plan Existant Objectif Application LDAP Persistance

Existant

Page 4: Xooctory. Plan Existant Objectif Application LDAP Persistance

Objectif

Application

LDAP

Per

sist

ance

Page 5: Xooctory. Plan Existant Objectif Application LDAP Persistance

Application

Objectif

LDAP

Choix installation

Base de données

Per

sist

ance

Per

sist

ance

Page 6: Xooctory. Plan Existant Objectif Application LDAP Persistance

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

Page 7: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

Plan

Page 9: Xooctory. Plan Existant Objectif Application LDAP Persistance

• Ajouter diagramme avec tous les paquetages

Page 10: Xooctory. Plan Existant Objectif Application LDAP Persistance

Architecture des paquetages

Réorganisation des paquetages

Séparation des couches métier, vue et persistance

Page 11: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 12: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 13: Xooctory. Plan Existant Objectif Application LDAP Persistance

Exemple des rôles :

Architecture des classes (3/3)

Page 14: Xooctory. Plan Existant Objectif Application LDAP Persistance

Plan

Page 15: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 16: Xooctory. Plan Existant Objectif Application LDAP Persistance

Code spécifique à triplesec

PanelsConfiguration deL'application

Mise en place de l'arborescence

Paquetage : org.xoocode.xooctory.web

Page 17: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

Code spécifique à triplesec Code équivalent utilisant les fonctions de l'interface

Code initial

Code indépendant

Page 19: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

Plan

Page 23: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

• Ajouter diagramme paquetage avec où on est en rouge Model

Page 25: Xooctory. Plan Existant Objectif Application LDAP Persistance

Architecture des classes à mapper

• Choix technique à faire :– Mapping des classes AdministredEntityModel et

LocalUserModel

Page 26: Xooctory. Plan Existant Objectif Application LDAP Persistance

Choix techniques retenus (1/3)

• 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 Existant Objectif Application LDAP Persistance

Choix techniques retenus (2/3)

• 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 Existant Objectif Application LDAP Persistance

Choix techniques retenus (3/3)

• 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 Existant Objectif Application LDAP Persistance

Choix techniques retenus (3/3)

• 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.

Page 30: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

• Ajouter diagramme paquetage avec où on est en rouge ibernate

Page 33: Xooctory. Plan Existant Objectif Application LDAP Persistance

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);return group;

}…

}

Page 34: Xooctory. Plan Existant Objectif Application LDAP Persistance

Implémentation des DAO Hibernate (2/2)

• 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.

• Il est où, je l'ai pas trouvé

<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 Existant Objectif Application LDAP Persistance

Plan

Page 36: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

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 Existant Objectif Application LDAP Persistance

Choix de l’implémentation (3/3)

Création d’un locator :

Page 39: Xooctory. Plan Existant Objectif Application LDAP Persistance

Les DAO Hibernate (1/3)

Homogénéité avec les DAO déjà existants

Page 40: Xooctory. Plan Existant Objectif Application LDAP Persistance

Les DAO Hibernate (2/3)

• Ajout d’un bean pour chaque DAO dans le fichier spring-config.xml

Page 41: Xooctory. Plan Existant Objectif Application LDAP Persistance

Les DAO Hibernate (3/3)

Dans spring-config-hb.xml :

Page 42: Xooctory. Plan Existant Objectif Application LDAP Persistance

Les problèmes rencontrés

Dans spring-config.xml :

Dans spring-config-hb.xml :

Page 43: Xooctory. Plan Existant Objectif Application LDAP Persistance

Solution provisoire

java.lang.ClassNotFoundException: ${jdbc.driver.class}

Erreur :

Page 44: Xooctory. Plan Existant Objectif Application LDAP Persistance

Plan

Page 45: Xooctory. Plan Existant Objectif Application LDAP Persistance

Management

Page 46: Xooctory. Plan Existant Objectif Application LDAP Persistance

Plan

Page 47: Xooctory. Plan Existant Objectif Application LDAP Persistance

Tests

Page 48: Xooctory. Plan Existant Objectif Application LDAP Persistance

Tests existants

Avant Après

Page 49: Xooctory. Plan Existant Objectif Application LDAP Persistance

Ajouttest

web

Une classe de tests par DAO

Ajout Mise à jour Consultation Suppression

Page 50: Xooctory. Plan Existant Objectif Application LDAP Persistance

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 51: Xooctory. Plan Existant Objectif Application LDAP Persistance

Plan

Page 52: Xooctory. Plan Existant Objectif Application LDAP Persistance

Conclusion