====== 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 [[http://spiral.univ-lyon1.fr/entree.asp?id=9055&objet=echangedocs|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 === * API Java: [[http://download.oracle.com/javase/6/docs/api/|J2SE 6]] [[http://download.oracle.com/javaee/5/api/|JEE 5]] ===== 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 [[sw-tp1-xml|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 {{:enseignement:sw:storecalservice.zip}}. Dans ce projet on créera une classe implémentant l'interface ''javax.xml.ws.Provider'' ou bien ''javax.xml.ws.Provider''. 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 ([[http://jbossws.jboss.org/mediawiki/index.php?title=User_Guide#Web_Service_Endpoints|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 ([[https://metro.dev.java.net/guide/Deploying_Metro_endpoint.html|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'' ([[http://cxf.apache.org/docs/servlet-transport.html|voir ici]]).\\ Ajouter les dépendances maven suivantes: org.apache.cxf cxf-rt-frontend-jaxws 2.2.4 org.apache.cxf cxf-rt-transports-http 2.2.4 :!: 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 {{:enseignement:sw: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 [[http://www.hibernate.org/|Hibernate]]. Les dépendances maven pour Hibernate sont [[:enseignement:sw:apis#hibernate|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 ([[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbpz.html|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 [[http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqw.html|gestion des entités]] et créer un fichier ''persistence.xml''. Définir également une source de données JNDI ([[enseignement:aide:apis#datasources|voir ici]]) correspondant à celle déclarée dans ''persistence.xml''. Exemple de fichier ''persistence.xml'' avec deux unités de persistence: java:comp/env/jdbc/HotelsDB ==== 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 ([[http://jbossws.jboss.org/mediawiki/index.php?title=JBossWS_JAX-WS_Tools#Top-Down_.28Using_wsconsume.29|doc]]): générer les ''.java'' avec ''wsconsume'', puis implémenter l'interface correpondant au service. * Pour Metro ([[https://metro.dev.java.net/nonav/1.3/docs/wsimport.html|doc]], [[https://metro.dev.java.net/guide/|doc metro]] (section 3)): générer les classes avec ''wsimport'', puis implementer l'interface générée. * Pour [[http://cxf.apache.org/|apache CXF]], voir [[http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html|la documentation ici]] et [[http://cwiki.apache.org/CXF20DOC/maven-cxf-codegen-plugin-wsdl-to-java.html|là]]. Ne pas hésiter à utiliser un plugin Maven pour la génération de code, par exemple le [[https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/|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.