Implémentation du service de stockage de calendriers

Rendu & Notation

Le TP est à rendre sous forme de projets zippés, incluant les sources commentés, les classes de test unitaires, les descriptions (sous forme de fichiers .txt) des tests fonctionnels + le(s) projet(s) SOAPUI le cas échéant. Le rendu est à faire sur spiral, avant le 2/12/2010 à 23h30 6/12/2010 à 8h00.

Notation:

Fonctionnalités 10 pts
Tests unitaires 2 pts
Tests fonctionnels 2 pts
Commentaires javadoc 2 pts
Commentaires de code 1 pt
Qualité et lisibilité du code 1 pt
Conception 2 pts

Liens

Objectif

L'objectif de ce TP est d'implémenter le service de stockage de calendrier. On procédera d'abord en gérant à la main le message SOAP et en réutilisant le TP1, puis en utilisant dans une deuxième partie les mappings XML/Objet (via JAXB) et Objet/Relationnel (via JPA).

Implementation gérant directement le message XML

Mise en place du projet

Extraire le projet storecalservice.zip.

Dans ce projet on créera une classe implémentant l'interface javax.xml.ws.Provider<javax.xml.transform.Source> ou bien javax.xml.ws.Provider<javax.xml.soap.SOAPMessage>. On annotera cette classe avec @WebServiceProvider en précisant les paramètres nécessaires (voir la doc), ainsi qu'une annotation @ServiceMode, en indiquant PAYLOAD ou MESSAGE comme paramètre. En fonction du message reçu, on traitera la demande via la fonction invoke, le résultat de l'invocation du service étant renvoyé par cette fonction.

Ne pas oublier d'ajouter la dépendance au TP1 dans maven pour pouvoir réutiliser vos classes de servant à stocker et récupérer un calendrier XML dans la BD relationnelle.

  • Avec JBossWS (doc sur les points d'accès): Ajouter au fichier WebContent/WEB-INF/web.xml une servlet dont la classe d'implémentation est la classe précédente. Ajouter également un “servlet mapping” pour lui attribuer une URL.
  • Avec Metro (doc): dans le WebContent/WEB-INF/web.xml, ajouter une servlet metro utilisant la classe com.sun.xml.ws.transport.http.servlet.WSServlet (avec un servlet mapping) et dans le fichier WebContent/WEB-INF/sun-jaxws.xml spécifier un endpoint avec votre classe.
  • Avec Apache CXF, modifier le web.xml et créer le fichier services.xml (voir ici).
    Ajouter les dépendances maven suivantes:
    <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-frontend-jaxws</artifactId>
       <version>2.2.4</version>
    </dependency>
    <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-transports-http</artifactId>
       <version>2.2.4</version>
    </dependency>

:!: Il existe des incompatibilités avec les APIs transformations (ou certaines implémentations de ces APIs). Dans tous les cas, préférer un SAAJResult à un DOMResult :!:

Implementation via les mappings XML/Objets

Extraire le projet storecalserviceorm.zip.

Mapping Objets/Relationnel

Remarque: JPA est intégré dans JBoss. Pour l'utiliser avec Tomcat, il faut se procurer une implémentation, par exemple Hibernate. Les dépendances maven pour Hibernate sont disponibles ici.

Créer des classes pour représenter les calendriers, les composants et les propriétés. L'idée est d'utiliser JPA (turoriel) pour la sauvegarde des données. Annoter ces classes avec les annotations de persistance JPA (package javax.persistence), en particulier regarder @Entity (définit une classe comme étant persistante), @Id, @GeneratedValue, @Column, @ManyToOne, @JoinColumn, @OneToMany, @ManyToMany.

Lire la partie du tutoriel sur la gestion des entités et créer un fichier persistence.xml. Définir également une source de données JNDI (voir ici) correspondant à celle déclarée dans persistence.xml.

Exemple de fichier persistence.xml avec deux unités de persistence:

<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	<!-- Transactions gérées par le server d'application, par exemple JBoss -->
	<persistence-unit name="HotelServicesDAO">
		<jta-data-source>java:comp/env/jdbc/HotelsDB</jta-data-source>
	</persistence-unit>
	<!-- Transactions gérées par l'application, par exemple dans une application indépendante ou pour des tests -->
	<persistence-unit name="HotelServicesDAOTest"
		transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="validate" />
			<property name="hibernate.connection.driver_class"
				value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.username"
				value="tomcat" />
			<property name="hibernate.connection.password"
				value="tomcat" />
			<property name="hibernate.connection.url"
				value="jdbc:mysql:///sw_hotels" />
			<property name="hibernate.show_sql" value="false" />
		</properties>
	</persistence-unit>
</persistence>

Code pour les services (mapping XML/Objets)

Utiliser les générateurs de code pour générer des squelettes de classes à partir du WSDL:

  • Pour JBoss (doc): générer les .java avec wsconsume, puis implémenter l'interface correpondant au service.
  • Pour Metro (doc, doc metro (section 3)): générer les classes avec wsimport, puis implementer l'interface générée.

Ne pas hésiter à utiliser un plugin Maven pour la génération de code, par exemple le plugin jax-ws, ou en utilisant le plugin ant pour maven avec la tache ant correspondant à wsconsume (non testé).

Il peut être intéressant de séparer les sources générés des sources édités dans Netbeans en utilisant des répertoires sources distincts. Cela est généralement fait par défaut pour les plugins mavens (dans le répertoire target/generated-sources/xxxx, reconnu automatiquement par Netbeans). Il peut également être intéressant de personnaliser les packages des classes générées. Alternativement, on peut ne générer les classes qu'une fois et ensuite les modifier (par exemple en ajoutant une couche JPA à certaines classes).

Enfin, éditer les fichiers de déploiement pour rendre le service disponible.