====== TP: Modèles de données ====== Mises à jour: * 2012-09-20: mise à jour du dépôt mercurial pour corriger les problèmes du xsd (dépôt maj à ~ 16h). ==== Modalités ==== Ce TP est à rendre pour le **03/10/2012**, à raison d'un rendu par binôme.\\ URL de rendu SPIRAL: http://spiralconnect.univ-lyon1.fr/spiral/spiral.html#/activities/goto_folder/1742262 * Les binômes sont à constituer au sein des groupes de projet TI. En cas de nombre impair d'étudiants, des binômes inter-groupes peuvent être constitués. Il est demandé de rendre le TP sous forme d'un dépôt Mercurial qui aura été initialisé en clonant le dépôt indiqué ci-dessous. [[http://mercurial.selenic.com/|Mercurial]] est un gestionnaire de version, au même titre que par exemple [[http://git-scm.com/|git]]. A la différence de [[http://subversion.tigris.org/|svn]] ou [[http://www.nongnu.org/cvs/|CVS]] c'est système décentralisé, permettant de réaliser des //commit// sans connexion avec un quelconque serveur central. Une introduction rapide à Mercurial est [[http://mercurial.selenic.com/quickstart/|à disposition ici]]. * Le rendu se fera par [[http://spiralconnect.univ-lyon1.fr/spiral/spiral.html#/activities/goto_folder/1742262|spiral]] en déposant une archive du dépôt //zippé//. Il sera demandé de ne pas mettre les fichiers issus de la compilation du projet dans le zip, ce qui peut se faire d'une des manières suivantes: * cloner le projet courant dans un nouveau répertoire: hg clone mon-repertoire-de-dev le-repertoire-a-zipperpuis //zipper// le répertoire ainsi obtenu; * alternativement, exécuter mvn clean dans le projet racine (''projet'') avant la compression, en ayant quitter l'environnement de développement afin d'éviter toute recompilation intempestive. ==== Introduction ==== Le but de ce TP est mettre en place un petit modèle de données objet ainsi que des mappings entre ce modèle et les modèles relationnels et semi-structurés. Un projet [[http://maven.apache.org|maven]] de départ est disponible ici: hg clone https://forge.univ-lyon1.fr/hg/inf2018m-2012-tpbase Ce projet comporte des sous-projets. Le projet ''modele'' contient les classes du modèles. Remarques: * Tous les affichages de debug devront se faire via une API de log. Le projet maven intègre les dépendances vers l'[[http://www.slf4j.org/index.html|API slf4j]]. * Il est conseillé d'utiliser une application comme [[http://www.sonarsource.org/|sonar]] afin de disposer de quelques indicateurs sur la qualité de votre code. Une partie de la note de ce TP pourra être directement issue des indicateurs de cette application. * Il vous est possible et même conseillé de fournir un fichier ''README.txt'' dans le répertoire racine du projet maven dans lequel vous pourrez mettre les remarques et/ou justifications à adresser au correcteur. ===== Etapes ===== ==== Modèle relationnel ==== Mettre en place un mapping avec un modèle relationnel en utilisant l'API JPA dans une base relationnelle((par exemple une base derby qui évite de configurer un SGBD sur la machine de développement)): * Annoter les classes à rendre persistantes en utilisant les annotations JPA * Créer un fichier de configuration ''META-INF/persistence.xml'' approprié <- déjà fait * Écrire un test unitaire pour tester la configuration du mapping relationnel en utilisant un gestionnaire d'entités pour sauver un objet en base((Attention: le test doit pouvoir être exécuté plusieurs fois de suite)). <- déjà fait Il est possible de modifier le modèle, en particulier en ajoutant/modifiant des méthodes. Toute modification doit cependant être justifiée dans le fichier ''README.txt''. Quelques liens utiles: * Le {{:enseignement:bdav:bdav-orms.pdf|cours sur les ORM}}, et le [[enseignement:tp:bd:tp-orm|TP associé]]. * Le [[http://java.sun.com/javaee/6/docs/tutorial/doc/bnbpy.html|tutoriel JEE sur la persistance]]. * L'[[http://download.oracle.com/javaee/6/api/|API JEE]] -> package javax.persistence. * [[:enseignement:aide:apis#junit|Mini-intro JUnit]] Remarque: les dépendances sur l'API JPA et le runtime hibernate sont déjà déclarées dans le pom.xml du projet, ainsi qu'une dépendance vers les pilotes JDBC pour [[http://db.apache.org/derby/|derby]] dans le cadre des tests. * url jdbc pour derby: ''jdbc:derby:nomDeLaBd'' * driver jdbc pour derby: ''org.apache.derby.jdbc.EmbeddedDriver'' * dialect hibernate pour derby: ''org.hibernate.dialect.DerbyDialect'' * il est conseillé de mettre ''hibernate.hbm2ddl.auto'' à ''update'' ==== Modèle semi-structuré ==== Mettre en place un mapping avec XML via JAXB((annotations de mapping XML JEE)): * Annoter les classes à //sérialiser// de façon à obtenir une représentation cohérente avec le schéma XML fourni dans le projet de départ. * Compléter le test unitaire qui vérifie que la sérialisation d'un objet est conforme au schéma XML fourni. Quelques liens utiles: * [[http://jaxb.java.net/tutorial/|Tutoriel JAXB]] * [[http://download.oracle.com/javase/6/docs/api/|API Java 6]] -> package javax.xml.bind et sous-packages Remarque: * Il peut être utile d'annoter les accesseurs (setXXX) avec ''@XmlTranscient'' * Il peut être nécessaire d'ajouter des accesseurs destinés uniquement à JAXB ==== Extrait d'une base de films ==== Créer une classe tiw5.modele.InfosFilms contenant une liste de personnes, une liste de films et une liste de sociétés. Ajouter les annotations JAXB pour la sérialisation XML et mettez à jour le schéma XML. ==== Accès web ==== Le projet maven ''interface-web'' contient un squelette d'application Web. Créer une servlet renvoyant une représentation XML d'un film en fonction de son numéro, ainsi qu'une page HTML avec un formulaire pour la tester facilement. Changer la servlet pour envoyer la représentation XML d'une instance d'InfosFilms contenant le film et toutes les personnes et les sociétés qui y sont liées. Ajouter la possibilité de passer paramètre ''format'' donnant le choix entre le format XML défini dans le fichier ''xsd'' du modèle et le format XHTML. La présentation XHTML se fera via l'application d'une feuille de style XSL. Les personnes/sociétés (et les détails les concernant) seront indiquées dans la description du film.