46
1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

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

Embed Size (px)

Citation preview

Page 1: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

1

Xooctory – Projet GL

Aurélie COHE

Fabien FAGOAGA

Alice GARCIAMatthieu JOUBERT

Christelle MAZEREAU

Client : Xavier HANIN

Page 2: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

2

Plan

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

Page 3: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

3

Présentation du projet

Page 4: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

4

Objectif du projet (1/2)

Etat actuel de l’application :

Application

LDAP

Pers

ista

nce

Page 5: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

5

Objectif du projet (2/2)

Etat souhaité de l’application :

Application

LDAP Base de données

Pers

ista

nce

Pers

ista

nce

Page 6: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

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

Page 7: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

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

Page 8: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

8

Architecture des paquetages (1/2)

Page 9: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

9

Architecture des paquetages (2/2)

Réorganisation des paquetages

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

Page 10: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

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

Page 11: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

11

Architecture des classes (2/3)

Exemple des rôles dans l'application existante :

Conséquences :o Modification de ces éléments afin qu’ils ne fassent

pas appel à Triplesec (directement ou indirectement)o Ajout d’une couche d’abstraction

Page 12: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

12

Architecture des classes (3/3)

Exemple des rôles :

Page 13: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

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

Page 14: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

14

Refactoring (1/3)

PanelsConfiguration de l’application

Mise en placede l’arborescence

Code spécifique à Triplesec

Paquetage : org.xoocode.xooctory.web

Page 15: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

15

Refactoring (2/3)

Code spécifique à Triplesec

Fonction du code Triplesec :

o Sauvegarde

o Suppression

o Récupération de toutes les instances stockées dans la couche de persistance

Objets Triplesec :

o Equivalent aux modèles définies

Page 16: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

16

Refactoring (3/3)

Code initial

Code spécifique à Triplesec

Code indépendant

Code équivalent utilisant les fonctions de l’interface

Page 17: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

17

Refactoring – Exemple (1/3)

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

Exemple avec le panel gérant les permissions

Page 18: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

18

Refactoring – Exemple (2/3)

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 19: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

19

Refactoring – Exemple (3/3)

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

}[...]

[...]public void delete(PermissionModel permission) {

[Code Triplesec pour la suppression]}

public AdministeredEntityModel save(PermissionModel oldPermission,PermissionModel newPermission) {

[Code Triplesec pour la sauvegarde]}[...]

TriplesecPermissionDAO

TriplesecSecurityManagementService

Page 20: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

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

Page 21: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

21

Page 22: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

22

Architecture des classes à mapper

Choix technique : Mapping des classes AdministeredEntityModel et

LocalUserModel

Page 23: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

23

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

Page 24: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

24

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

Page 25: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

25

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>

Page 26: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

26

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

Page 27: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

27

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)public abstract class AdministeredEntityModel implements 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

Page 28: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

28

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

@MappedSuperclasspublic abstract class AdministeredEntityModel implements Serializable {

private String creatorsName; private String modifiersName; private Date createTimestamp; private Date modifyTimestamp;

…}

Page 29: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

29

Page 30: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

30

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 31: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

31

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

Page 32: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

32

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 33: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

33

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 34: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

34

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

Création d’un locator :

Page 35: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

35

Les DAO Hibernate (1/3)

Homogénéité avec les DAO existants

Page 36: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

36

Les DAO Hibernate (2/3)

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

Page 37: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

37

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>

Page 38: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

38

Les problèmes rencontrés

Dans spring-config-hb.xml

Dans spring-config.xml

Page 39: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

39

Solution provisoire

Erreur :

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

Page 40: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

40

Page 41: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

41

Tests existants

Avant Après

Page 42: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

42

Nouveaux tests

test

web

Une classe de tests par DAO

Ajout Mise à jour Consultation Suppression

Page 43: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

43

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

Page 44: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

44

Page 45: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

45

Management – Diagramme de Gantt

Page 46: 1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN

46

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