projet composants logiciels - e
Transcription
projet composants logiciels - e
IUT Vélizy PROJET COMPOSANTS LOGICIELS Licence SIL Université de Versailles Saint Quentin SUJET Introduction. Il s’agit d’une application qui réalise le travail d'une caisse enregistreuse dans des salons de coiffure appartenant à une chaîne de franchises. Les services proposés aux clients de ces salons sont bien sûr des coupes de cheveux. Les coupes sont adaptées à chaque type de client, femme, homme et enfant. Une coupe peut être accompagnée de services supplémentaires comme par exemple un shampoing, une couleur, un brushing ou un soin capillaire. enregistrer une vente <<include>> <<include>> s'authentifier consulter le journal des ventes employé d'un salon de coiffure Ce sont les employés des salons qui utilisent l'application. Celle-ci doit leur faciliter le travail en proposant une interface Homme-machine conviviale et simple. Les cas d'utilisation recensés par l'équipe projet ont permis d'identifier un seul type d'utilisateur, les employés des salons de coiffure. Les cas d'utilisations sont «enregistrer une vente » et « consulter le journal des ventes ». L'application n'est utilisable qu'après authentification de son utilisateur. Celle-ci repose sur un identifiant et un mot de passe. Les deux cas d'utilisation nécessitant une identification, le cas d'utilisation « s'authentifier » a été conceptualisé afin de factoriser dans un seul cas cette fonctionnalité. Il est relié aux deux autres par une relation de type include. Le premier cas d'utilisation du système à concevoir et développer, l'enregistrement d'une vente, permet de choisir un type de coupe de cheveux et les services supplémentaires éventuels que le client a demandés. JJLC 1/6 LICENCE SIL Le cœur du modèle métier. L'originalité de l'application est qu'elle repose sur un modèle métier persistant structuré grâce aux patrons de conception1 Décorateur et Monteur (Builder). Le patron de conception Décorateur s'adapte bien aux modèles contenant des objets qui représentent un système d'information de base, ici les coupes de cheveux pour femme, pour enfant et pour homme, et d'autres objets qui eux représentent un système d'information optionnel ou complémentaire à celui de base, ici les services supplémentaires (couleur, brushing, soins capillaires, shampoing, etc). Le patron de conception Monteur permet de déléguer à une structure de classes la responsabilité d'ordonnancer les tâches à réaliser afin de construire un graphe d'objets complexe. Dans le cas présent celui de construire une structure de décoration. Le modèle métier a bien évidemment vocation à être persistant. La technologie employée à cette fin est la couche de persistance standard du langage JAVA : JPA (JAVA PERSISTENCE API). Le fournisseur choisi pour implémenter cette couche est HIBERNATE2. <<entity>> + Service -désignation : String -tarif : double 1 -service +detail() : String +montant() : double + Coupe + Supplément +detail() : String +montant() : double + Coupe Femme +detail() : String +montant() : double + Coupe Enfant + Brushing + Pas de Coupe + Couleur + Coupe Homme + Shampoing + Soin Capillaire La solution de persistance du modèle décorateur et donc sa correspondance (mapping) au niveau de la base de données relationnelle est implémentée par une seule table (solution union). Donc une seule table pour toute la dérivation comprenant les classes Service, Coupe, Supplément, CoupeHomme, CoupeFemme, CoupeEnfant, PasDeCoupe, Brushing, Couleur, Shampoing et SoinCapillaire. 1 Design Pattern 2 Hibernate est un des leaders pour les solutions de persistance des objets Java JJLC 2/6 LICENCE SIL Il est possible qu'une cliente ou qu'un client ne désire pas de coupe mais ne veuille qu'un ou plusieurs services de type supplément. Par exemple un simple brushing. C'est ce qui explique la présence de la classe PasDeCoupe. Le patron de conception Monteur est composé d'une interface et de deux classes responsables de la construction de la structure d'objets de la décoration qui n'est qu'en fait qu'une simple liste chaînée. Le Monteur ou Builder est d'ailleurs conçu pour faciliter la création de graphes d'objets complexes. Dans le cas d'une vente d'un service de coiffure, la construction doit absolument commencer par la création d'un objet concret de type CoupeFemme, CoupeEnfant, CoupeHomme ou PasDeCoupe et être « décoré » par zéro ou plusieurs suppléments. La classe DirecteurDuMontage représente l'interface du patron de conception. C'est à elle que s'adresse les objets consommateurs du montage. + MonteurDeService + DirecteurDuMontage 1 +dirigerLaConstruction() : void -monteur +construire() : void +getResultat() : Service 1 + Service -résultat structure décorateur décrite dans l'autre diagramme de classe + MonteurDeServiceImpl +construire() : void La classe MonteurDeServiceImpl implémente l'interface MonteurDeService. C'est elle qui a la responsabilité de concrètement construire la structure d'objet représentant la Décoration. Code source de la classe Monteur : public class MonteurDeServiceImpl extends MonteurDeService { private Map<String, Class> services = new Hashtable<String, Class>(); public MonteurDeServiceImpl() { super(); initialisation(); } public Service creationService(List<String > choixServices) throws Exception { Service vente = creationServiceCoupe(choixServices.get(0)); for(int i = 1; i < choixServices.size(); i++) vente = creationServiceSupplement(choixServices.get(i), vente); return vente; } public Service creationServiceCoupe(String typeService) throws Exception { return (Service) services.get(typeService).newInstance(); } récupération du premier élément de la liste (CE, CF, CH ou PC) itération sur les autres éléments de la liste (CO, BR, SC et SH) instanciation par réflexion JAVA public Service creationServiceSupplement(String typeService, Service service) throws Exception { return (Service) services.get(typeService).getConstructor(Service.class).newInstance(service); } private void initialisation() { services.put("CE", CoupeEnfant.class); services.put("CF", CoupeFemme.class); services.put("CH", CoupeHomme.class); services.put("PC", PasDeCoupe.class); services.put("CO", Couleur.class); services.put("BR", Brushing.class); services.put("SC", SoinCapillaire.class); services.put("SH", Shampoing.class); } } JJLC 3/6 LICENCE SIL La base de données. Le schéma relationnel est composé de la table SERVICE. Elle est la résultante de la correspondance objet-relationnel (mapping O-R). Cette correspondance est basée sur la solution UNION. C'est à dire une unique table pour implémenter une dérivation (interfaces et classes). Le patron de conception (Design pattern) Décorateur est basé sur un système de relation réflexive ce qui explique la présence de la colonne SERVICE_FK dans la structure de la table. Cette dernière est une clé étrangère qui référence la clé primaire de la même table. Tous les services de type supplément sont chaînés entre eux ; le dernier lien étant celui du premier supplément chaîné à une coupe (ou non coupe) via cette clé étrangère. chaînage coupe coupe premier supplément second supplément premier supplément second supplément second supplément dernier objet de la décoration etc... (point d'entrée dans la structure) Représentation du modèle Autre représentation du modèle Pour restaurer les objets de type Service, la requête SQL ne doit sélectionner que les objets périphériques de chaque décoration, c'est à dire le dernier supplément ou s'il n'y en a pas, la coupe. Le patron de conception décorateur est un système qui crée un « amas » d'objets. Avec un cœur ou noyau décoré par une succession de couches à la façon des pelures d'oignon ou des poupées russes. La structure globale est donc une liste chaînée de n-uplets dont il faut retrouver le dernier maillon pour restaurer l'ensemble des objets appartenant à une décoration. Schéma relationnel de la base de données lien réflexif de la décoration La requête SQL est la suivante : Elle sélectionne le dernier n-uplet de chaque service vendu. Celui qui correspond au dernier choix de service, simple coupe ou supplément (dernier décorateur). Ainsi la couche ORM (ObjectRelational Mapping) JPA peut restaurer chaque graphe d'objets qui correspond à une vente en partant de l'objet le plus périphérique de la structure de décoration. La clé étrangère permet de traverser tout le graphe. JJLC 4/6 LICENCE SIL TRAVAIL 1. 2. 3. 4. Télécharger le code fourni avec le sujet. Créer un nouveau projet dans l'environnement de développement intégré Eclipse. Importer le code téléchargé dans le projet. Créer la classe de test qui permet de créer un service (coupe avec suppléments) en utilisant les classes qui implémentent le patron de conception Monteur. 5. Ajouter au CLASSPATH du projet les librairies nécessaires (Hibernate et driver JDBC). 6. Réaliser la correspondance objet-relationnel en ajoutant au code source les annotations JPA. 7. Démarrer le moteur relationnel du SGBDR PostgreSQL (voir les annexes). 8. Créer la base de données salonDB. 9. Configurer une connexion à la base à l'aide du navigateur de SGBDR Squirrel. 10. Créer la classe de test qui permet de créer le schéma relationnel dans la base de données. 11. Créer la classe de test qui permet de créer plusieurs services (coupe avec suppléments) persistants en utilisant les classes qui implémentent le patron de conception Monteur. 12. Dans l'environnement SQL du navigateur Squirrel mettre au point la requête SQL qui permet de sélectionner les services périphériques. 13. Créer la classe de test qui permet de restaurer les services et d'afficher leur détail et leur montant en intégrant la requête SQL de la question 12 comme argument de la méthode JPA createNativeQuery(String requête SQL, Classe des objets restaurés). COMPTE RENDU Le compte rendu doit être réalisé sous la forme d'une archive JAR contenant tout le code source et que le code source avec le fichier META-INF/persistence.xml. L'archive JAR doit avoir pour nom, le nom de l'étudiant. L'archive JAR doit être poster sur la plateforme E-CAMPUS dans l'espace de travail du module CLD_LPSIL. JJLC 5/6 LICENCE SIL ANNEXES Pour créer la base de données salonDB, il faut : S'identifier comme administrateur PostgreSQL (login : postgres, password : postgres) commande su -l postgres dans un terminal UNIX Démarrer le moteur relationnel PostgreSQL lié à un cluster commande postmaster -i -D nom du cluster & Si aucun cluster n'exsite, il faut créer une structure de cluster (un cluster peut héberger plusieurs bases de données) commande initdb nom du cluster Réaliser la commande createdb salonDB Quitter le compte UNIX postgres (CTRL D ou exit) Le driver JDBC qui permet de se connecter à un SGBDR PostgreSQL se trouve dans le répertoire : /usr/share/java/postgresql-jdbc.jar La requête SQL pour retrouver les objets périphériques aux décorations (dernier décorateur ou simple coupe) doit sélectionner toutes les colonnes (SELECT *) de chacune des lignes dont l'identifiant ( IDSERVICE) est absent de la colonne SERVICE_FK. Les valeurs de IDSERVICE : 19, 21, 25 et 28 sont absentes de la colonne SERVICE_FK car elles identifient des lignes qui représentent le dernier objet d'une structure de décoration. Ce sont ces lignes là que la requête SQL de restauration doit sélectionner. En résumé, la requête SQL doit sélectionner toutes les lignes dont l'IDSERVICE ne se trouve pas dans la colonne SERVICE_FK à la condition que cette colonne ne soit pas NULL. JJLC 6/6 LICENCE SIL