====== Services Web - TP XML ====== **A rendre pour le 14/10/2010, 23h30 [[http://spiral.univ-lyon1.fr/entree.asp?id=9055&objet=echangedocs|ici (Spiral)]]** Soumettre un fichier .zip par binôme contenant le projet. :!: Bien penser à mettre dans le ''.zip'' le fichier sql permettant la création du schéma sous Oracle. :!: Bien penser à citer tous les deux membres du binôme dans le projet ===== Initialisation du projet ===== On utilisera au choix l'IDE [[http://www.eclipse.org|Eclipse]] ou [[http://www.netbeans.org|NetBeans]] pour les TPs. Créer un répertoire pour vos TP de services web. Si vous utilisez les machines de la salle TP, pensez à configurer correctement maven (voir [[:enseignement:aide:start#maven|l'aide]]). Extraire le contenu du fichier {{:enseignement:sw:icalxml-src.zip|icalxml-src.zip}} qui contient un projet maven préconfiguré. Éditer le fichier ''pom.xml'' et changer la version en remplaçant ''COQUERY'' par les noms des deux étudiants du binôme. ===== Divers ===== Quelques liens pour la doc: * [[http://www.w3.org|Le site du W3C]] * API Java: [[http://download.oracle.com/javase/6/docs/api/|J2SE 6]] [[http://download.oracle.com/javaee/5/api/|JEE 5]] Il vous sera probablement nécessaire d'ouvrir un fichier se trouvant dans votre arborescence de classes Java (i.e. dans un package). Pour cela, on peut utiliser le code suivant: ClassLoader myClassLoader = this.getClass().getClassLoader(); InputStream is = myClassLoader.getResourceAsStream("chemin/fichier"); où chemin est le nom du package dans lequel on a remplacé les '.' par des '/' et où fichier est le nom du fichier à lire. **Remarque:** pour que cela fonctionne avec Maven, les fichiers à copier dans le ''.jar'' doivent être placés un sous-répertoire de ''src/main/resources'' et non pas dans un sous-répertoire de ''src/main/java'' qui est utilisé pour mettre les ''.java'' à compiler. À savoir: Maven ne génère pas le répertoire ''src/main/resources'' lors de la création du projet. ===== Format iCalendar ===== Consulter rapidement la [[http://fr.wikipedia.org/wiki/ICalendar|page wikipedia sur le format iCalendar]]. Ce format est un standard pour représenter des emplois du temps. L'objectif de ce TP est de lire des données dans ce format et de les transformer au format XML, de stocker ces données dans une base relationnelle et enfin de restituer les données de la base au format XML. Pour lire les fichier iCal, on utilisera la bibliothèque [[http://ical4j.sourceforge.net/|iCal4j]]. Consulter [[http://ical4j.sourceforge.net/introduction.html|cette page]] pour voir comment l'utiliser. En cas d'utilisation d'Eclipse, relancer la commande ''mvn eclipse:eclipse'', puis rafraîchir (''F5'') le projet. Voici 2 exemples de fichiers à utiliser pour vos tests (mais vous êtes libres, voir encouragés, à en créer d'autres): * {{:enseignement:sw:petit-calendrier.ics|Un petit fichier}} * [[http://liris.cnrs.fr/~ecoquery/files/M2TIP.ics|L'emploi du temps du M2TI 2009-2010]] On se limitera dans ce TP aux événements (VEVENT) et choses à faire (VTODO). Regarder l'interface 'ICalLoader' dans le package ''m2ti.ti3.icalxml'', puis créer une classe ICalLoaderImpl, toujours dans le package ''m2ti.ti3.icalxml'', qui implémente cette interface. Créer une classe de test JUnit pour la classe ''ICalLoaderImpl'' (s'inspirer de la classe générée par maven pour tester la classe ''App'' et voir [[:enseignement:sw:apis#junit|l'aide sur JUnit]]). ===== De iCal vers XML ===== ==== Schéma XML ==== Écrire un fichier [[http://www.w3.org/XML/Schema|XML Schema]] contenant un schéma XML pour représenter un emploi du temps et qui correspondra à la DTD suivante: On utilisera l'URI ''http://master-info.univ-lyon1.fr/M2TI/calendar'' comme espace de nommage cible pour ce schéma XML. Le fichier ''.xsd'' peut être créé dans NetBeans/Eclipse, par exemple dans un package créé pour ce tp. Remarque pour créer un type complexe avec du contenu texte et un ou plusieurs attributs, on peut utiliser: ==== Création de XML ==== Regarder l'interface ''m2ti.ti3.icalxml.XMLGenerator'', puis créer une classe l'implémentant pour convertir des calendriers lus par iCal4j au format XML. **Remarque:** Dans l'API iCal4j, les sous-composants ne sont pas directement accessibles dans la classe composant. Pour pouvoir y accéder, il voir le Component avec sa vraie classe en effectuant un cast vers la bonne sous-classe. Par exemple, dans le cas d'un ''VEVENT'': Component component = ... ... if (component.getName().equals(Component.VEVENT)) { VEvent event = (VEvent) component; ComponentList alarms = event.getAlarms(); for (Iterator j = alarms.iterator(); j.hasNext();) { Component component2 = (Component) j.next(); ..... } } **Remarque:** On fera attention a générer des documents utilisant le bon espace de nommage((''http://master-info.univ-lyon1.fr/M2TI/calendar'')) **Remarque:** Le choix de l'API utilisée (et donc la classe concrète du résultat) est laissé aux étudiants. Créer une classe de test pour votre implémentation du générateur XML. Changer le code de la méthode de la classe ''m2ti.ti3.icalxml.XMLGeneratorFactory'' de façon à renvoyer une instance de votre implémentation du générateur XML. ===== E/S dans une base relationnelle ===== Consulter l'interface ''m2ti.ti3.icalxml.DbXmlCalStore''. Créer dans votre compte Oracle un schéma de base de données pour représenter des emplois du temps (on veut pouvoir stocker plusieurs emplois du temps et les distinguer les uns des autres). Implémenter l'interface ''m2ti.ti3.icalxml.DbXmlCalStore'' (voir le [[:enseignement:bdav:tp-jdbc|TP JDBC]] pour l'accès à Oracle en Java). Le constructeur de votre classe prendra un objet de type [[http://java.sun.com/javase/6/docs/api/javax/sql/DataSource.html|javax.sql.DataSource]] en argument. Ajouter la classe suivante à votre projet et changer le code de la méthode ''getDbXmlCalStore'' pour renvoyer une instance de votre implémentation de ''DbXmlCalStore''. ===== Vers du XHTML et du RSS ===== ==== XSL et XHTML ==== Ecrire un programme XSLT pour transformer un calendrier au format XML en un document XHTML affichable dans un navigateur. On placera ce fichier dans un package Java du projet et on écrira une classe qui utilise ce programme XSLT pour effectuer la transformation (via l'API TrAX). ==== RSS ==== Ecrire une classe Java qui, via une feuille de style XSL, peut transformer les événements d'un calendrier au format XML en flux RSS (voir [[http://fr.wikipedia.org/wiki/RSS_(format)|la page wikipedia]] pour la description des flux RSS). ==== Classe donnant accès aux programmes XSL ==== Regarder la classe ''m2ti.ti3.icalxml.XSLFactory'', puis changer le code des méthodes pour renvoyer les fichiers XSL demandés. Les fichiers XSL doivent être chargés via le //classloader// de façon à être disponible lorsqu'on l'utilise sous forme d'une archive .jar.