Services Web - TP XML

A rendre pour le 14/10/2010, 23h30 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 Eclipse ou 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 l'aide).

Extraire le contenu du fichier 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:

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 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 iCal4j. Consulter 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):

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 l'aide sur JUnit).

De iCal vers XML

Schéma XML

Écrire un fichier XML Schema contenant un schéma XML pour représenter un emploi du temps et qui correspondra à la DTD suivante:

<!ELEMENT calendrier ((propriete|composant)+)>
<!ATTLIST calendrier nom CDATA #REQUIRED>
<!ELEMENT composant ((propriete|composant)+)>
<!ATTLIST composant type CDATA #REQUIRED>
<!ELEMENT propriete (#PCDATA)>
<!ATTLIST propriete nom CDATA #REQUIRED>

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:

<complexType>
  <simpleContent>
    <extension base="string">
      <attribute name="nom" type="string"/>
    </extension>
  </simpleContent>
</complexType>

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 nommage1)

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 TP JDBC pour l'accès à Oracle en Java).

Le constructeur de votre classe prendra un objet de type 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 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.

1)
http://master-info.univ-lyon1.fr/M2TI/calendar