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