Xooctory.

Slides:



Advertisements
Présentations similaires
- Formation STRUTS 1 1.
Advertisements

Présentation de frameworks J2EE
Applications N-Tiers Rappels: architecture et méthodologie
Spécialisation/généralisation Héritage Polymorphisme.
Introduction à Java - les paquetages -
Les technologies XML Cours 3 : Les APIS XML Janvier Version 1.0 -
51 Les technologies XML Cours 6 : XML et les architectures N-tiers – Tier Métier Janvier Version 1.0 -
51 Les technologies XML Cours 7 : Utilisations dXML Janvier Version 1.0 -
Projet Webase. I. La définition du projet 1. Lexistant : Webase 4 2. Cahier des charges 3. La répartition des données 4. Le modèle de données 5. Le choix.
Introduction aux Entity Beans
Design Pattern MVC En PHP5.
Leçon 3 : Héritage IUP 2 Génie Informatique
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Présentation des frameworks pour Java EE
Active Directory Windows 2003 Server
Développement d’applications web
Forum JEE: framework STRUTS 1 et iBATIS
Présentation Installation Fonctionnement
HIBERNATE Framework de mapping objet-relationnel
Base de données avancées
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Struts 1 & 2 Tlohi ibtissam Tabit boutaina Ilias bouras
Présentation Struts1-JaxB
ASP.NET un peu plus loin… Développement Rapide dApplications Web avec.NET.
Projet JAVA EE Approfondi
Classes abstraites et Interfaces
Module 4 : Création et gestion de comptes d'utilisateur
Création et gestion de comptes d'utilisateur
Structures de données IFT-2000
1 Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA Alice GARCIA Matthieu JOUBERT Christelle MAZEREAU Client : Xavier HANIN.
29/01/09SpringFramework1 SpringFramework Alice GARCIA Fabien FAGOAGA Option Génie Logiciel 3 ème année ENSEIRB.
Xooctory – Projet GL Aurélie COHE Fabien FAGOAGA
Introduction au paradigme orienté-objet (suite)
Présentation du mémoire
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cilia Mediation Framework v0.9.0 Implantation.. Plan Cilia: c'est quoi? Capacités. Cilia: Modèle d'implantation. Mise en œuvre: Médiateur Cilia. Assemblage.
Projet de Master première année 2007 / 2008
Développement dapplication avec base de données Semaine 10 : WCF avec Entité Framework Automne 2013.
Processus d'un projet F.Pfister
J2EE vs .NET Réaliser par : SEIF ENNACER BADRA && CHETOUI RIM.
Initiation au web dynamique - TP
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
‘‘Open Data base Connectivity‘‘
19 Mai 2009 CADOT, ROMON, NOEL, GUILLOUET, MONGENET-LAMAISON.
Xooctory. Plan Présentation du projet Architecture de l'application.
Content Management System CMS. Pourquoi ? Obligation de ressaisir des contenus publiés à plusieurs endroits Pas d’outils de gestion de qualité de l’information.
Outil de gestion des cartes grises
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
JDBC L'API JDBC est utilisée pour utilisée pour intéragir avec une base de données.
Découverte des Framework : SPRING & JAXB
11/04/ L'héritage Cours 7 Cours 7.
Créer des packages.
HIBERNATE Mapping Objet / base de données relationnelle
Tutorat en bio-informatique
Acquisition d’information sur internet
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Présentation du framework JSF (Java Server Faces) dans le modèle événementiel MVCII
Struts.
Cours du 5 novembre.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
Amandine SOURY Bertrand DUCOULOMBIER Formation Java J2EE - Décembre Projet final de la formation Infotel : Gestion des cartes grises Formation.
Les Java Server Pages Dans ce chapitre, nous allons :
Architectures Logicielles Java GLG203 GLG204
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
Transcription de la présentation:

Xooctory

Plan

Existant

Objectif Application Persistance LDAP

Objectif Application Choix installation Persistance Persistance LDAP Base de données

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) Exemple des rôles dans l'application existante : Conséquences : Modification de ces éléments afin qu'ils ne fassent pas appel à Triplesec (directement ou indirectement) Ajout d'une couche d'abstraction

Architecture des classes (3/3) Exemple des rôles :

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 Paquetage : org.xoocode.xooctory.web Configuration de L'application Panels Mise en place de l'arborescence Code spécifique à triplesec

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 Code initial Code spécifique à triplesec Code équivalent utilisant les fonctions de l'interface 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 TriplesecSecurityManagementServiceLocator : 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); 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) 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; … }

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-hb.xml : Dans spring-config.xml :

java.lang.ClassNotFoundException: ${jdbc.driver.class} Solution provisoire Erreur : java.lang.ClassNotFoundException: ${jdbc.driver.class}

Plan

Management

Plan

Tests

Tests existants Avant Après

Ajout Une classe de tests par DAO Ajout Mise à jour Consultation 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