Xooctory. Plan Existant Objectif Application LDAP Persistance.

Post on 04-Apr-2015

116 views 0 download

Transcript of Xooctory. Plan Existant Objectif Application LDAP Persistance.

Xooctory

Plan

Existant

Objectif

Application

LDAP

Per

sist

ance

Application

Objectif

LDAP

Choix installation

Base de données

Per

sist

ance

Per

sist

ance

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

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

Plan

• Ajouter diagramme avec tous les paquetages

Architecture des paquetages

Réorganisation des paquetages

Séparation des couches métier, vue et 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.

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 :

Exemple des rôles :

Architecture des classes (3/3)

Plan

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

Code spécifique à triplesec

PanelsConfiguration deL'application

Mise en place de l'arborescence

Paquetage : org.xoocode.xooctory.web

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

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

Code initial

Code indépendant

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();

}

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();}

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]}[...]

Plan

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

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

Architecture des classes à mapper

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

LocalUserModel

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

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

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>

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.

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

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;

…}

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

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;

}…

}

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>

Plan

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

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

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

Création d’un locator :

Les DAO Hibernate (1/3)

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

Les DAO Hibernate (2/3)

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

Les DAO Hibernate (3/3)

Dans spring-config-hb.xml :

Les problèmes rencontrés

Dans spring-config.xml :

Dans spring-config-hb.xml :

Solution provisoire

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

Erreur :

Plan

Management

Plan

Tests

Tests existants

Avant Après

Ajouttest

web

Une classe de tests par DAO

Ajout Mise à jour Consultation Suppression

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

Plan

Conclusion