====== TP3: handlers, JAX-RS ====== ===== Préambule ===== On travaillera sur le service ''AlbumDataService'' du [[sw-tp2-jaxws|TP précédent]]. Le TP dure deux séances et est à rendre pour le dimanche **27/11/2011**, comme précédement via la forge pour par envoi mail du zip du dépôt (sans les binaires). ===== Handlers ===== ==== Liens ==== * [[http://liris.cnrs.fr/~ecoquery/files/tiw5-handlers.pdf|Cours sur les handlers]] * [[http://download.oracle.com/javase/6/docs/api/|Javadoc Java SE 6]], [[http://download.oracle.com/javaee/5/api/|Javadoc Java EE 5]] (en particulier javax.xml.ws.handler, javax.xml.ws.handler.soap) * [[http://jcp.org/aboutJava/communityprocess/mrel/jsr224/index3.html|Spec JAX-WS (JSR224)]], [[http://jax-ws.java.net/nonav/jaxws-api/2.2/index.html|Javadoc]] * [[http://jcp.org/aboutJava/communityprocess/mrel/jsr109/index2.html|Spec architecture JEE Web Services (JSR109)]] * [[http://cxf.apache.org/docs/jax-ws-configuration.html|Configuration dans CXF]] * [[http://jcp.org/aboutJava/communityprocess/mrel/jsr181/index.html|Configuration Standard]], [[http://java.sun.com/xml/ns/javaee/javaee_web_services_1_2.xsd|XML Schema]] ==== Handler de log ==== Dans le sous-projet ''services-impl'', créer une classe ''tiw5.services.handlers.LogHandler'' pour implémenter un handler qui va afficher l'élément principal des messages reçus et envoyés, ainsi que la date. Pour cela, la classe doit implémenter l'interface LogicalHandler, le log se faisant dans la méthode handleMessage. Configurer le service dans ''web-interface'' pour utiliser le handler et tester avec soapUI. ==== Ajout d'information ==== Créer une classe ''tiw5.services.handlers.UserHandler'' étendant SOAPHandler. Si un élément ''{http://master-info.univ-lyon1.fr/M2TI/TIW5/services}user'' ((l'URI entre accolade est le namespace)) est dans le header SOAP, prendre sa valeur et ajouter au contexte un propriété ''user'' avec cette valeur. Procéder de même pour l'élément ''{http://master-info.univ-lyon1.fr/M2TI/TIW5/services}password''((avec la propriété ''password'')). Question optionnelle: Modifier le WSDL pour y intégrer les déclarations de header (voir [[http://www.w3.org/TR/wsdl#_soap:header|ici]]). Intégrer ce handler de tel façon qu'il soit exécuté avant le handler de log sur un message entrant. Modifier le handler de log de façon à afficher la propriété ''user''. Tester avec SOAPUI. ==== Authentification ==== Créer un handler supplémentaire ''tiw5.services.handlers.AuthHandler'' qui vérifie que le couple user/password fait bien partie des logins autorisés. Ce handler utilisera une liste de couples user/password pris dans un fichier XML. En cas d'échec sur l'authentification, on pourra lancer une exception SOAPFaultException ou ProtocolException (selon le type de handler). Remarques: * On pourra au besoin créer des classes dans le modèle les annoter en JAXB pour simplifier l'écriture du handler. * Pour la suite des TPs, il est conseillé d'implanter la vérification dans une classe distincte du handler. Ajouter au bon endroit le handler dans la chaîne du service AlbumDataService. Tester avec SOAPUI. ==== Contrôle d'accès ==== Créer un handler ''tiw5.services.handlers.AccessControlHandler'' qui vérifie que l'utilisateur a bien le droit de modifier un album. On considère que ce droit porte sur tous les albums et qu'il est spécifié dans le fichier XML du handler précédent. Ajouter au bon endroit le handler dans la chaîne du service AlbumDataService. Tester avec SOAPUI. ===== JAX-RS ===== ==== Liens ==== * [[http://liris.cnrs.fr/~pchampin/enseignement/tiw5/|Cours REST]] * [[http://jsr311.java.net/nonav/releases/1.0/index.html|API JAX-RS 1.0]] * [[http://cxf.apache.org/docs/jax-rs-basics.html|Informations de base sur JAX-RS et CXF]] * [[http://cxf.apache.org/docs/jaxrs-services-configuration.html#JAXRSServicesConfiguration-ConfiguringJAXRSservicesincontainerwithSpringconfigurationfile.|Déploiement d'un service JAX-RS via les Spring Beans]] (déjà utilisés pour JAX-WS dans le [[sw-tp2-jaxws|TP2]] et dans la partie précédente). ==== Publication AlbumDataService en REST ==== Annoter la classe ''AlbumDataService'' de manière à pouvoir exposer ce service en REST en utilisant entre autre les annotations suivantes: * ''@Path'' * ''@GET'', ''@PUT'' * ''@PathParam'' * ''@Produces'', ''@Consumes'' Modifier le fichier ''services.xml'' pour déployer un point d'accès REST pour AlbumDataService. Bien penser aux dépendances maven à ajouter (//c.f.// [[http://cxf.apache.org/docs/jax-rs.html]]).