<?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; Groovy</title> <atom:link href="http://blog.xebia.fr/tag/groovy/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>Paradigmes de programmation par Nicolas Demengel</title><link>http://blog.xebia.fr/2011/09/15/paradigmes-de-programmation-par-nicolas-demengel/</link> <comments>http://blog.xebia.fr/2011/09/15/paradigmes-de-programmation-par-nicolas-demengel/#comments</comments> <pubDate>Thu, 15 Sep 2011 08:52:37 +0000</pubDate> <dc:creator>Nicolas Demengel</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[clojure]]></category> <category><![CDATA[Erlang]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Haskell]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Prolog]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Ruby]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[vidéo]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8536</guid> <description><![CDATA[Suite à la lecture du livre &#171;&#160;Seven Languages in Seven Weeks&#160;&#187; (Bruce A. Tate), Nicolas Demengel nous a présenté les principaux paradigmes de programmation durant notre journée XKE. Nous souhaitons partager avec vous cette session au travers de cette vidéo. Bon visionnage&#160;! Paradigmes de programmation par Nicolas Demengel Tous les podcasts Xebia France :]]></description> <content:encoded><![CDATA[<p>Suite à la lecture du livre &laquo;&nbsp;Seven Languages in Seven Weeks&nbsp;&raquo; <em>(Bruce A. Tate)</em>, <a
href="http://blog.xebia.fr/author/ndemengel/">Nicolas Demengel</a> nous a présenté les principaux paradigmes de programmation durant notre <a
href="http://blog.xebia.fr/tag/xke/">journée XKE</a>. Nous souhaitons partager avec vous cette session au travers de cette vidéo.<br
/> Bon visionnage&nbsp;!</p><div
id="paradigmes-de-programmation" align='center'>Paradigmes de programmation par Nicolas Demengel</div><p> <br
/> <script type="text/javascript">jwplayer('paradigmes-de-programmation').setup({
			flashplayer: '/videos/player.swf',
			image: '/videos/paradigmes-de-programmation.png',
			file: 'http://xebia-video.s3-website-eu-west-1.amazonaws.com/2011-09-paradigmes-de-programmation.mp4',
			width: 720,
			height: 550,
			plugins: {
				'slidesync-1': {
				'position': 'right',
				'size': 500,
				'xmlPath': '/videos/paradigmes-de-programmation-slidesync.xml'
				},
				'slidescroller-1': {
				'position': 'bottom',
				'size': 150,
				'xmlPath': '/videos/paradigmes-de-programmation-slidesync.xml'
				}
			}
		});</script></p><hr/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" class="podpress_feed_buttons" alt="Subscribe with iTunes"></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" class="podpress_feed_buttons" alt="Xebia France Podcast Feed"></a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/09/15/paradigmes-de-programmation-par-nicolas-demengel/feed/</wfw:commentRss> <slash:comments>5</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2011-09-paradigmes-de-programmation.mp4" length="162151657" type="audio/mpeg" /> <itunes:duration>1:23:57</itunes:duration> <itunes:subtitle>Suite à la lecture du livre &#171;&#160;Seven Languages in Seven Weeks&#160;&#187; (Bruce A. Tate), Nicolas Demengel nous a présenté les principaux paradigmes de programmation durant notre journée XKE. Nous souhaitons partager avec vous cette sessio[...]</itunes:subtitle> <itunes:summary>Suite à la lecture du livre &#171;&#160;Seven Languages in Seven Weeks&#160;&#187; (Bruce A. Tate), Nicolas Demengel nous a présenté les principaux paradigmes de programmation durant notre journée XKE. Nous souhaitons partager avec vous cette session au travers de cette vidéo.
Bon visionnage&#160;!
Paradigmes de programmation par Nicolas Demengel
Tous les podcasts Xebia France : </itunes:summary> <itunes:keywords>clojure, Erlang, Groovy, Haskell, JavaScript, Prolog, Python, Ruby, scala, vidéo, XKE</itunes:keywords> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/08/09/revue-de-presse-xebia-223/</link> <comments>http://blog.xebia.fr/2011/08/09/revue-de-presse-xebia-223/#comments</comments> <pubDate>Tue, 09 Aug 2011 07:47:44 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Amazon AWS]]></category> <category><![CDATA[Backbone.js]]></category> <category><![CDATA[Bloogaey]]></category> <category><![CDATA[Cloud Foundry]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[evolutionary architecture]]></category> <category><![CDATA[Gaelyk]]></category> <category><![CDATA[git]]></category> <category><![CDATA[Github]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[infrastructure as code]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[JQuery Mobile]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[PaaS]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[progressive enchancement]]></category> <category><![CDATA[Selenium]]></category> <category><![CDATA[Sonar]]></category> <category><![CDATA[Technology Radar]]></category> <category><![CDATA[ThoughtWorks]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8294</guid> <description><![CDATA[La revue de presse de l’actualité Java/JEE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII A vos radars! Le coin de la technique Gaelyk v1.0: Google App Engine en Groovy Actualité éditeurs / SSII A vos radars! ThoughtWorks vient de publier une nouvelle édition de son Technology Radar et, comme à chaque publication de ce [...]]]></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 de l’actualité Java/JEE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/08/09/revue-de-presse-xebia-223/#Avosradars">A vos radars!</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/08/09/revue-de-presse-xebia-223/#GaelykvGoogleAppEngineenGroovy">Gaelyk v1.0: Google App Engine en Groovy</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Avosradars"></a>A vos radars!</h4><p>ThoughtWorks vient de publier une nouvelle édition de son <a
title="Technology Radar" href="http://www.thoughtworks.com/radar"><em>Technology Radar</em></a> et, comme à chaque publication de ce désormais célèbre baromètre technologique, l&#8217;analyse conjoncturelle qu&#8217;y proposent Rebecca Parsons et Martin Fowler est souvent avant-gardiste, quelquefois controversée, mais ne laisse jamais indifférent.</p><p>Cette nouvelle mouture se situe nettement dans la mouvance du <a
title="Software Craftsmanship" href="http://blog.xebia.fr/2011/01/31/software-craftsmanship-en-pratique/">Software Craftsmanship</a> avec pour maîtres-mots l&#8217;automatisation, la simplicité et la qualité.</p><p>En effet, quand on plonge dans le détail de l&#8217;analyse, on s&#8217;aperçoit que la tendance côté techniques est à l&#8217;automatisation. Les cultures prônant l&#8217;automatisation totale ou quasi-totale de la chaîne de build, jusqu&#8217;à la mise en production, sont l&#8217;objet d&#8217;un gain d&#8217;intérêt considérable, passant pour certaines d&#8217;entre elles du stade de <em>Trial</em> (à tester) à celui d&#8217;<em>Adopt</em> (à adopter): citons d&#8217;une part le concept de &laquo;&nbsp;<em>Continuous Delivery</em>&nbsp;&raquo; &#8212; véritable fer de lance de ThoughtWorks dont nous avions déjà fait l&#8217;écho <a
title="ici-même" href="http://blog.xebia.fr/2011/02/22/revue-de-presse-xebia-199/#ContinuousDeliveryselonMartinF">ici-même</a> &#8212; et d&#8217;autre part la culture &laquo;&nbsp;&nbsp;<a
title="DevOps" href="http://blog.xebia.fr/tag/devops/"><em>DevOps</em></a>&nbsp;&nbsp;&raquo;, décidément de plus en plus en vogue.</p><p>Citons encore le concept de plus en plus répandu de <em>infrastructure as code</em> ou encore le concept novateur d&#8217;architecture évolutive (<em>evolutionary architecture</em>): il s&#8217;agit de promouvoir une architecture d&#8217;entreprise non pas chargée de prédire l&#8217;avenir mais constamment adaptée au besoin du moment; plutôt que de deviner comment un composant pourrait être réutilisé, il s&#8217;agit ici de prévoir son adaptabilité intrinsèque en favorisant un développement robuste, fondé sur les bonnes pratiques de code, les tests et l&#8217;intégration continue.</p><p>Côté performance et tests, ThoughtWorks estime que la problématique de la mise en cache des données et de son usage raisonné (<em>thoughtful caching</em>) est souvent négligée et reléguée au rang d&#8217;ajustement final, alors qu&#8217;il s&#8217;agirait d&#8217;un élément clé du succès d&#8217;une application. De même pour les tests de performance, qui gagneraient à être exécutés dès les phases initiales du projet et sur une base régulière; il n&#8217;est d&#8217;ailleurs pas nécessaire, pour cela, de faire appel à des frameworks lourds: un simple script peut suffire.</p><p>ThoughtWorks salue ensuite la maturité actuelle du développement mobile, en le faisant passer de <em>Trial</em> à <em>Adopt</em>. A l&#8217;aide d&#8217;outils comme <a
title="jQuery Mobile" href="http://jquerymobile.com/">jQuery Mobile</a> et de <a
title="Selenium" href="http://seleniumhq.org/">Selenium</a> (qui commence à se doter de <a
title="quelques drivers" href="http://slidesha.re/selenium2">quelques drivers</a> pour mobiles), ainsi que des techniques comme le <em>progressive enhancement</em> (adaptation de l&#8217;application aux capacités du terminal mobile), il serait aujourd&#8217;hui aussi aisé de développer pour mobiles que pour des desktops. ThoughtWorks met en revanche en garde contre les kits de développement multi-plateformes qui engendreraient davantage de complexité qu&#8217;ils ne produisent de bénéfices.</p><p>En termes d&#8217;outils de développement, c&#8217;est sans doute <a
title="Git" href="http://git-scm.com/">Git</a> et surtout <a
title="GitHub" href="https://github.com/">GitHub</a> qui sortent du lot, ce dernier passant d&#8217;un seul coup de <em>Assess</em> (à considérer) à <em>Adopt</em>. ThoughtWorks salue la rapidité et l&#8217;aisance de cet outil de contrôle de version, tout en récriminant contre des outils concurrents, comme ClearCase ou TFS, qui mettraient des freins à la productivité avec par exemple des contrôles de validité au moment du commit: décidément <em>has been</em>.</p><p>Parmi les langages de programmation, JRuby est à l&#8217;honneur: selon le radar, le couple Rails 3 + JRuby serait une &laquo;&nbsp;plateforme exceptionnelle&nbsp;&raquo; dont l&#8217;entreprise aurait tort de se priver. Clojure fait quant à lui son entrée dans le radar et se voit saluer une communauté vibrante et des librairies et outils toujours plus complets. Mais c&#8217;est HTML5 qui gagne en confiance en passant de <em>Trial</em> à <em>Adopt</em>, notamment grâce au stockage offline; selon ThoughtWorks, il s&#8217;agit d&#8217;un langage mûr malgré un standard encore sujet à évolution.</p><p>Un autre langage dont le radar vante les mérites est bien sûr JavaScript; mais ThoughtWorks met en garde contre un langage parfois trop puissant ou souvent mal maîtrisé, d&#8217;où la nécessité de le &laquo;&nbsp;cadrer&nbsp;&raquo; au travers d&#8217;outils de plus en plus répandus, comme <a
title="Backbone.js" href="http://documentcloud.github.com/backbone/">Backbone.js</a> (une implémentation du modèle MVC en JavaScript), ou même d&#8217;outils encore confidentiels, comme <a
title="Coffeescript" href="http://jashkenas.github.com/coffee-script/">Coffeescript</a>, un compilateur capable de compiler du &laquo;&nbsp;coffeescript&nbsp;&raquo; en javascript. (Nous nous permettons d&#8217;ailleurs d&#8217;ajouter à cette liste <a
title="Requirejs" href="http://capmousse.github.com/require.js/">Require.js</a>, un petit framework pour le chargement asynchrone de fichiers JavaScript.)</p><p>La simplicité et la facilité d&#8217;utilisation sont prônées un peu partout, notamment dans le domaine SOA, où REST et OAuth s&#8217;imposent face à SOAP et aux stacks WS-*; dans le domaine des frameworks web, où l&#8217;on voit <a
title="Play! Framework" href="http://playframework.org/">Play! Framework</a> prendre du galon au détriment de GWT ou des solutions de type portail, qui à force de masquer la complexité en finiraient par brider le développeur; ou encore lorsque ThoughtWorks sort le carton rouge pour les procédures stockées: trop lourdes, pas assez maintenables, elles ne seraient quasiment jamais une bonne solution.</p><p>Le cloud n&#8217;est pas oublié non plus et, d&#8217;une manière générale, le concept de PaaS (<em>Platform as a Service</em>) est à l&#8217;honneur: Amazon AWS passe au stade de <em>Adopt</em> tandis que <a
title="Cloud Foundry" href="http://cloudfoundry.org/">Cloud Foundry</a> fait son entrée dans le radar.</p><p>Enfin, la nécessité de métriques fiables et surtout consolidées et historisées de la qualité du code font enfin apparaître <a
title="Sonar" href="http://sonarsource.org/">Sonar</a> dans le radar: un comble!</p><p>Bref, on peut ne pas être d&#8217;accord sur tout, on peut mettre en doute l&#8217;impartialité du jugement, mais le <em>Technology Radar</em> reste une référence en matière d&#8217;analyse conjoncturelle et ses oracles sont de plus en plus suivis. Cette mouture ne préconise-t-elle pas d&#8217;ailleurs, assez ironiquement, que chaque entreprise conçoive son propre radar?</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="GaelykvGoogleAppEngineenGroovy"></a>Gaelyk v1.0: Google App Engine en Groovy</h4><p>Guillaume Laforge, <a
title="castcodeur" href="http://lescastcodeurs.com/">castcodeur</a> émérite et surtout celui qui pousse le langage Groovy, nous apprend qu&#8217;il vient de sortir la version 1.0 de Gaelyk, son bébé. Démarré mi-2009, le framework se veut léger: il utilise la puissance de la syntaxe Groovy et tourne sur le cloud de Google. L&#8217;avantage, par rapport à Grails, est que Gaelyk est pensé des le départ pour tourner sur App Engine, alors que Grails y a souvent eu des problèmes. Bien sûr, on est limité à une version du Cloud, celui de Google, ce qui pose tout de même quelques limitations, mais il faut bien avouer que pour déployer rapidement une application Cloud bénéficiant de toute la puissance de Groovy (pour la syntaxe) et Java (pour les librairies), Gaelyk est très puissant.</p><p>La grosse nouveauté de cette version est sans conteste le tant attendu <a
title="Query DSL" href="http://gaelyk.appspot.com/tutorial/app-engine-shortcuts#query">Query DSL</a> qui permettra d&#8217;écrire des requêtes directement en Groovy. C&#8217;était vraiment la fonctionnalité qui était attendue depuis longtemps et permet au framework de combler le principal manque de manière à offrir une réelle uniformité.</p><p>Parmi les autres nouveautés, on notera l&#8217;ajout d&#8217;<a
title="un fichier DSLD" href="http://groovy.codehaus.org/DSL+Descriptors+for+Groovy-Eclipse">un fichier DSLD</a> (descripteur utilisé par Eclipse pour permettre l&#8217;auto-complétion), des mises à jour des version de GAE et Groovy et quelques autres <em>fix</em> et ajouts, visibles sur <a
title="le changelog" href="http://docs.codehaus.org/display/GROOVY/2011/08/05/Gaelyk+1.0+released+--+lightweight+Groovy+toolkit+for+Google+App+Engine">le changelog</a>.</p><p>A noter que Guillaume Laforge &laquo;&nbsp;<a
title="eats his own dogfood" href="http://en.wikipedia.org/wiki/Eating_your_own_dog_food">eats his own dogfood</a>&nbsp;&raquo; et cette <em>release</em> est l&#8217;occasion pour lui de migrer <a
title="son propre blog" href="http://glaforge.appspot.com/article/gaelyk-1-0-is-out">son propre blog</a> sur Gaelyk. Il <a
title="a annoncé" href="http://groups.google.com/group/gaelyk/msg/2589a9da1b7bc6ef">a annoncé</a> qu&#8217;il utilisait pour cela un nouveau framework créé par ses soins pour l&#8217;occasion, Bloogaey, disponible pour tous <a
title="sur Github" href="https://github.com/glaforge/bloogaey">sur Github</a>.</p><p>Du coté de Grails, rappelons que la V2 se rapproche, nous vous avions annoncé la Milestone 1 <a
title="la semaine dernire" href="http://blog.xebia.fr/2011/08/02/revue-de-presse-xebia-222/#comment-67373">la semaine dernière</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/08/09/revue-de-presse-xebia-223/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/</link> <comments>http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#comments</comments> <pubDate>Tue, 26 Jul 2011 08:03:10 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Ceylon]]></category> <category><![CDATA[CI]]></category> <category><![CDATA[ClojureScript]]></category> <category><![CDATA[GAE]]></category> <category><![CDATA[Gemfire]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[interview]]></category> <category><![CDATA[Java 7]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Kotlin]]></category> <category><![CDATA[multithreading]]></category> <category><![CDATA[Spring Data]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8253</guid> <description><![CDATA[La revue de presse de l’actualité Java/JEE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Jenkins : The Definitive Guide Java, Kotlin, Ceylon&#8230; Que d&#8217;îles ! Le coin de la technique Springsource: des nouveautés en pagaille Java en entretien technique Fork/Join: le multithread facile en Java 7 Sortie de Groovy 1.8.1 et 1.9 beta 1 [...]]]></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 de l’actualité Java/JEE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#JenkinsTheDefinitiveGuide">Jenkins : The Definitive Guide</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#JavaKotlinCeylonQuedlesnbsp">Java, Kotlin, Ceylon&#8230; Que d&#8217;îles !</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#Springsourcedesnouveautsenpaga">Springsource: des nouveautés en pagaille</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#Javaenentretientechnique">Java en entretien technique</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#ForkJoinlemultithreadfacileenJ">Fork/Join: le multithread facile en Java 7</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#SortiedeGroovyetbeta">Sortie de Groovy 1.8.1 et 1.9 beta 1</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#SortiedeGoogleAppEngineSDK">Sortie de Google App Engine SDK 1.5.2</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#Scalaversuneversionclassiqueet">Scala : vers une version &laquo;&nbsp;classique&nbsp;&raquo; 2.9.1 et une version .Net</a></li><li><a
href="http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/#ClojureScript">ClojureScript</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="JenkinsTheDefinitiveGuide"></a>Jenkins : The Definitive Guide</h4><p>Wakaleo Consulting sort un ebook gratuitement téléchargeable : <a
title="Jenkins The Definitive Guide" href="http://www.wakaleo.com/download-jenkins-the-definitive-guide">Jenkins The Definitive Guide</a>. Comme son nom l&#8217;indique c&#8217;est un guide très complet sur le serveur d&#8217;intégration continue, ex-Hudson. Le guide couvre :</p><ul><li>installation et configuration</li><li>sécurisation</li><li>notifications email, IRC, Jabber, SMS et autres</li><li>structuration des jobs</li><li>promotions de bonnes pratiques de développement, via Checkstyle, PMD, FindBugs et autres plugins</li></ul><p>Il est bien écrit (en anglais) et mérite d&#8217;y <a
title="jeter un oeil" href="http://www.wakaleo.com/download-jenkins-the-definitive-guide">jeter un œil</a>, que ce soit pour apprendre, approfondir ou réviser.</p><h4><a
name="JavaKotlinCeylonQuedlesnbsp"></a>Java, Kotlin, Ceylon&#8230; Que d&#8217;îles !</h4><p>Ces derniers temps furent très mouvementés dans le monde des langages alternatifs de la JVM.</p><p>On sait maintenant que Kotlin n&#8217;est plus seulement connu pour être une <a
title="le perdue en Russie" href="http://en.wikipedia.org/wiki/Kotlin_Island">île perdue en Russie</a>. C’est aussi un nouveau langage proposé par l&#8217;équipe de JetBrains censé tourner sur JVM (et encore un de plus, diront certains). Dans les particularités remarquables du langage, nous trouvons :</p><ul><li>les closures et les fonctions d’ordre supérieur,</li></ul><pre class="brush: java; title: ; notranslate">
fun  filter(Iterable items, predicate : fun(T) : boolean) : Iterable { … }
filteredPersons = filter(persons, { it.getAge() &gt;= 18 });
</pre><ul><li>les fonctions d’extension qui permettent d’ajouter de nouvelles méthodes à des classes,</li><li>le pattern matching,</li></ul><pre class="brush: java; title: ; notranslate">
when (x) {
  is Int =&gt; print(x)
  is List =&gt; print(x.sum())
  !is Number =&gt; print(&quot;Not even a number&quot;)
  else =&gt; print(&quot;can't do anything&quot;)
}
</pre><ul><li>La notion de tuple,</li><li>La couche objet habituelle avec des classes finale par défaut,</li><li>La réification des generics permettant de conserver les informations sur le type des arguments d’un type générique au runtime.</li></ul><p>Ce langage, vous ne pouvez pas encore l’utiliser car il n&#8217;est actuellement disponible qu’à l’état de <a
title="spcification" href="http://confluence.jetbrains.net/display/Kotlin/Welcome">spécification</a>. Un peu comme Ceylon, en fait, qui est aussi une île. Et d’ailleurs, comme Ceylon, il se veut être une simplification de Scala. Bien sûr, ce nouveau langage à créé le buzz auprès de la communauté des développeurs Java et Scala.</p><p>D’ailleurs Gavin King en a profité pour nous donner un <a
title="rapport davancement sur Ceylon" href="http://relation.to/Bloggers/CeylonProgressReport">rapport d’avancement sur Ceylon</a>. Et bien&#8230; Il avance dans le travail de son compilateur. Mais il semble qu’après l’annonce de Kotlin, Gavin s’est malheureusement attiré à lui le buzz et la guerre pseudo-fratricide qui l’accompagne. La situation lui ayant échappé, Gavin a décidé de fermer les commentaires de son post.</p><p>Tous ces nouveaux langages ont donné envie à Stephen Colebourne d’écrire un essai (au sens littéraire du terme) sur deux notations utilisées dans la déclaration de type : la déclaration de type classique (comme en Java ou C) et la déclaration de type inversée (comme en Scala ou en Pascal). Stephen réalise sa démonstration au travers de différents langages : Java, Java avec les lambdas expressions en utilisant la <a
href="http://cr.openjdk.java.net/~mr/lambda/straw-man/">proposition strawman</a>, Java avec les lambdas expressions en utilisant la proposition BGGA, Ceylon, Fantom, Gosu, Kotlin et Scala. Nous vous laissons lire <a
title="larticle" href="http://www.jroller.com/scolebourne/entry/reversed_type_declarations">l’article</a> et en tirer vos propre conclusions.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Springsourcedesnouveautsenpaga"></a>Springsource: des nouveautés en pagaille</h4><p>SpringSource nous fait le plein de nouveautés avec plusieurs sorties:</p><p><strong>Spring Data JPA 1.0</strong></p><p>Le projet Spring Data vise à faciliter les accès aux bases de données et à gagner encore et toujours en productivité. Au travers de cette API, il est possible d&#8217;utiliser aussi bien des bases NoSQL que des bases relationnelles.</p><p>L&#8217;API est pour l&#8217;instant relativement succincte. Il est possible de faire du CRUD et de l&#8217;interrogation sans écrire une seule requête grâce à un système de convention de nommage des méthodes.</p><p>L&#8217;interface de base se nomme <a
title="Repository" href="http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.core-concepts"><em>Repository</em></a>. Si votre interface UserRepository étend Repository et définit une méthode findByName(String name), vous pouvez directement l&#8217;utiliser pour rechercher vos éléments. Le framework, en fonction de l&#8217;environnement que vous avez, construira une requête sur l&#8217;entité User en cherchant celle qui a le nom donné en paramètre. Vous définissez le contrat, le framework s&#8217;occupe de l&#8217;implémentation.</p><p>Avec Spring Data JPA 1.0 qui arrive en release finale, il est possible d&#8217;utiliser JPA 2.0 au travers de l&#8217;abstraction fournie par Spring Data. En plus du CRUD, l&#8217;API Criteria de JPA a été portée avec son lot de prédicats. Il est aussi possible d&#8217;utiliser des Queries en JPQL et de les associer aux méthodes du Repository pour des implémentations personnalisées de certaines méthodes. Cette première version reste verbeuse, mais Spring assure vouloir réduire le code technique avec la maturité à venir de son nouveau produit.</p><p><strong>Spring Data 1.1.0.M2</strong></p><p>Spring Data Graph <a
title="1.1.0.M2" href="http://www.springsource.org/spring-data/neo4j">1.1.0.M2</a> en version minestrone ajoute de nouvelles fonctionnalités sur la gestion de la base de données orientée graphe <a
title="Neo4J" href="http://neo4j.org/">Neo4J</a>. En plus de la correction de quelques bugs, l&#8217;API supporte maintenant la version 1.4. Tant que nous y sommes, si vous choisissez d&#8217;étudier les bases de données graphe, essayez <a
title="Gephi" href="http://gephi.org/">Gephi</a> pour la visualisation et l&#8217;exploration des données: c&#8217;est visuellement intéressant !</p><p><strong>Spring Gemfire 1.1.0.M1</strong></p><p><a
title="Spring Gemfire" href="http://www.springsource.org/spring-gemfire">Spring Gemfire</a> est arrivé en version 1.1.0.M1 la semaine dernière.</p><p>Les applications propulsées par Spring peuvent déjà se préparer à utiliser la version 6.6 du système de gestion de données réparti de <a
title="VMWare" href="http://www.vmware.com/products/vfabric-gemfire/overview.html">VMWare</a>. Il permet aussi d&#8217;utiliser l&#8217;abstraction de cache apportée par <a
title="Spring 31" href="http://blog.springsource.com/2011/02/23/spring-3-1-m1-caching/">Spring 3.1</a>. La connexion aux Cache Server de GemFire est rendue disponible (pour la réplication de session HTTP par exemple). Enfin, pour la création de requête, dites au revoir à la génération par chaînes de caractères (avec inclusion des paramètres), et bonjour au templating avec l&#8217;utilisation des paramètres variables.</p><h4><a
name="Javaenentretientechnique"></a>Java en entretien technique</h4><p>Ah les questions techniques lors d&#8217;un recrutement&#8230; Quel développeur n&#8217;a jamais eu peur de faire face à ces questions alors même qu&#8217;il estime bien connaître les méandres de la spec Java. Mais les points flous et d&#8217;incompréhension peuvent être nombreux !<br
/> Dans un <a
title="récent post" href="http://java.dzone.com/articles/incorrect-core-java-interview#">récent post</a>, Peter Lawrey revient sur certains de ces points et nous livre son analyse. Nous ne reparlerons pas (zut, trop tard !) de l&#8217;éternel &laquo;&nbsp;pass by value VS pass by reference&nbsp;&raquo; qui génère toujours <a
title="beaucoup de commentaires" href="http://blog.xebia.fr/2011/01/13/legende-urbaine-en-java-les-objets-sont-passes-par-reference/">beaucoup de commentaires</a>, mais nous pourrons citer par exemple:</p><ul><li>Les modificateurs transient et volatile</li><li>Overriding, overloading: lequel fait quoi ?</li><li>que retourne boolean.class.getSuperclass() ?</li><li>Rappelez moi la définition d&#8217;un Java Bean ?</li></ul><p>Ainsi que quelques autres questions. Rien de bien nouveau mais une petite piqûre de rappel fait toujours du bien, même aux plus calés.</p><p>Tant que nous sommes sur les questions lors d&#8217;une entretien, n&#8217;oubliez pas que si vous avez à réaliser un bout de code mais pas vraiment l&#8217;envie de le faire, il est toujours possible de s&#8217;en sortir en utilisant <a
title="la technique suivante" href="http://exold.com/article/stupid-interview-questions">la technique suivante</a>. Dans celle-ci, l&#8217;auteur pousse l’exagération jusqu&#8217;à la mauvaise fois en demandant des spécification extrêmes sur ce qui lui est demandé de réaliser, une simple copie de fichiers. Notez qu&#8217;il est formellement déconseillé d&#8217;utiliser cette technique lors d&#8217;un entretien chez Xebia <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><h4><a
name="ForkJoinlemultithreadfacileenJ"></a>Fork/Join: le multithread facile en Java 7</h4><p>Alors que le nombre de core par CPU ne cesse de croître, il serait peut être temps que nous utilisions à bon escient les ressources disponibles sur nos serveurs, non ? Java sait depuis toujours faire du multi-threading (encore heureux !) mais il est généralement très compliqué de faire du code multi-threadé efficace et maintenable. Notamment, la synchronisation entre les différent Thread a toujours été source de problèmes. Java 5 puis 6 apportèrent d&#8217;importantes innovations, sous la forme du package <em>java.util.concurrent</em> qui fournit:</p><ul><li>les <a
title="Executors" href="http://download.oracle.com/javase/tutorial/essential/concurrency/exinter.html">Executors</a>, qui abstraient des pools de threads, ainsi que les <a
title="Future" href="http://download.java.net/jdk7/docs/api/java/util/concurrent/Future.html">Future</a> et <a
title="Callable" href="http://download.java.net/jdk7/docs/api/java/util/concurrent/Callable.html">Callable</a></li><li>des queues et Collections thread-safe</li><li>le support de la déclaration de timeout sur les opérations</li><li>des classes implémentant des patterns de synchronisation et d&#8217;exclusion mutuelle, comme les Barrier ou Countdown Latch (plus de détails <a
title="chez OReilly" href="http://onjava.com/pub/a/onjava/excerpt/jthreads3_ch6/index1.html">chez O&#8217;Reilly</a>)</li><li>le package <em><a
title="javautilconcurrentatomic" href="http://download.java.net/jdk7/docs/api/java/util/concurrent/atomic/package-summary.html">java.util.concurrent.atomic</a></em> fournissant des wrappers pour des variables simples permettant des opérations de modification atomiques sur ces variables</li></ul><p>Ces apports au langage étaient les bienvenus. Néanmoins, certains type de tâche, et notamment les algorithmes de type <a
title="" href="http://fr.wikipedia.org/wiki/Diviser_pour_r%C3%A9gner_%28informatique%29">&laquo;&nbsp;diviser pour régner&nbsp;&raquo;</a> ou <a
title="mapreduce" href="http://fr.wikipedia.org/wiki/MapReduce">&laquo;&nbsp;map/reduce&nbsp;&raquo;</a>, requièrent des fonctionnalités qui n’étaient pas offertes .</p><p>Julien Ponge nous gratifie d&#8217;un article <a
title="sur Oracle Tech. Network" href="http://www.oracle.com/technetwork/articles/java/fork-join-422606.html">sur Oracle Tech. Network</a> avec l&#8217;exemple d&#8217;utilisation suivant: on désire compter le nombre d’occurrences d&#8217;un mot donné dans des fichiers répartis dans une arborescence du filesystem. Et ca tombe bien, Java 7 fournit justement une implémentation du principe fork/join au travers de la classe abstraite <a
title="ForkJoinTask" href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinTask.html">ForkJoinTask</a> et de ses sous-classes. Le filesystem est parcouru grâce à des tâches récursives, mais parallèles. Initialement on a une tâche de type FolderSearchTask qui étend <a
title="RecursiveTask" href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html">RecursiveTask</a> et crée:</p><ul><li>pour chaque répertoire, une nouvelle tâche FolderSearchTask</li><li>pour chaque document, une DocumentSearchTask qui étend aussi <a
title="RecursiveTask" href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html">RecursiveTask</a> et compte le nombre d’occurrences du mot recherché</li></ul><p>Au final l&#8217;algorithme est rendu quasi-trivial avec l&#8217;utilisation du nouveau Framework, alors qu&#8217;il n&#8217;en aurait pas été de même avant Java 7. En effet celui-ci permet de résoudre des problèmes récursifs dont ne ne connaît à priori pas la taille. Dans le cas exposé le comptage débute alors qu&#8217;on ne sait pas quelle sera la profondeur du système de fichiers ni le nombre de documents qui sera rencontré.</p><p>Une image valant mieux qu&#8217;un long discours, voici une illustration assez explicite accompagnant <a
title="larticle" href="http://www.oracle.com/technetwork/articles/java/fork-join-422606.html">l&#8217;article</a> dont nous vous conseillons fortement la lecture:</p><div
align="center"><a
href="http://www.oracle.com/technetwork/articles/java/fork-join-422606.html"><img
src="http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/422591.png" alt="" border="0" /></a></div><h4><a
name="SortiedeGroovyetbeta"></a>Sortie de Groovy 1.8.1 et 1.9 beta 1</h4><p>Le projet Groovy continue à avancer et sort la première version corrective de la branche 1.8 et sa nouvelle beta de la 1.9.</p><p>Au menu pour la 1.8.1 :</p><ul><li>plus de 40 bugfixes.</li><li>amélioration du JSonBuilder avec un mode streaming.</li><li>la suite du chantier sur les performances des opérations arithmétiques sur type primitifs.</li></ul><p>Pour la 1.9 beta 1 :</p><ul><li>plus de 20 bugfixes</li><li>intégration des nouveautés Java 7 liées au Project Coin</li></ul><p>Pour le détail complet, voir l&#8217;<a
title="annonce sur DZone" href="http://groovy.dzone.com/announcements/groovy-181-and-19-beta-1">annonce sur DZone</a> ou les release notes JIRA des versions <a
title="1.8.1" href="http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&amp;version=17223">1.8.1</a> et <a
title="19 beta 1" href="http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&amp;version=17153">1.9 beta 1</a>.</p><h4><a
name="SortiedeGoogleAppEngineSDK"></a>Sortie de Google App Engine SDK 1.5.2</h4><p>Une nouvelle <a
title="version" href="http://googleappengine.blogspot.com/2011/07/app-engine-152-sdk-released.html">version</a> 1.5.2 du SDK de Google App Engine vient de sortir. Pour rappel, GAE est une plateforme as a service (<a
title="PaaS" href="http://fr.wikipedia.org/wiki/Platform_as_a_service">PaaS</a>) permettant d&#8217;héberger dans le cloud des applications web Java et Python ( et prochainement <a
title="Go" href="http://code.google.com/intl/fr/appengine/docs/go/overview.html">Go</a>, le nouveau langage développé par Google).</p><p>En plus de quelques bogues corrigés, cette release apporte quelques nouveautés intéressantes, comme :</p><ul><li>Des paramètres pour ajuster le ratio coût/performance de l&#8217;application: Possibilité de définir le nombre minimale d&#8217;instances au repos, et la latence minimale d&#8217;attente, qui permet d&#8217;ajuster le temps minimum qu&#8217;une requête doit attendre dans la queue avant d&#8217;être traitée par une instance.</li><li>Suppression de la contrainte de créer des index explosés pour &laquo;&nbsp;les big entities&nbsp;&raquo; et réduction des index personnalisés.</li><li>Les statistiques du Datastore peuvent être regroupées par espace de nom.</li><li>Des informations supplémentaires ont été ajoutés à la page d&#8217;administration des Task Queue.</li><li>La limitation de la taille de la Pull Task est passée à 1MB.</li></ul><p>Pour plus d&#8217;infos, voir la <a
title="release note" href="http://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes">release note</a>.</p><p>Force est de constater que la plateforme de Google s&#8217;enrichit de release en release. De nombreuses limitations se réduisent voire disparaissent au fur et à mesure. Les possibilités de monitoring, de tuning, et d&#8217;administration des backends commencent à bien s&#8217;étoffer.</p><h4><a
name="Scalaversuneversionclassiqueet"></a>Scala : vers une version &laquo;&nbsp;classique&nbsp;&raquo; 2.9.1 et une version .Net</h4><p>Scala va bientôt une version 2.9.1 qui est maintenant disponible en <a
title="premire Release Candidate" href="http://www.scala-lang.org/node/10430">première Release Candidate</a>. Cette version devrait corriger un certain nombre de bug et mettre en place des améliorations en particulier au niveau de l’interpréteur.</p><p>Par ailleurs, Miguel Garcia, de l’équipe Scala à l’EPFL, <a
title="vient d’annoncer" href="http://www.scala-lang.org/node/10299">vient d’annoncer</a> une avancée majeure dans l’adaptation du langage de Martin Odersky à la plateforme .NET. Dans ce projet financé par Microsoft, l’adaptation a été rendue possible grâce au projet <a
title="IKVMNET" href="http://www.ikvm.net/">IKVM.NET</a>. IKVM est un projet mature et toujours en activité qui implémente un framework Java dédié aux plateformes Mono et .NET. On y trouve :</p><ul><li>la JVM compilée pour .NET,</li><li>une implémentation .NET de bibliothèques Java,</li><li>et un convertisseur JAR vers DLL.</li></ul><p>Miguel a mis en place un plugin apppelé <a
title="jdk2ikvm" href="http://lamp.epfl.ch/~magarcia/jdk2ikvm/">jdk2ikvm</a> pour le compilateur Scala qui permet de convertir un programme Scala pour JDK en programme Scala pour IKVM et donc .NET. Les développements ne sont actuellement pas complètement stabilisés, mais ils sont utilisables aux dires de l’auteur. Parmi les développements futurs, Miguel prévoit de développer un plugin Scala pour l’IDE Visual Studio et l’adaptation des collections concurrentes aux modèle de gestion de thread de .NET.</p><h4><a
name="ClojureScript"></a>ClojureScript</h4><p>Du côté de Clojure, l’annonce a été faite par Rich Hickey en personne (le créateur de Clojure) lors du <em>Clojure NYC Meetup</em> de juillet. Rich nous a appris la sortie de ClojureScript (voir la <a
title="vidéo" href="http://blip.tv/clojure/rich-hickey-unveils-clojurescript-5399498">vidéo</a>). ClojureScript est une adaptation de Clojure non pas à la plateforme .NET, mais à la plateforme JavaScript. Vous écrivez vos programmes en Clojure et ça vous le compile en JavaScript. La motivation derrière ce projet vient du fait que JavaScript est un langage donnant un accès un scope d’applications de plus en plus large, allant du client au service. Cependant, les développeurs de ClojureScript considèrent que la langage JavaScript possède un certain nombre de faiblesses, notamment pour la construction d’applications robustes qui nécessite de la discipline et le respect de conventions. C’est sur ce point que ClojureScript compte apporter des solutions. Il est possible récupérer une version depuis <a
title="GitHub" href="https://github.com/clojure/clojurescript">GitHub</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/07/26/revue-de-presse-xebia-221/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Rapport sur LA conférence Groovy européenne : la GR8Conf</title><link>http://blog.xebia.fr/2011/05/30/rapport-sur-la-conference-groovy-europeenne-la-gr8conf/</link> <comments>http://blog.xebia.fr/2011/05/30/rapport-sur-la-conference-groovy-europeenne-la-gr8conf/#comments</comments> <pubDate>Mon, 30 May 2011 16:07:59 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[GR8Conf]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[webflow]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7900</guid> <description><![CDATA[Comme annoncé, Xebia était présent pour la 3e édition du plus important rassemblement européen de la communauté Groovy : la GR8Conf de Copenhague (prononcez &#171;&#160;Great Conf&#160;&#187;). Pour tous ceux qui auraient voulu y être et n&#8217;ont pas pu, je vais tenter de vous résumer les sessions auxquelles j&#8217;ai assisté et vous donner la tendance du [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/gr8conf_logo.jpg" alt="gr8conf_logo" title="gr8conf_logo" width="130" style="margin: 1em 1em 1em 1em; float: right;"/></p><p>Comme annoncé, Xebia était présent pour la 3e édition du plus important rassemblement européen de la communauté Groovy : la GR8Conf de Copenhague (prononcez &laquo;&nbsp;Great Conf&nbsp;&raquo;). Pour tous ceux qui auraient voulu y être et n&#8217;ont pas pu, je vais tenter de vous résumer les sessions auxquelles j&#8217;ai assisté et vous donner la tendance du clan Groovy (en Europe tout du moins). Commençons par quelques chiffres :</p><ul><li>3 jours</li><li>25 speakers</li><li>plus de 100 participants</li><li>4 workshops</li><li>28 sessions</li><li>2421305344 octets de technologie Groovy sur clé USB (dans le pack de bienvenue)</li></ul><p>La conférence s&#8217;est tenue dans les locaux de la IT University of Copenhagen, qui a prêté un amphithéâtre et une grande salle de cours pour l&#8217;occasion.</p><p>Toutes les sessions ont été filmées (je vous donnerai les liens dès qu&#8217;ils seront publiés). Je n&#8217;ai malheureusement pas pu assister à la première journée : &laquo;&nbsp;l&#8217;université&nbsp;&raquo;. Ce premier jour, les participants ont eu droit à une mise à niveau sur le langage Groovy et le framework Grails, puis ont enchaîné une après-midi de code pour apporter des contributions à certains projets open-source. Certaines features codées pendant ces workshops ont même été intégrées le soir même et utilisées pour les démonstrations des 2 jours de conférence qui ont suivis.</p><h3><a
name="Groovyupdate"></a>Groovy update</h3><p>Après un rapide accueil de <a
href="https://twitter.com/#!/sbglasius" title="Søren Berg Glasius" >Søren Berg Glasius</a>, la première journée de conférence commence par un retour sur les dernières nouveautés du langage Groovy, par <a
href="https://twitter.com/#!/glaforge" title="Guillaume Laforge" >Guillaume Laforge</a>. Il ouvre la session avec quelques statistiques sur Groovy 1.7 :</p><ul><li>185 000 téléchargements le premier mois suivant la sortie,</li><li>177 000 pour le 2e mois,</li><li>une communauté de développeurs estimée à 362 000 (sans doute sous estimée puisque les téléchargements via le repository maven ne sont pas monitorés).</li></ul><p>Puis il enchaîne en revenant en détail sur les principales nouveautés de Groovy 1.8 :</p><ul><li><em>command chain expression</em> : pour des DSL plus proches du langage naturel. À utiliser avec rigueur pour ne pas se perdre entre ce qu&#8217;on passe comme paramètre et l&#8217;appel de la méthode suivante,</li><li>GPars fait maintenant partie du core de Groovy, ce qui offre de façon directe actors, fork-join, dataflow et autres joyeusetés,</li><li>Le support de JSON par défaut dans le langage.</li></ul><p>Il y a également beaucoup d&#8217;annotations très pratiques comme @Log, @Singleton, @WithReadLock, @WithWriteLock. Pour le détail complet, rendez vous <a
href="http://www.slideshare.net/glaforge/groovy-18-update-guillaume-laforge-gr8conf-europe-2011" title="sur Slideshare" >sur Slideshare</a>.</p><p>Enfin, une perspective sur les chantiers prévus pour la prochaine version majeure :</p><ul><li>Utilisation de InvokeDynamic du JDK7,</li><li>Amélioration de la modularité de Groovy pour permettre de n&#8217;embarquer que les modules utiles,</li><li>Réécriture de la grammaire antlr3, prévue pendant le prochain Google Summer of Code,</li><li>Remplacement du compilateur Joint par celui d&#8217;Eclipse,</li><li>Multicatch (IOException | NullPointer e),</li><li>et d&#8217;autres apports de syntaxe, comme l&#8217;intégration du projet Coin et le support des séparateurs pour améliorer la lisibilité des grands nombres.</li></ul><h3><a
name="Grailsupdate"></a>Grails update</h3><p>Dans la foulée des nouvelles, <a
href="https://twitter.com/#!/pledbrook" title="Peter Ledbrook" >Peter Ledbrook</a> nous a dressé le bilan de la branche 1.3 de Grails, avant de faire miroiter à l&#8217;auditoire les nouveautés qui se préparent pour la version 1.4. L&#8217;année écoulée a été celle de la version 1.3, avec énormément de nouveaux plugins, notamment pour fournir à l&#8217;abstraction GORM des implémentations sur NoSQL (comme Redis, MongoDB, Riak, Neo4j et d&#8217;autres). Il a également cité quelques gros comptes utilisant Grails comme framework de premier ordre dans leurs projets, comme Vodafone Music, par exemple.</p><p>La version 1.4 de Grails donne vraiment envie. Parmi les nombreuses améliorations attendues, on peut noter :</p><ul><li>Groovy 1.8,</li><li>Mise à jour de Spring vers la 3.1,</li><li>Mise à jour de Hibernate vers la 3.6,</li><li>L&#8217;utilisation de Tomcat 7 en mode développement,</li><li>Baptême de JQuery comme librairie Javascript de base,</li><li>Améliorations des templates par défaut lors de génération de pages GSP, appliquant les bonnes pratiques HTML5.</li></ul><p>Le but premier de cette version est d&#8217;améliorer encore l&#8217;expérience utilisateur (c&#8217;est à dire celle des développeurs). Ceux qui l&#8217;ont essayé peuvent en témoigner : Grails est déjà un framework très agréable. Espérons qu&#8217;ils arrivent à faire encore mieux. Il y aura également un système de feedbacks pour que, si les développeurs l&#8217;acceptent, leur installation de Grails puisse remonter chez SpringSource des données sur la version utilisée, les plugins installés, etc. Ces statistiques devraient permettre d&#8217;y voir plus clair dans le portail de plugins (qui a passé les 600 plugins), et ainsi connaître ceux qui servent et ceux qui dorment.</p><h3><a
name="AdopterGrails"></a>Adopter Grails</h3><p>Après cela, <a
href="https://twitter.com/#!/KlausBaumecker" title="Klaus Baumecker" >Klaus Baumecker</a>, architecte chez HP, est venu nous parler de l&#8217;adoption de Grails dans une équipe de développement interne.<br
/> Le cadre du projet :</p><ul><li>2 équipes qui développent la prochaine version d&#8217;un produit, l&#8217;une en Grails, l&#8217;autre en J2EE standard,</li><li>Modèle de données commun géré par Hibernate,</li><li>Approche agile (SCRUM-like),</li><li>Frontal Flex.</li></ul><p>Le speaker nous a énuméré les principaux obstacles techniques qui se sont dressés sur la route, notamment l&#8217;intégration de BlazeDS, qui s&#8217;est révélée moins triviale qu&#8217;au premier coup d&#8217;œil. Mais chaque obstacle a trouvé sa solution et le projet a été une réussite. Il a terminé en résumant l&#8217;expérience tirée sous forme de bonnes pratiques pour l&#8217;adoption de Grails :</p><ul><li>Parlez des bénéfices techniques du framework, pas seulement des &laquo;&nbsp;cool stuff&nbsp;&raquo;. Il a notamment insisté sur la flexibilité de Grails, qui a permis de contourner rapidement beaucoup de contraintes techniques,</li><li>Ne soyez pas trop enthousiaste : ça peut donner un aspect &laquo;&nbsp;fanboy&nbsp;&raquo; à votre argumentaire, là où vous voudriez être pris au sérieux,</li><li>Créez une communauté locale, en convaincant en premier lieu vos collègues avant d&#8217;aller voir vos responsables,</li><li>Appuyez vous sur la communauté Grails et aidez les gens autour de vous grâce à elle : se référer aux mailing lists, forums, IRC et autres blogs permet de fournir des points d&#8217;entrée utiles sur le long terme aux débutants,</li><li>Apportez vos outils : parlez des plugins, des outils d&#8217;analyse statique, des IDE,</li><li>Trouvez des situations dans lesquelles Grails fait une vrai différence : notamment quand on compare un &#8216;grails run-app&#8217; par rapport à un redéploiement d&#8217;application classique,</li><li>Restez dans la zone de confort du framework : même si le framework est flexible, rester dans les conventions permet aux débutants de s&#8217;y retrouver plus facilement en se référant aux ressources du web,</li><li>Soyez disponible : si vous tentez d&#8217;introduire Grails, c&#8217;est surement que vous avez un peu plus de connaissance que le reste de votre équipe. Apportez votre aide autant que possible, proposez de faire des revues de code, du pair programming, tout pour accompagner vos collègues sur le chemin de la lumière.</li></ul><p>Je ne saurais trop vous conseiller d&#8217;appliquer ces conseils pour tenter d&#8217;implanter Grails dans vos projets.</p><h3><a
name="Grailsenentreprise"></a>Grails en entreprise</h3><p>Peter Ledbrook a assuré une 2e session sur l&#8217;intégration de Grails dans le monde de l&#8217;entreprise, plus précisément dans les processus de développement logiciel déjà en place. Il a débuté en nous parlant des 2 outils de build les plus implantés dans l&#8217;écosystème Java : Ant et Maven. Pour pouvoir dire que Grails s&#8217;intègre correctement à l&#8217;existant, il est indispensable de pouvoir construire un projet Grails avec ces 2 outils.</p><p>Pour Ant, le problème est assez simple, dans la mesure où le système de build propre à Grails est Gant, c&#8217;est à dire Ant, manipulé grâce à Groovy. Une commande Grails permet de générer <em>build.xml</em> et <em>ivy.xml</em> : <code>grails integrate-with --ant</code>. De cette façon, on peut construire son projet directement avec Ant.</p><p>Pour Maven, des plugins existent pour brancher les scripts Grails dans les phases d&#8217;un build Maven standard. Cependant, l&#8217;intégration avec Maven pose plus de problèmes. De base Grails gère ses dépendances grâce à Ivy, alors que Maven le fait lui même. De plus, le côté rigide d&#8217;un build Maven provoque des frictions avec  celui, très flexible, des build Gant. Si vous pouvez vous le permettre, utilisez Gant et les conventions Grails.</p><p>À noter que pour la roadmap Grails 2.0, il est prévu de passer à Gradle, tout en conservant et améliorant les intégration Ant et Maven.</p><p>Peter a également axé une partie de sa présentation sur l&#8217;adaptabilité d&#8217;une application Grails à une base de données existante. Il est tout à fait possible de reprendre une base de données existante, par plusieurs stratégies:</p><ul><li>utilisation directe de fichiers de mapping Hibernate existant</li><li>mapping fin (table, colonnes, clé primaire, &#8230;) d&#8217;entités définies dans l&#8217;application</li><li>mixer les deux en fonction des besoins</li></ul><p>Pour finir, il nous a parlé de déploiement. les mécanismes de <a
href="http://grails.org/doc/latest/guide/17.%20Deployment.html" title="customisation du contenu du war" >customisation du contenu du war</a> permettent de satisfaire toutes les fantaisies des différents <a
href="http://grails.org/Deployment" title="serveurs d'application" >serveurs d&#8217;application</a>. Pour la production, il conseille fortement de s&#8217;appuyer sur les datasources JNDI et sur les mécanismes permettant d&#8217;externaliser la configuration (voir <a
href="http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/" title="ce tips" >ce tips</a>).</p><p>Puis il a terminé son exposé par quelques conseils d&#8217;ordre général sur les projets Grails :</p><ul><li>N&#8217;oubliez pas que Grails, c&#8217;est du Spring. Par conséquent, on bénéficie de tous les connecteurs du monde Spring, notamment JMS, ESB, AMQP, etc.</li><li>Utilisez le plugin <a
href="http://www.grails.org/plugin/app-info" title="appinfo" >app-info</a>, qui vous donnera des vues sur les entrailles de votre application. De la configuration de la datasource à l&#8217;utilisation mémoire en live.</li><li>Réutilisez vos classes de domaines au maximum. Si une classe de domaine peut servir à plusieurs applications, mettez la dans un plugin et utilisez le.</li></ul><p>La somme de toutes ces pistes et de tous ces conseils, c&#8217;est que Grails est intégrable à, virtuellement, tous les processus de développement logiciel en place. Il faut se donner un peu de peine, mais les outils sont là pour vous faciliter la tâche (à l&#8217;extrême).</p><div
style="text-align:center;"> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/IT_univ.jpg" alt="IT_univ" title="IT_univ" width="500" border="0" /></div><h3><a
name="CodeNarcGMetrics"></a>CodeNarc &#038; GMetrics</h3><p>Tandis que se tenait la session de mise à niveau sur Griffon, j&#8217;ai assisté à une présentation de <a
href="https://twitter.com/#!/mrhaki" title="Hubert Klein Ikkink alias MrHaKi" >Hubert Klein Ikkink alias MrHaKi</a>, l&#8217;auteur de billets <a
href="http://mrhaki.blogspot.com/search/label/Groovy%3AGoodness" title="Groovy Goodness" >Groovy Goodness</a> sur son blog, véritable mine d&#8217;or de trucs et astuces techniques.</p><p>Il est venu parler de CodeNarc et de GMetrics, 2 outils d&#8217;analyse statique de code Groovy. Le premier permet de détecter les mauvaises pratiques d&#8217;utilisation du langage, comme des appels explicites là où Groovy ferait implicitement le travail. Au total,174 autres règles sont fournies. Quant à GMetrics, son domaine concerne le calcul de la complexité cyclomatique de votre code.</p><p>CodeNarc a été cité dans beaucoup d&#8217;autres sessions pendant la GR8Conf, voici ce qu&#8217;il faut en retenir :</p><ul><li>Utilisez le !</li><li>Configurez le pour coller à vos bonnes pratiques maisons.</li><li>Ecrivez vos propres règles, et si elles sont génériques, reversez les au projet.</li></ul><p>Pour les détails techniques, je vous encourage à vous pencher sur les documentations respectives de <a
href="http://codenarc.sourceforge.net/" title="CodeNarc" >CodeNarc</a> et <a
href="http://gmetrics.sourceforge.net/" title="GMetrics" >GMetrics</a>.</p><h3><a
name="GrailsApplicationTuning"></a>Grails Application Tuning</h3><p>Voilà l&#8217;une des sessions pour lesquelles j&#8217;ai eu envie de faire le déplacement jusqu&#8217;au Danemark&#8230; Je n&#8217;ai pas été déçu. En une heure, Peter Ledbrook, dans sa 3ème prestation de la journée, a peiné à faire tenir tous les conseils sur l&#8217;optimisation en Grails. La plupart des aspect d&#8217;optimisation sont d&#8217;ailleurs communs à toute application web Java.</p><p>Premier conseil à graver au dessus de votre écran :</p><pre class="brush: java; title: ; notranslate">
Evitez toute optimisation prématurée : Profilez, optimisez, répétez.
</pre><p>Grails est basé sur une stack très classique, donc tous les outils de profiling fonctionnent.</p><h4><a
name="Outilsctserveur"></a>Outils côté serveur</h4><p>Voici quelques outils pour profilez le fonctionnement de votre application côté serveur :</p><ul><li><a
href="http://www.youtube.com/watch?v=yJzERMXophM" title="Spring Insight" >Spring Insight</a> : avec STS, vous pouvez démarrer votre application Grails dans un tcServer et bénéficier de l&#8217;analyse live de chaque requête sur votre application.</li><li>Le <a
href="http://www.grails.org/Profiler+Plugin" title="plugin profiler" >plugin profiler</a> : qui facilite la collecte de temps d&#8217;exécution sur votre code.</li><li>Le <a
href="http://www.grails.org/p6spy+plugin" title="plugin p6spy" >plugin p6spy</a> : installe un proxy JDBC qui vous donnera la détail de toutes les requêtes en base.</li><li>Les plugins <a
href="http://www.grails.org/plugin/app-info" title="app-info" >app-info</a> et <a
href="http://www.grails.org/plugin/hibernate-stats" title="hibernatestats" >hibernate-stats</a> : qui vous donneront beaucoup d&#8217;informations sur les fonctionnements internes de votre application.</li></ul><p>Tout cela devrait vous permettre de trouver plus rapidement les goulots d&#8217;étranglement dans votre code.</p><p>En vrac, voici un ensemble de pistes exploitables pour optimiser vos application Grails (ou autre d&#8217;ailleurs).</p><h4><a
name="Outilsnavigateurs"></a>Outils navigateurs</h4><ul><li><a
href="http://code.google.com/webtoolkit/speedtracer/" title="Google Spring Tracer" >Google Spring Tracer</a>, qui peut également s&#8217;intégrer à Spring Insight.</li><li><a
href="http://developer.yahoo.com/yslow/" title="YSlow" >YSlow</a>, il nécessite Firebug donc l&#8217;utilisation de Firefox, mais il est très pratique.</li></ul><h4><a
name="Performancebasededonnes"></a>Performance base de données</h4><ul><li>Réduire le nombre de requête</li><li>Analyser les requêtes et ajouter les index utiles</li><li>Optimiser vos requêtes, notamment en utilisant des requêtes Criteria nommées.</li><li>Faire attention aux stratégies de fetching</li><li>N&#8217;hésitez pas à changer le modèle pour gagner en performance de requêtage.</li><li>Dans certains cas, le chargement Eager peut être avantageux, n&#8217;hésitez pas à vous en servir (à bon escient).</li><li>Utiliser un cache, surtout dans le cas où il y a plus de lecture que d&#8217;écriture. Pour info, <a
href="http://ehcache.org/documentation/grails.html" title="Ehcache est disponible" >Ehcache est disponible</a> dans la stack Grails.</li></ul><h4><a
name="Performancesurlestraitementsmt"></a>Performance sur les traitements métier</h4><ul><li>Cachez les appels de méthodes de service idempotentes avec le <a
href="http://www.grails.org/plugin/springcache" title="plugin Springcache" >plugin Springcache</a>.</li><li>Faites de l&#8217;asynchrone partout où c&#8217;est possible, par exemple en utilisant le <a
href="http://www.grails.org/plugin/spring-events" title="plugin Spring Events" >plugin Spring Events</a>.</li><li>Utilisez le <a
href="http://www.grails.org/plugin/routing" title="plugin Routing" >plugin Routing</a> pour le messaging</li><li>Utilisez Groovy++ pour vous affranchir du surcoût du dynamisme de Groovy quand c&#8217;est possible.</li><li>Pour les tâches qui font beaucoup de calcul numérique, préférez le Java pur.</li></ul><h4><a
name="Optimisationrseauetnavigateurw"></a>Optimisation réseau et navigateur web</h4><ul><li>Utiliser les capacités de caching de contenu du <a
href="http://www.grails.org/plugin/springcache" title="plugin Springcache" >plugin Springcache</a> partout où c&#8217;est possible, pour éviter de recalculer les pages qui ne changent pas souvent.</li><li>Définissez correctement vos header <a
href="http://performance.survol.fr/2008/10/expires-et-cache-control-une-date-limite-de-consommation-pour-vos-contenus/" title="HTTP Expires" >HTTP Expires</a>.</li><li>Packager vos css et votre javascript, un fichier unique pour chaque permet de diminuer le nombre de requête.</li><li>Utiliser le <a
href="http://www.alsacreations.com/tuto/lire/1068-sprites-css-background-position.html" title="spriting CSS" >spriting CSS</a> plutôt que de multiples images.</li><li>Minifier votre Javascript.</li><li>Compresser vos données.</li></ul><p>L&#8217;utilisation du <a
href="http://grails.org/plugin/resources" title="plugin resources" >plugin resources</a> permet d&#8217;automatiser beaucoup de choses. Ce plugin très prometteur fera partie intégrante de Grails dès la version 1.4. Il permet notamment :</p><ul><li>de modulariser les ressources statiques.</li><li>de les packager par type.</li><li>définir les header HTTP Expires et de changer le nom des packages de ressources en cas de modification, ce qui forcera le rechargement par les navigateurs.</li><li>de placer le Javascript toujours en bas de page pour un chargement plus rapide des éléments visuels.</li></ul><p>Ciblez en priorité les victoires faciles. Il faut bien faire attention de ne pas investir trop de temps sur une petite optimisation. On ne vise pas les économies de bouts de chandelle. Une session très chargée et très intéressante. Peter a revendiqué le droit à une sieste après ce 3ème slot de la journée.</p><h3><a
name="EffectiveGroovy"></a>Effective Groovy</h3><p>Pour clore la journée, <a
href="https://twitter.com/#!/HamletDRC" title="Hamlet DArcy" >Hamlet D&#8217;Arcy</a> a présenté ses conseils pour être efficace dans l&#8217;usage du langage Groovy. Sa session était organisée autour d&#8217;une sélection de conseils tirés du livre culte <em>Effective Java</em> et appliqué au monde Groovy. Le speaker est à l&#8217;aise et captive son auditoire. Certaines vagues sur Twitter pendant sa présentation ont émis l&#8217;idée d&#8217;écrire un livre &laquo;&nbsp;Effective Groovy&nbsp;&raquo;. Parmi les conseils les plus utiles, vous pouvez noter :</p><ul><li>Utilisez Codenarc : pour détecter les erreurs les plus courantes, mais aussi pour écrire vos propres règles et les faire respecter au sein de votre équipe.</li><li>Dans le cas où vous avez des appels de constructeurs avec un grand nombre de paramètres, utilisez des arguments nommés pour garder un code lisible.</li><li>Utiliser GPars pour toute programmation conccurente.</li><li>Apprendre à utilise Grab pour gérer les dépendances Groovy de ses scripts.</li></ul><div
style="float:left; margin-right:20px;"> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/biere_gr8conf.jpg" alt="biere_gr8conf" title="biere_gr8conf" width="150" height="435" border="0" class="alignleft size-full" /></div><p>Les conseils prodigués ont tous été très bien justifiés mais il faudrait un article entier pour tout restranscrire ici. La racine commune à toutes ces bonnes pratiques est : utiliser le langage. Cela peut paraître simpliste mais c&#8217;est très vrai. Toute cette présentation ciblait les pratiques héritées du langage Java pur. Groovy, et à plus fort titre avec la version 1.8, fourni de nombreuses syntaxes et annotations permettant de gagner beaucoup de temps et de rendre le code plus lisible. Il faut s&#8217;en servir, à fond.</p><ul><li><a
href="http://dl.dropbox.com/u/138156/effectivegroovy_gr82011.pdf" title="Les slides complet ici" >Les slides complet ici</a>.</li></ul><h3><a
name="ConclusiondelapremirejourneMee"></a>Conclusion de la première journée : Meet &#038; Greet</h3><p>Après cette journée bien remplie, tous les participants, speakers et spectateurs, se sont retrouvés autour de bières belges et danoises aux couleurs de la conférence. Ce temps de détente a été l&#8217;occasion de discuter des outils, de l&#8217;adoption de Groovy dans les entreprises de chacun, de la qualité de la bière danoise&#8230;  Certains ont même réussi à coincer Peter Ledbrook dans un coin pour une séance de pair programming sur un bug dans le plugin Maven pour Grails. Pendant ce temps d&#8217;échange, j&#8217;ai eu le plaisir de faire la connaissance de <a
href="https://twitter.com/#!/ticetime" title="Franck Silvestre" >Franck Silvestre</a>, qui participe à la réalisation de l&#8217;un des plus gros projet Grails en France : <a
href="http://www.lilie.org/" title="Lilie" >Lilie</a>. C&#8217;est un projet destiné au secteur de l&#8217;enseignement et sous licence open-source, à voir absolument.</p><h3><a
name="DeuximejournerestermotivGrails"></a>Deuxième journée, rester motivé : Grails Infinispan plugin</h3><p>Après quelques agapes entre participants la veille, la 2ème journée démarre sur les chapeaux de roues, avec un exposé sur le plugin Grails pour <a
href="http://www.jboss.org/infinispan" title="Infinispan" >Infinispan</a>, la grille de données estampillée JBoss. Thomas Fuller nous présente des cas d&#8217;utilisation qui peuvent pousser à se servir d&#8217;une datagrid et quels gains on peut en retirer. Puis il fait le tour du <a
href="http://www.grails.org/plugin/infinispan" title="plugin Grails" >plugin Grails</a> pour s&#8217;interfacer avec Infinispan. Les exemples de code donnés sont d&#8217;une simplicité à toute épreuve, l&#8217;architecture de plugin de Grails est exploité à fond pour le confort du développeur.</p><p>Bien évidemment, ce n&#8217;est pas n&#8217;importe quel projet qui peut avoir besoin d&#8217;une datagrid, mais il est bon de savoir que des plugins existent déjà et sont utilisés et maintenus. Je regrette un peu trop de temps passé sur la première partie et la justification de l&#8217;utilité d&#8217;Infinispan. Le sujet était intéressant et j&#8217;aurais aimé voir plus de code que le strict minimum.</p><h3><a
name="GroovyPerformanceImprovements"></a>Groovy 1.8 Performance Improvements</h3><p>Ensuite, Jochen Theodorou, alias Blackdrag vient nous parler des optimisations de performances apportées par la version 1.8 de Groovy. Il semble que les gens de chez SpringSource en ai assez de se faire ridiculiser dans les micro benchmarks qu&#8217;on peut trouver sur le net. Ils ont donc placé leur effort sur la satisfaction des fétichistes du micro-bench.</p><p>Le plupart des micro-bench Groovy contre Java qu&#8217;on peut trouver sont basés sur des calculs arithmétiques, comme le célèbre calcul de la suite de Fibonacci. Mais Groovy est un langage dynamique, par conséquent, toutes les opérations mathématiques sont en fait des appels de fonction, ce qui fait l&#8217;impasse sur les capacités de la JVM en calcul sur primitives. Les améliorations de performances de la 1.8 sont restreintes aux calculs sur entier et sont encore assez fragiles. Vous n&#8217;en profiterez que si vous travaillez sur des entiers sans mélanger les types d&#8217;opérations. Si vous lancer un a = b <u> c </u> d, vous êtes dans la zone verte. Si vous lancez a = b + c &#8211; d, vous êtes dans la zone rouge.</p><p>Pour les prochaines versions de Groovy, Springsource mettra l&#8217;accent sur la stabilisation et la généralisation de ces améliorations. A plus long terme, il est prévu de s&#8217;appuyer sur le InvokeDynamic fourni par le JDK7.</p><p>Les 2 conseils à retenir :</p><ul><li>Pour du calcul mathématique, préférez le Java pur</li><li>Ne faites pas de micro benchmarks, préférez le prototypage d&#8217;application. Il est important de mettre tous les facteurs dans la balance : Confort et rapidité de développment, expérience développeur, statisfaction sur le produit fini.</li></ul><h3><a
name="GORMOptimisations"></a>GORM Optimisations</h3><p><a
href="https://twitter.com/#!/burtbeckwith" title="Burt Beckwith" >Burt Beckwith</a> est venu nous parlé des différentes techniques pour optimiser GORM. Il est également auteur des billets &laquo;&nbsp;<a
href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/" title="GORM Gotchas" >GORM Gotchas</a>&nbsp;&raquo; sur le blog de Springsource, à lire absolument pour éviter certains pièges.</p><p>Parmi les techniques intéressantes je retiens :</p><ul><li>L&#8217;utilisation de classes de domaine avec mapping fin pour pointer sur des vues en base.</li><li>D&#8217;une façon générale, il ne faut pas hésiter à utiliser des classes de domaines contenant en attribut un sous-ensemble des colonnes de la table requêtée. De cette façon, on s&#8217;assure de ne remonter ou de mettre à jour que les données utiles.</li><li>Définir finement ses mappings dans les classes de domaines permet de customiser au mieux le schéma de la base de données.</li></ul><p>De nombreux exemples de cas d&#8217;application ont été passés en revue. Une session très intéressante.</p><h3><a
name="GrailsWebflow"></a>Grails Webflow</h3><p>Pour clore la matinée, Ivo Houbrechts nous a parlé du plugin Grails WebFlow. Il a commencé par une petite démonstration (avec Grails 1.4 SNAPSHOT, derniers commit de la veille au soir). Comme son nom l&#8217;indique, ce plugin intègre Spring WebFlow à Grails. Il permet notamment d&#8217;obtenir sans effort :</p><ul><li>un flow de formulaire, ce qui encourage le découpage en formulaires simples plutôt qu&#8217;un unique formulaire énorme.</li><li>un fil d&#8217;ariane des étapes déjà effectuée, très pratique.</li><li>la gestion de la double soumission en cas d&#8217;utilisation du bouton &#8216;Back&#8217; du navigateur</li></ul><p>Quelques limitations par rapport à Spring WebFlow :</p><ul><li>l&#8217;héritage de flow n&#8217;est pas supporté</li><li>les transisition globales non plus</li></ul><p>La DSL de configuration est simple au départ mais peu vite devenir illisible si vous tentez des flow complexes (surtout si vous passez beaucoup de closures en paramètre). Restez autant que possible dans des cas flow simples pour éviter cela.</p><h3><a
name="GrailsandNeoJ"></a>Grails and Neo4J</h3><p>La dernière session que j&#8217;ai pu suivre a eu pour sujet le plugin Neo4J pour Grails. <a
href="https://twitter.com/#!/darthvader42" title="Stefan Armbruster" >Stefan Armbruster</a> a commencé par nous rappeler les bénéfices du paysage NoSQL parmi les options de stockage de données. Puis nous a expliqué de quelle façon GORM appliquait le mapping des classes de domaines à une base de données orientée graphes.</p><p>Le gros avantage de ce plugin est de s&#8217;intégrer de façon transparente avec GORM, ce qui ne rajoute aucune complexité et permet même de tester les résultats d&#8217;un remplacement de votre base par Neo4J sans effort. Pour les enthousiastes, faites bien attention à la <a
href="http://neo4j.org/licensing-guide/" title="licence de Neo4J" >licence de Neo4J</a> avant de la faire adopter chez vous.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>J&#8217;ai ensuite dû courir à l&#8217;aéroport pour rentrer au pays, en ratant les 2 dernières sessions de la journée. Ces deux journées ont été très riches en enseignement technique mais aussi humain. C&#8217;était pour moi une première immersion dans la communauté Groovy et j&#8217;en suis revenu convaincu par le langage, les librairies, les outils et la communauté. Il me paraît opportun de conclure en citant les &laquo;&nbsp;idées GR8Conf à emporter&nbsp;&raquo; (&laquo;&nbsp;GR8conf takeaway&nbsp;&raquo;), twittées par <a
href="https://twitter.com/#!/mittie" title="Dierk Knig" >Dierk König</a> le dernier jour :</p><ul><li>Groovy est une place d&#8217;innovation</li><li>L&#8217;outillage Groovy est mature et activement maintenu par des équipes compétentes</li><li>Groovy est mainstream, avec un nombre de téléchargement comparable à Spring</li><li>La communauté Groovy est accueillante</li><li>La communauté Groovy a une attitude orientée &laquo;&nbsp;Getting things done&nbsp;&raquo; (prouvée par le Hackgarten)</li></ul><p>Je ne peux que tomber d&#8217;accord. Un grand merci aux courageux qui ont lu jusqu&#8217;à la fin. Groovy rocks ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><ul><li>Dernière minute : les slides de toutes les conférences sont maintenant <a
href="http://www.slideshare.net/gr8conf/slideshows" title="disponibles sur SlideShare" >disponibles sur SlideShare</a>.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/30/rapport-sur-la-conference-groovy-europeenne-la-gr8conf/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Xebia sera à la GR8Conf</title><link>http://blog.xebia.fr/2011/05/13/xebia-sera-a-la-gr8conf/</link> <comments>http://blog.xebia.fr/2011/05/13/xebia-sera-a-la-gr8conf/#comments</comments> <pubDate>Fri, 13 May 2011 09:06:34 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Gaelyk]]></category> <category><![CDATA[GPars]]></category> <category><![CDATA[GR8Conf]]></category> <category><![CDATA[Gradle]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Griffon]]></category> <category><![CDATA[Groovy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7704</guid> <description><![CDATA[Du 17 au 19 mai se tiendra à Copenhague la grand-messe des technologies Groovy en Europe : la GR8Conf. Xebia France y sera pour couvrir l&#8217;évènement. Parmi les sujets abordés : Groovy : à tout seigneur, tout honneur Grails : et notamment son adoption en entreprise Gradle : l&#8217;outil de build qui monte Gaelyk : [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/gr8conf_logo.jpg" alt="gr8conf_logo" title="gr8conf_logo" width="130" style="margin: 1em 1em 1em 1em; float: right;"/></p><p>Du 17 au 19 mai se tiendra à Copenhague la grand-messe des technologies Groovy en Europe : la <a
href="http://www.eu2011.gr8conf.org/">GR8Conf</a>. Xebia France y sera pour couvrir l&#8217;évènement.</p><p>Parmi les sujets abordés :</p><ul><li>Groovy : à tout seigneur, tout honneur</li><li>Grails : et notamment son adoption en entreprise</li><li>Gradle : l&#8217;outil de build qui monte</li><li>Gaelyk : la boite à outil Groovy pour Google AppEngine</li><li>Griffon : le framework inspiré de Grails pour les applications de bureau</li><li>GPars : la librairie Groovy orientée concurrence, Actors, fork-join, etc</li></ul><p>De nombreux speakers seront présents, notamment Guillaume Laforge, Burt Beckwith, Dierk König, et bien d&#8217;autres. Comme toujours dans ces grosses conférences, il faudra choisir entre des sessions en parallèle, mais nous essaierons de vous informer sur les plus intéressantes, pour dresser l&#8217;état de l&#8217;art et le futur des technologies Groovy en 2011.</p><p>Les 3 jours de conférence se découpent en :</p><ul><li>une journée &laquo;&nbsp;University&nbsp;&raquo;, où les participants pourront réviser les bases du Groovy, de Grails et coder comme des fous au <a
href="http://www.eu2011.gr8conf.org/talk/hackergarten" title="HackerGarten" >HackerGarten</a>.</li><li>2 jours de conférence plus &laquo;&nbsp;classique&nbsp;&raquo; avec différents acteurs du monde Groovy</li></ul><p>Vous trouverez le <a
href="http://www.eu2011.gr8conf.org/agenda/list" title="programme complet ici" >programme complet ici</a>.</p><div
style="text-align:center"> <a
href="https://twitter.com/#!/aurelienmaury"><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/twitter4.png" border="0" alt="Suivez moi sur Twitter" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/13/xebia-sera-a-la-gr8conf/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/05/04/revue-de-presse-xebia-209/</link> <comments>http://blog.xebia.fr/2011/05/04/revue-de-presse-xebia-209/#comments</comments> <pubDate>Wed, 04 May 2011 08:00:11 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Ceylon]]></category> <category><![CDATA[closures]]></category> <category><![CDATA[DSL]]></category> <category><![CDATA[Flash Builder]]></category> <category><![CDATA[Flash Catalyst]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[JSon]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7626</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Sortie de la version 1.8 de Groovy RIA Flex 4.5 SDK, Flash Builder 4.5 et Flash Catalyst CS 5.5 enfin disponibles Le coin de la technique Gavin King persiste et signe&#8230; 9 billets sur Ceylon Actualité éditeurs / SSII Sortie [...]]]></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/05/04/revue-de-presse-xebia-209/#SortiedelaversiondeGroovy">Sortie de la version 1.8 de Groovy</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/05/04/revue-de-presse-xebia-209/#FlexSDKFlashBuilderetFlashCata">Flex 4.5 SDK, Flash Builder 4.5 et Flash Catalyst CS 5.5 enfin disponibles</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/05/04/revue-de-presse-xebia-209/#GavinKingpersisteetsignebillet">Gavin King persiste et signe&#8230; 9 billets sur Ceylon</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="SortiedelaversiondeGroovy"></a>Sortie de la version 1.8 de Groovy</h4><p>Guillaume Laforge, le chef de projet de Groovy, vient d&#8217;annoncer sur <a
href="http://glaforge.free.fr/weblog/index.php?itemid=299" title="son blog" >son blog</a> la sortie de la version 1.8 du célèbre langage de scripting pour la JVM.</p><p>Le millésime semble de qualité avec de nombreuses fonctionnalités nouvelles et améliorations – certaines fonctionnalités très populaires ont d&#8217;ailleurs été backportées sur la version 1.7. A noter également que, comme le signale Burt Beckwith <a
href="http://burtbeckwith.com/blog/" title="sur son blog" >sur son blog</a>, Grails 1.4 a été mis à jour pour supporter cette nouvelle version.</p><p>Nous vous proposons ici un bref aperçu des principales nouveautés; les exemples sont tirés ou inspirés des <a
href="http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes" title="notes de version" >notes de version</a>, très complètes. Signalons encore une série d&#8217;articles publiés très récemment par Mr. Haki <a
href="http://mrhaki.blogspot.com/search/label/Groovy%201.8" title="sur son blog" >sur son blog</a> et qui donnent une description encore plus détaillée de certaines nouveautés de Groovy 1.8.</p><h5>Support de JSON</h5><p>De même que pour l&#8217;XML, Groovy supporte désormais nativement le langage <a
href="http://fr.wikipedia.org/wiki/JavaScript_Object_Notation" title="JSON" >JSON</a>. Il est ainsi possible, grâce à la classe <code>JsonSlurper</code>, de parser un contenu JSON, de même qu&#8217;il est possible d&#8217;écrire du code JSON grâce à la classe <code>JsonBuilder</code>:</p><pre class="brush: java; title: ; notranslate">
import groovy.json.*
def json = new JsonBuilder()
json.person {
    name &quot;Guillaume&quot;
    age 33
    pets &quot;Hector&quot;, &quot;Felix&quot;
}
println json.toString()
</pre><p>Ce code produit en effet la sortie JSON suivante:</p><pre class="brush: jscript; title: ; notranslate">
{&quot;person&quot;:{&quot;name&quot;:&quot;Guillaume&quot;,&quot;age&quot;:33,&quot;pets&quot;:[&quot;Hector&quot;,&quot;Felix&quot;]}}
</pre><h5>Processus de compilation et transformations de l&#8217;Arbre Syntaxique Abstrait</h5><p>Tout d&#8217;abord, une nouveauté prometteuse nous est offerte sous la forme des <em>compilation optimizers</em>: ces &laquo;&nbsp;optimiseurs de compilation&nbsp;&raquo; permettent de modifier – de façon globale – le comportement du compilateur Groovy; plus précisement, il est possible d&#8217;agir sur les niveaux suivants:</p><ol><li><code>ImportCustomizer</code>: ajouter des imports &laquo;&nbsp;par défaut&nbsp;&raquo;;</li><li><code>SecureASTCustomizer</code>: filtrage par classe afin d&#8217;autoriser ou de prohiber l&#8217;utilisation de certaines classes, ce qui permet de sécuriser le code à compiler;</li><li><code>ASTTransformationCustomizer</code>: appliquer des transformations AST sur toutes les classes à compiler.</li></ol><p>D&#8217;autre part, de nouvelles transformations de l&#8217;<a
href="http://fr.wikipedia.org/wiki/Arbre_syntaxique_abstrait" title="AST" >AST</a> sont disponbiles. En voici quelques-unes:</p><ul><li>Il est possible d&#8217;injecter un <em>logger</em> dans une classe grâce aux annotations <code>@Log</code> (pour <code>java.util.logging</code>), <code>@Commons</code> (pour <code>commons-logging</code>, <code>@Log4j</code> (pour <code>Log4J</code>) et <code>@Slf4j</code> (pour SLF4J).</li><li>Les annotations <code>@ToString</code> et <code>@EqualsAndHashCode</code> permettent de générer facilement des implémentations de <code>toString()</code>, <code>equals()</code> et <code>hashCode()</code>.</li><li>L&#8217;annotation <code>@AutoClone</code> permet quant à elle de générer une redéfinition de la méthode <code>clone()</code> et de rendre la classe annotée <code>Cloneable</code>. Différentes stratégies d&#8217;implémentation sont possibles: appel de <code>super.clone()</code>, clonage des propriétés de l&#8217;objet, appel d&#8217;un constructeur par copie, ou encore sérialisation (si l&#8217;objet implémente <code>Serializable</code>).</li><li>Les annotations <code>@ThreadInterrupt</code>, <code>@TimedInterrupt</code> et <code>@ConditionalInterrupt</code> permettent respectivement de vérifier qu&#8217;un thread a été interrompu, d&#8217;interrompre un thread au bout d&#8217;un laps de temps et de l&#8217;interrompre sous condition.</li><li>Les annotations <code>@WithReadLock</code> et <code>@WithWriteLock</code> permettent de gérer l&#8217;accès à une ressource partagée avec une granularité plus fine que celle proposée par la transformation <code>@Synchronized</code>, en utilisant un moniteur de type <code>java.util.concurrent.locks.ReentrantReadWriteLock</code>.</li></ul><p>Des descriptions plus détaillées de ces nouvelles transformations sont disponibles <a
href="http://prystash.blogspot.com/2011/04/groovy-18-playing-with-new-canonical.html" title="ici" >ici</a> et <a
href="http://www.jroller.com/melix/entry/upcoming_groovy_goodness_automatic_thread" title="ici" >ici</a>.</p><h5>APIs pour la programmation concurrente</h5><p>Groovy est désormais packagé avec <a
href="http://gpars.codehaus.org/" title="GPars" >GPars</a>, une puissante et flexible librairie – elle-même en Groovy – proposant de nombreuses APIs pour l&#8217;exécution concurrente, asynchrone et/ou distribuée de tâches écrites en Java ou en Groovy. Tous les patterns les plus connus, du <a
href="http://download.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html" title="Fork/Join" >Fork/Join</a> au <a
href="http://fr.wikipedia.org/wiki/MapReduce" title="Map/Reduce" >Map/Reduce</a> en passant par les <a
href="http://fr.wikipedia.org/wiki/Agents" title="Agents" >Agents</a> et <a
href="http://en.wikipedia.org/wiki/Actor_model" title="Actors" >Actors</a>, sont désormais à la disposition du développeur Groovy.</p><h5>Ecriture de langages dédiés</h5><p>L&#8217;écriture de <a
href="http://fr.wikipedia.org/wiki/Domain-specific_programming_language" title="langages ddis" >langages dédiés</a> ou DSLs (<em>Domain Specific Languages</em>) avec Groovy gagnera en lisibilité grâce à la possibilité de supprimer les parenthèses et les points lors d&#8217;un chaînage d&#8217;appels de méthodes. Il devient possible d&#8217;écrire dans un style fluide très proche du langage naturel; l&#8217;exemple suivant est particulièrement frappant:</p><pre class="brush: java; title: ; notranslate">
show = { println it }
square_root = { Math.sqrt(it) }
def please(action) {
  [the: { what -&gt;
    [of: { n -&gt; action(what(n)) }]
  }]
}
//version allégée
please show the square_root of 100
//version classique
please(show).the(square_root).of(100)
</pre><p>Dans <a
href="http://www.springone2gx.com/blog/guillaume_laforge/2010/08/nicer_dsls_in_groovy_1_8_thanks_to_extended_command_expressions" title="un autre post" >un autre post</a>, Guillaume Laforge s&#8217;offre même le luxe de concocter une recette de cuisine plutôt lisible:</p><pre class="brush: java; title: ; notranslate">
Recipe.instructions {
   take medium_bowl
   combine soy_sauce, vinegar, chili_powder, garlic
   place chicken into sauce
   turn once to coat
   marinate 30.minutes at room_temperature
}
</pre><h5>Closures</h5><p>Rien de révolutionnaire, mais quelques améliorations notables:</p><ul><li>Il est désormais possible de spécifier des closures comme arguments d&#8217;annotations. Ceci ouvre des perpectives intéressantes notamment dans le cadre d&#8217;une programmation par contrat, qui pourrait tirer parti de cette nouvelle fonctionnalité pour spécifier sous forme d&#8217;annotations des invariants de classe, des pré et post-conditions, etc. Ce genre d&#8217;artifice ressemblerait à ceci:</li></ul><pre class="brush: java; title: ; notranslate">
//invariant
@Retention(RetentionPolicy.RUNTIME)
@interface Invariant {
    Class value() // stocke la closure
}
//utilisation de l'invariant
@Invariant({ number &gt;= 0 })
class Distance {
    float number
    String unit
}
</pre><p>L&#8217;annotation <code>@Invariant</code>, définie par l&#8217;utilisateur, utilise une closure pour spécifier de façon élégante et concise un invariant de classe.</p><p>Lorsqu&#8217;il s&#8217;agit de vérifier l&#8217;invariant, cependant, on peut regretter que le code ne soit pas tout aussi trivial, en raison –&nbsp;apparemment&nbsp;– de problèmes de compatibilité:</p><pre class="brush: java; title: ; notranslate">
def d = new Distance(number: 10, unit: &quot;meters&quot;)
def anno = Distance.getAnnotation(Invariant)
def check = anno.value().newInstance(d, d)
assert check(d)
</pre><ul><li>Les nouveaux opérateurs <code>>></code> et <code><<</code> permettent d'alléger l'écriture des closures composées:</li></ul><pre class="brush: java; title: ; notranslate">
def plus2  = { it + 2 }
def fois3 = { it &lt;strong&gt; 3 }
//version longue
fois3plus2 = { x -&gt; plus2(fois3(x)) }
//version courte
fois3plus2 = plus2 &lt;&lt; fois3
</pre><ul><li>L'utilisation du <a
href="http://en.wikipedia.org/wiki/Tail_call#Through_trampolining" title="<em>trampolining</em>" ><em>trampolining</em></a> permet d'éviter les dépassements de pile (<em>stack overflows</em>) en transformant la <a
href="http://fr.wikipedia.org/wiki/R%C3%A9cursion_terminale" title="rcursion terminale" >récursion terminale</a> de certains algorithmes en code itératif. Alors que le code suivant produit un dépassement de pile à l'exécution:</li></ul><pre class="brush: java; title: ; notranslate">
​def factorial
factorial = { int n, BigInteger accu = 1G -&gt;
    if (n &lt; 2) return accu
    factorial(n - 1, n &lt;/strong&gt; accu)
}
println factorial(1000) ​//java.lang.StackOverflowError
​</pre><p>La version "en trampoline" du même algorithme s'exécute sans problème:</p><pre class="brush: java; title: ; notranslate">
def factorial
factorial = { int n, BigInteger accu = 1G -&gt;
    if (n &lt; 2) return accu
    factorial.trampoline(n - 1, n * accu)
}
factorial = factorial.trampoline()
println factorial(1000)
</pre><p>Grâce à l'appel de la méthode <code>trampoline()</code> qui enveloppe les appels récursifs dans des <em>wrappers</em> de type <code>TrampolineClosure</code>, tant que le "trampoline" appelant reçoit en retour des instances de <code>TrampolineClosure</code>, il continue d'invoquer itérativement la fonction sous-jacente, ne s'arrêtant que lorsque l'objet de retour n'est plus un trampoline. La pile d'appels ne grossit donc pas de façon incontrôlée.</p><ul><li>Le support de la <a
href="http://fr.wikipedia.org/wiki/M%C3%A9moization" title="mmoization" >mémoization</a> permet désormais aux closures effectuant de lourds calculs de mettre en cache le résultat des appels en fonction des arguments en entrée.</li></ul><ul><li>La <a
href="http://fr.wikipedia.org/wiki/Curryfication" title="curryfication" >curryfication</a> est désormais possible aussi en partant de la droite, voire même en désignant de façon arbitraire un argument par sa position dans la liste d'arguments.</li></ul><h5>Autres sucres syntaxiques</h5><ul><li>Support du <a
href="http://download.oracle.com/javase/tutorial/java/generics/gentypes.html#diamond" title="diamond operator" ><em>diamond operator</em></a> de Java 7:</li></ul><pre class="brush: java; title: ; notranslate">
List&lt;List&lt;String&gt;&gt; list1 = new ArrayList&lt;&gt;()
</pre><ul><li>Nouvelles méthodes DGM (<em>Default Groovy Methods</em>), toujours pratiques, par exemple <code>countBy</code> qui, dans l'exemple suivant, compte le nombre d'occurrences de nombres pairs et impairs dans une liste d'entiers:</li></ul><pre class="brush: java; title: ; notranslate">
assert [0:2, 1:3] == [1,2,3,4,5].countBy{ it % 2 }
</pre><ul><li>Les <a
href="http://groovy.codehaus.org/Strings+and+GString" title="slashy strings" ><em>slashy strings</em></a> sont désormais multilignes:</li></ul><pre class="brush: java; title: ; notranslate">
def poem = /
to be
or
not to be
/
</pre><ul><li>Une nouvelle variante des <em>slashy strings</em> appelée <em>dollar slashy string</em> permet de définir une GString multiligne dans laquelle il n'est pas nécessaire d'échapper le <em>backslash</em>; pratique pour noter du XML ou bien des chemins de fichiers Windows:</li></ul><pre class="brush: java; title: ; notranslate">
def dir = $/C:temp/$
</pre><h5>Performances</h5><p>Enfin, il faut noter que la version 1.8 de Groovy inaugure des chantiers sur les performances du langage. Avec deux améliorations profitables :</p><ul><li>Sur les opérations basiques sur les entiers (additions, soustractions, multiplications, divisions, incréments, décréments et comparaisons). Il faut cependant se rappeler que les optimisations de cette version ne s'appliquent que sur des opérations d'un type unique. Si vous mixez, par exemple, additions et soustractions dans une même ligne de code, vous n'en profiterez pas.</li></ul><ul><li>Sur les appels de méthodes directs. Si un appel de méthode est lancé sur <code>this</code> et que le prototype correspond à une méthode présente (aux types près), Groovy passera outre ses mécanismes de réfléxion standard. Là aussi, faites bien attention aux <a
href="http://groovy.codehaus.org/Groovy+1.8+release+notes#Groovy1.8releasenotes-Performanceimprovements" title="restrictions" >restrictions</a> pour en tirer parti.</li></ul><p>Cela peut paraître maigre mais ce n'est que le début de plus gros chantiers de performances qui auront lieu au cours de la vie de la branche 1.8. Peut-être la fin de la politique "fast enough" de Groovy ?</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="FlexSDKFlashBuilderetFlashCata"></a>Flex 4.5 SDK, Flash Builder 4.5 et Flash Catalyst CS 5.5 enfin disponibles</h4><p><a
href="http://blogs.adobe.com/flex/2011/05/flex-4-5-sdk-flash-builder-4-5-and-flash-catalyst-cs-5-5-now-available.html" title="Bonne nouvelle pour la communauté Flex" >Bonne nouvelle pour la communauté Flex</a>: aujourd'hui, sort officiellement <a
href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+4.5" title="Flex 4.5 SDK" >Flex 4.5 SDK</a> , <a
href="http://www.adobe.com/products/flash-builder.html" title="Flash Builder 4.5" >Flash Builder 4.5</a> et <a
href="http://www.adobe.com/products/flashcatalyst.html" title="Flash Catalyst CS 5.5" >Flash Catalyst CS 5.5</a>. Après quelques mois en <a
href="http://www.flex-tutorial.fr/2011/03/11/participez-a-la-pre-release-flex-sdk-et-flash-builder-4-5/" title="prrelease disponible en tlchargement priv" >pré-release, disponible en téléchargement privé</a>,  la team Flex a profité des retours des utilisateurs qui ont testé les produits. Plus axées sur le développement mobile, ces nouvelles versions permettent de développer des applications riches autant pour le web que pour le desktop ou pour d'autres supports comme les mobiles et les tablettes.</p><p>Dans cette nouvelle version de Flash Builder, seul le déploiement sur Android est prévu. Mais une nouvelle version disponible en juin vous permettra de déployer vos applications sur iOS et Blackberry Tablet OS.  Parmi les autres nouveautés : un Flash Builder permettant de développer plus rapidement et un workflow amélioré entre Flash Builder et Flash Catalyst : vous pourrez maintenant passer du premier au second sans difficulté pour retravailler le design.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="GavinKingpersisteetsignebillet"></a>Gavin King persiste et signe... 9 billets sur Ceylon</h4><p>Il y a à peine deux semaines on évoquait <a
href="http://blog.xebia.fr/2011/04/19/revue-de-presse-xebia-207/#RedHatprpareCeylonunnouveaulan" title="icimme" >ici-même</a> la présentation qu'avait faite Gavin King du nouveau langage Ceylon, et de l'accueil plutôt mitigé que la communauté lui avait réservé.</p><p>Sans doute piqué au vif, Gavin King a publié cette semaine une <a
href="http://in.relation.to/tag/Introduction+to+Ceylon" title="srie de neuf articles" >série de neuf articles</a> (d'autres sont peut-être encore à venir) où il présente le langage avec beaucoup plus de détails et de finesse.</p><p>A travers notamment les commentaires des lecteurs, on remarque au fil des billets un certain regain d'intérêt pour ce langage, au fur et à mesure que les contours s'en précisent et que certaines questions trouvent leur réponse. Malgré tout, le langage semble encore souffrir d'un caractère quelque peu confidentiel, et les échanges tournent parfois au débat d'experts. Il faut également noter que la volonté affichée de réécrire un SDK complet pour Ceylon semble laisser certains observateurs sceptiques.</p><p>Sans revenir sur les caractéristiques du langage lui-même – nous laissons à nos lecteurs le soin de parcourir ces billets – nous avons concocté un résumé des échanges entre Gavin et ses lecteurs sous la forme de questions-réponses:</p><h5>Qui travaille dans le projet Ceylon?</h5><p>S'il admet être le seul à y travailler à temps complet, Gavin révèle tout de même que l'équipe Ceylon compte parmi ses membres quelques blogueurs de <a
href="http://in.relation.to" title="In Relation To" >In Relation To</a>, parmi lesquels Emmanuel Bernard, Aleš Justin, Jason Greene, Max Handersen et Pete Muir – nous sommes donc bien dans la mouvance Hibernate - Red Hat - JBoss. Toujours d'après Gavin, certains membres de l'équipe OpenJDK (Andrew Haley et Gary Benson) y travailleraient aussi, et enfin, quelques personnes de chez Red Hat (Andrew Dinn, David LLoyd et surtout Mark Little).</p><h5>Quel est l'état d'avancement du projet?</h5><p>Gavin admet que l'écriture du parseur ANTLR ne fut pas une partie de plaisir et lui a demandé des mois de travail; cependant, le parsing et la génération de l'AST sont d'après lui terminés et il travaille désormais sur le compilateur: le <em>typechecker</em> est en bon état d'avancement, mais la génération du bytecode aurait pris du retard.</p><h5>Quel degré d’interopérabilité avec Java?</h5><p>Il y aura une certaine interopérabilité, mais celle-ci sera mise à mal en raison de l'inexistence de <em>wildcard types</em> et de surcharge de méthodes en Ceylon. Concernant la surcharge, Gavin envisage d'utiliser le principe des GADT (<a
href="http://en.wikipedia.org/wiki/Generalized_algebraic_data_type" title="Generalized Algebraic Data Types" ><em>Generalized Algebraic Data Types</em></a>), inspirés d'Haskell, pour "unifier" les surcharges de méthodes.</p><p>Mais plutôt que parler de portage de frameworks Java en Ceylon, Gavin préfère tabler sur l'apparition spontanée de nouveaux frameworks en Ceylon qui viendraient remplacer les frameworks Java à la mode. L'ambition de Ceylon à cet égard semble en effet un point marquant du nouveau langage. Gavin est formel: "nous avons comme but explicite de créer un nouveau SDK (et par là nous entendons vraiment une série de modules que nous allons écrire nous-mêmes)".</p><p>Et Gavin de lister les modules sur lesquels il souhaite se concentrer dans l'immédiat:</p><ul><li><code>ceylon.language</code> - types de base pour le support des fonctionnalités inhérentes au langage</li><li><code>ceylon.module</code> - le runtime assurant la modularité (basé sur JBoss Modules)</li><li><code>ceylon.collection</code> - le framework de collections (l'implémentation sous-jacente serait fournie par le framework Java équivalent)</li><li><code>ceylon.datetime</code> - support des dates et heures (probablement basé sur la JSR-310)</li><li><code>ceylon.security</code> - API sécurité</li><li><code>ceylon.io</code> - Utilitaires d'entrée-sortie (implémentés en utilisant java.io)</li><li><code>ceylon.concurrent</code> - API pour la programmation concurrente "de bas niveau" (basée sur JSR-166)</li><li><code>ceylon.http</code> - client et serveur HTTP (peut-être fondé sur Netty)</li><li><code>ceylon.html</code> - le "Kit de construction" HTML</li></ul><p>Par ailleurs, Gavin précise que le compilateur Ceylon est conçu pour s'intégrer avec OpenJDK et pour pouvoir compiler simultanément du code Java et du code Ceylon. Cependant la version initiale (alpha) du compilateur ne contiendra que les modules du langage lui-même.</p><h5>La modularité</h5><p>Gavin confirme que la notion de module – une sorte de "super package" avec ses propres portées de visibilité – sera bâtie au sein du langage. Mais il ne s'arrête pas là: il envisage également une entité plus large encore que le module, qu'il baptise <em>assembly</em>. Ceci porte à trois le nombre de niveaux de modularité:</p><ol><li>package</li><li>module, matérialisé notamment par une archive dans un format précis, éventuellement déployable sur un dépôt de modules</li><li>assembly: agrégation de différents modules</li></ol><p>Le compilateur ne produirait d'ailleurs pas de fichiers ".class", mais plutôt des archives déployables sur un dépôt local ou distant. De même, il saurait retrouver des dépendances requises depuis ces dépôts.</p><p>Quant au runtime, il s'agirait bien de JBoss Modules. Celui-ci saurait gérer les archives et les problématiques de <em>class loading</em> et aussi rechercher et exécuter les modules définis dans sa configuration.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/04/revue-de-presse-xebia-209/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Grails Tips : la validation sur mesure</title><link>http://blog.xebia.fr/2011/04/28/grails-tips-la-validation-sur-mesure/</link> <comments>http://blog.xebia.fr/2011/04/28/grails-tips-la-validation-sur-mesure/#comments</comments> <pubDate>Thu, 28 Apr 2011 08:01:36 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7568</guid> <description><![CDATA[Le mécanisme de validation de Grails est basé sur l&#8217;API Spring Validator. Il existe dans Grails un ensemble de validateurs permettant de couvrir la plupart des besoins simples, tels que champs obligatoires, taille mini/maxi, valeurs min/max pour les nombres, etc. Cependant, il arrive souvent d&#8217;avoir besoin de validateurs sur mesure, plus adaptés au métier de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/02/Grails_Logo_180x176.png" width="100" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Le mécanisme de validation de Grails est basé sur l&#8217;API Spring Validator. Il existe dans Grails un ensemble de validateurs permettant de couvrir la plupart des besoins simples, tels que champs obligatoires, taille mini/maxi, valeurs min/max pour les nombres, etc. Cependant, il arrive souvent d&#8217;avoir besoin de validateurs sur mesure, plus adaptés au métier de l&#8217;application. Aujourd&#8217;hui nous allons voir les différentes méthodes de validation avancées des classes du domaine qui s&#8217;offrent aux utilisateurs de ce framework web magique :</p><ul><li>Retour sur la contrainte <code>validator</code></li><li>Faire une contrainte réutilisable</li><li>Le plugin <em>Constraints</em></li></ul><p>Suivez le guide&#8230;</p><h3><a
name="Validationsurmesure"></a>Validation sur mesure</h3><p>Il existe 16 contraintes applicables sur les attributs des classes de domaine dans une application Grails. Ces contraintes permettent de s&#8217;assurer de la validité du contenu de nos entités avant de les envoyer en base. Elles vont de la vérification de la nullité, de la taille d&#8217;une chaîne, à la correspondance à une expression régulière, et j&#8217;en passe.</p><p>Mais parfois, il est indispensable de valider nos attributs en fonction de critères plus fins, ou liés à des logiques métiers complexes. C&#8217;est alors que la 17ème contrainte livrée avec Grails peut servir : <code>validator</code>.</p><p>Grâce à cette contrainte, on peut glisser une closure qui sera exécutée lors de la validation de l&#8217;entité. Voici la <a
href="http://grails.org/doc/1.3.7/ref/Constraints/validator.html" title="page de la documentation officielle" >page de la documentation officielle</a> qui détaille son utilisation. Pour ceux qui n&#8217;ont pas le temps d&#8217;aller lire la documentation voilà un exemple assez parlant :</p><pre class="brush: java; title: ; notranslate">
class User {
  String login
  String autreChamp
  static constraints = {
    login(validator: { val, obj -&gt;
      return (val.length != 0 &amp;&amp; obj.properties['autreChamp'] != 'magicString')
    })
  }
}
</pre><p>Dans cet exemple, si la contrainte n&#8217;est pas respectée, alors le message d&#8217;erreur associé sera, par convention : <code>user.login.validator.invalid</code>.</p><p>Ce mécanisme est très pratique et flexible, mais oblige à dupliquer du code si on souhaite utiliser la même contrainte complexe sur plusieurs classes de domaine. Poussons plus loin l&#8217;investigation.</p><h3><a
name="Fairemieuxlamain"></a>Faire mieux, à la main</h3><p>Il est possible d&#8217;écrire ses propres classes de contrainte et de les réutiliser plusieurs fois. <a
href="http://blog.swwomm.com/2011/02/custom-grails-constraints.html" title="Cet article" >Cet article</a> décrit très bien la méthode à suivre. Je vais vous en tracer les grandes lignes ici, en français dans le texte.</p><p>Pour écrire un validateur réutilisable, il suffit d&#8217;étendre la classe <code>AbstractConstraint</code> et d&#8217;implémenter la méthode <code>processValidate</code>. En voici un exemple :</p><pre class="brush: java; title: ; notranslate">
package myapp
import org.codehaus.groovy.grails.validation.AbstractConstraint
import org.springframework.validation.Errors
class LowerCaseConstraint extends AbstractConstraint {
// nom à utiliser dans les classes de domaine
    static NAME = 'lowerCase'
    String getName() {
        NAME
    }
// si le validateur ne s'applique qu'à certaines classes, cette méthode permet de filtrer l'application de la contrainte
    boolean supports(Class type) {
        true
    }
// code de la logique de validation
    protected void processValidate(Object target, Object value, Errors errors) {
        if (constraintParameter &amp;&amp; value =~ /[A-Z]/)
            rejectValue target, errors, &quot;default.invalid.${name}.message&quot;, &quot;${name}.invalid&quot;,
                [constraintPropertyName, constraintOwningClass, value] as Object[]
    }
}
</pre><p>La place idéale dans votre arborescence projet pour cette classe se trouve dans le répertoire <code>src/groovy</code>. Une fois votre classe de contrainte terminée, il faut l&#8217;enregistrer auprès du framework pour que Grails sache où la retrouver. Pour ce faire, ajoutez cette ligne dans votre fichier <code>grails-app/conf/Config.groovy</code> :</p><pre class="brush: java; title: ; notranslate">
org.codehaus.groovy.grails.validation.ConstrainedProperty.registerNewConstraint myapp.LowerCaseConstraint.NAME, myapp.LowerCaseConstraint.class
</pre><p>Il ne reste plus qu&#8217;à vous en servir dans vos classes de domaine :</p><pre class="brush: java; title: ; notranslate">
static constraints = {
    myProperty size: 1..20, lowerCase: true
}
</pre><h3><a
name="LepluginexistedjConstraintsPlu"></a>Le plugin existe déjà : Constraints Plugin</h3><p>Mais comme souvent quand on parle de Grails : il y a un plugin pour ça ! Le <a
href="ttp://grails.org/plugin/constraints" title="plugin Constraints" >plugin <em>Constraints</em></a> fourni des scripts pour générer des classes de contraintes réutilisables. En deux lignes de commandes, le tour est joué, installation et création de contrainte :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin constraints
grails create-constraint my.package.ContrainteSurMesure
</pre><p>Dans la classe générée, il ne vous restera plus qu&#8217;à coder une closure de validation, comme on l&#8217;aurait fait dans la première solution. Un grand merci à Geoff Lane qui s&#8217;est donné la peine de coder ce plugin. Il est possible de configurer certains comportements de ce plugin, mais je vous laisse consulter <a
href="https://github.com/geofflane/grails-constraints" title="la documentation" >la documentation</a> pour découvrir dans quelle mesure.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>L&#8217;usage du plugin Constraint est très simple et permet beaucoup de choses. N&#8217;hésitez pas à vous en servir. Je vous encourage également à exploiter au maximum la formidable extensibilité de Grails. Pourquoi ne pas coder vos validateurs dans un nouveau plugin qui s&#8217;appuiera sur le plugin <em>Constraints</em> ? Ainsi vous disposerez  d&#8217;un paquetage de validateur sur mesure, à installer en claquant des doigts dans tout nouveau projet Grails démarrant chez vous.</p><p>What else ? <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/28/grails-tips-la-validation-sur-mesure/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Grails Tips : externaliser la configuration</title><link>http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/</link> <comments>http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/#comments</comments> <pubDate>Thu, 10 Feb 2011 08:50:48 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6825</guid> <description><![CDATA[Grails, c&#8217;est bien. Ça permet des développements rapides, simples et efficaces. Mais à moins de faire du jetable pour tester, un jour, il faut livrer. Se pose alors, souvent tard, la question de la configuration de l&#8217;application au runtime. Nous allons voir ensemble quelques solutions pour externaliser proprement les clés de configuration pour un projet [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/02/Grails_Logo_180x176.png" width="100" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Grails, c&#8217;est bien. Ça permet des développements rapides, simples et efficaces. Mais à moins de faire du jetable pour tester, un jour, il faut livrer. Se pose alors, souvent tard, la question de la configuration de l&#8217;application au runtime.</p><p>Nous allons voir ensemble quelques solutions pour externaliser proprement les clés de configuration pour un projet basé sur Grails.</p><h3><a
name="Outofthebox"></a>Out of the box</h3><p>Grails, par défaut, nous offre la possibilité de charger des fichiers de configuration externe de façon assez simple. Le chargement s&#8217;effectue suivant une logique simple :</p><ul><li>Tout ce qui se trouve dans le fichier <em>Config.groovy</em> vient en premier</li><li>Toutes les clés présentes dans les fichiers externes viennent s&#8217;ajouter à la configuration, ou surcharger les valeurs de <em>Config.groovy</em>.</li></ul><p>Ce mécanisme est <a
href="http://grails.org/doc/latest/guide/3.%20Configuration.html#3.4%20Externalized%20Configuration" title="document" >documenté</a> et très simple à mettre en œuvre. Il suffit de placer les quelques lignes suivantes au début du fichier <em>grails-app/conf/Config.groovy</em> :</p><pre class="brush: java; title: ; notranslate">
grails.config.locations = [ &quot;classpath:${appName}-config.properties&quot;,
                            &quot;classpath:${appName}-config.groovy&quot;,
                            &quot;file:${userHome}/.grails/${appName}-config.properties&quot;,
                            &quot;file:${userHome}/.grails/${appName}-config.groovy&quot; ]
</pre><p>Comme on peut le voir dans cet exemple tiré de la documentation, on peut même utiliser des variables dans les chemins spécifiés. Plutôt simple, n&#8217;est-il pas ? Le problème est réglé ? Ça conviendra très bien à la plupart des petits projets montés en local, cependant, l&#8217;utilisation de chemins en dur (ou modulo certaines variables) directement dans le <em>Config.groovy</em> est un peu rigide. Il est souvent problématique de livrer un war à un exploitant en lui expliquant que le fichier de configuration doit se placer à tel chemin et pas un autre.</p><p>Voyons si on peut trouver mieux&#8230;</p><h3><a
name="Parvariabledenvironnementoupro"></a>Par variable d&#8217;environnement ou propriété JVM</h3><p>L&#8217;idéal serait de pouvoir définir le chemin vers le fichier de configuration depuis l&#8217;extérieur du war. Pour faire cela, on peut se baser sur des variables d&#8217;environnement. Le fichier <em>Config.groovy</em> est, avant toute chose, un script Groovy ! Par conséquent, aucun problème pour inclure un peu de code dedans et récupérer des valeurs depuis le système.</p><p>On pourrait par exemple remplacer l&#8217;exemple du précédent paragraphe par :</p><pre class="brush: java; title: ; notranslate">
// On fixe le nom de la variable d'environnement qui nous intéresse
def ENV_NAME = &quot;APPNAME_CONFIG&quot;
// Si la liste grails.config.location n'existe pas, on l'instancie
if(!grails.config.locations || !(grails.config.locations instanceof List)) {
    grails.config.locations = []
}
// Si la variable est présente dans l'environnement ...
if(System.getenv(ENV_NAME)) {
  // ... on inclut sa valeur dans les configuration à charger
  println &quot;Including configuration file specified in environment: &quot; + System.getenv(ENV_NAME);
  grails.config.locations &lt;&lt; &quot;file:&quot; + System.getenv(ENV_NAME)
} else if (System.getProperty(ENV_NAME)) {
  // Sinon on regarde dans les propriétés JVM et on l'inclut si elle est présente
  println &quot;Including configuration file specified on command line: &quot; + System.getProperty(ENV_NAME);
  grails.config.locations &lt;&lt; &quot;file:&quot; + System.getProperty(ENV_NAME)
} else {
  // Si vraiment on ne trouve rien, on le dit quand même, parce que ça se fait.
  println &quot;No external configuration file defined.&quot;
}
</pre><p><em>Extrait de</em> <em><a
href="http://phatness.com/2010/03/how-to-externalize-your-grails-configuration/" title="cet article" >cet article</a></em> <em>et commenté maison</em></p><p>Si vos administrateurs sont complaisants, cette méthode peut être votre solution. Mais beaucoup rechigneront à toucher à leur environnement système pour faire plaisir à votre code chéri (du moins c&#8217;était le cas parmi ceux que j&#8217;ai rencontrés). Cela risque également de poser des problèmes dans le cas où l&#8217;on souhaite faire tourner plusieurs instances de notre application sur le même serveur avec des configurations différentes. Dans ce cas, la grimace de l&#8217;administrateur devant son environnement système se remplissant de toute une famille de variables vaut le coup d&#8217;œil.</p><p>Poussons donc un peu plus loin&#8230;</p><h3><a
name="ParentreJNDI"></a>Par entrée JNDI</h3><p>Plutôt que de toucher à l&#8217;environnement du système, nous pouvons nous contenter de toucher à l&#8217;environnement d&#8217;exécution de notre application. JNDI arrive à la rescousse. En s&#8217;appuyant non pas sur des variables système mais sur des variables JNDI, on cantonne nos modifications au serveur d&#8217;applications. Le lien entre l&#8217;instance et son fichier de configuration est plus étroit et donc plus évident à manipuler.</p><p>Modifions une dernière fois notre en-tête de chargement de configuration (toujours dans <em>Config.groovy</em>) :</p><pre class="brush: java; title: ; notranslate">
import javax.naming.InitialContext
// Si la liste grails.config.location n'existe pas, on l'instancie
if(!grails.config.locations || !(grails.config.locations instanceof List)) {
    grails.config.locations = []
}
try {
  // On tente de récupérer la variable d'environnement JNDI
  String extConfFile = (String) new InitialContext().lookup(&quot;java:comp/env/myAppInstanceConfig&quot;)
  // Si on trouve notre valeur, on l'ajoute aux fichiers à charger
  if (extConfFile) {
    grails.config.locations &lt;&lt; extConfFile
    println &quot;External configuration file loaded : ${extConfFile}&quot;
  }
} catch (Exception e) {
  // En cas d'absence de la variable, on log
  println &quot;Unable to load external configuration, using default.&quot;
}
</pre><p>Il suffira pour appliquer une configuration particulière, de définir la variable JNDI pour notre déploiement. Si on prend un serveur d&#8217;applications au hasard, Tomcat par exemple (oui, le hasard fait bien les choses), cela donnerait un fichier de contexte ressemblant à ceci:</p><pre class="brush: java; title: ; notranslate">
&lt;Context path=&quot;/myAppInstance1&quot; debug=&quot;0&quot; docBase=&quot;/the/full/path/to/myApp.war&quot;&gt;
  &lt;Environment name=&quot;myAppInstanceConfig&quot; type=&quot;java.lang.String&quot; override=&quot;false&quot;
               value=&quot;file:/the/full/path/to/myApp-instance1-config.properties&quot;/&gt;
&lt;/Context&gt;
</pre><h3><a
name="Conclusions"></a>Conclusions</h3><p>Même si toutes ces méthodes sont valides, j&#8217;avoue ma préférence pour la dernière. Elle présente à mon sens de multiples avantages:</p><ul><li>pas d&#8217;impact sur le système</li><li>possibilité de multiplier les instances avec des configurations différentes</li><li>lien fort entre l&#8217;instance d&#8217;application et le chemin vers son fichier de configuration</li></ul><p>Ce qu&#8217;il faut retenir de ces propositions, c&#8217;est surtout que <em>Config.groovy</em> est avant tout un script. Il est donc très facile d&#8217;ajouter sa propre logique de récupération des fichiers de configuration à charger. On pourrait en imaginer d&#8217;autres, comme d&#8217;aller parser un fichier centralisé sur le système ou de se connecter à une base de données pour récupérer des clés de configuration.</p><p>Le système de configuration incrémentale sur lequel est basé Grails et la configuration par scripting, permettent une très grande flexibilité, ou comme dirait les Perlistes: <a
href="http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it" title="Tim Toady!" >Tim Toady!</a>.</p><h4><a
name="Ressources"></a>Ressources</h4><ul><li><a
href="http://grails.org/doc/latest/guide/3.%20Configuration.html#3.4%20Externalized%20Configuration" title="Documentation Grails section configuration externe" >Documentation Grails, section configuration externe</a></li><li><a
href="http://groovy.codehaus.org/ConfigSlurper" title="ConfigSlurper laggrgateur de configuration" >ConfigSlurper, l&#8217;aggrégateur de configuration</a></li><li><a
href="http://java.sun.com/developer/technicalArticles/Programming/jndi/index.html" title="Developing JNDIbased Application" >Developing JNDI-based Application</a>, notamment la section <strong>Declaring Environment Variables</strong></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/02/10/grails-tips-externaliser-la-configuration/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/01/11/revue-de-presse-xebia-193/</link> <comments>http://blog.xebia.fr/2011/01/11/revue-de-presse-xebia-193/#comments</comments> <pubDate>Tue, 11 Jan 2011 11:51:13 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Amazon]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Gradle]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Jackson]]></category> <category><![CDATA[JRuby]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6610</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Amazon Appstore Jackson 1.7 Le coin de la technique Ecosystème Groovy/Grails Version majeure de JRuby : 1.6 en release candidate Actualité éditeurs / SSII Amazon Appstore Amazon a annoncé le lancement du portail Appstore Developper &#8211; https://developer.amazon.com/ &#8211; qui ouvre [...]]]></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/01/11/revue-de-presse-xebia-193/#AmazonAppstore">Amazon Appstore</a></li><li><a
href="http://blog.xebia.fr/2011/01/11/revue-de-presse-xebia-193/#Jackson">Jackson 1.7</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/01/11/revue-de-presse-xebia-193/#EcosystmeGroovyGrails">Ecosystème Groovy/Grails</a></li><li><a
href="http://blog.xebia.fr/2011/01/11/revue-de-presse-xebia-193/#VersionmajeuredeJRubyenrelease">Version majeure de JRuby : 1.6 en release candidate</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="AmazonAppstore"></a>Amazon Appstore</h4><p>Amazon a annoncé le lancement du portail Appstore Developper  &#8211; <a
href="https://developer.amazon.com/" title="httpsdeveloperamazoncom" >https://developer.amazon.com/</a> &#8211; qui ouvre la voie au prochain Appstore pour Android (à terme d&#8217;autres plateformes seront peut-être aussi supportées). Amazon se lance pour avoir sa part du gâteau dans le marché des applications mobiles. Contrairement à Google, qui laisse la liberté de soumettre n&#8217;importe quelle application et de la vendre, Amazon vérifiera si le contenu est approprié et validera selon des standards de qualité minimale. Ce modèle se rapproche de celui d&#8217;Apple pour l&#8217;AppStore, par exemple le contenu très explicite pour adultes seront interdits.</p><p>Ce processus de validation affectera le délai de mise en vente, mais Amazon promet de ne pas dépasser une semaine pour le délai d&#8217;approbation des applications. D&#8217;après Amazon, l&#8217;objectif principal du filtre est d&#8217;améliorer la qualité des applications qu&#8217;on peut acheter sur le portail en offrant un minimum de garanties aux utilisateurs.</p><p>La différence majeure par rapport à ses concurrents, Google et Apple,  est le système de prix qui sera similaire à celui des livres et restera sous le contrôle d&#8217;Amazon. Les développeurs pourront choisir le prix de départ de l&#8217;application dans une liste, mais celui-ci variera dans le temps, pour s&#8217;adapter au marché et afin de rentabiliser au maximum ses ventes et bénéfices. L&#8217;un des aspects le plus attractif pour le développeur est la façon dont Amazon propose aux utilisateurs des produits auxquels ils pourront être intéressés grâce à leur système de suivi.</p><p>Concernant les prix du service, la première année est gratuite pour le développeur et passe ensuite à 99 dollars / an. L&#8217;Appstore Amazon ouvrira d&#8217;abord aux Etats-Unis, et même si aucune date d&#8217;ouverture n&#8217;a été annoncée, tous les yeux sont rivés vers cet été 2011.</p><h4><a
name="Jackson"></a>Jackson 1.7</h4><p>Quelques mois après la sortie de la <a
href="http://blog.xebia.fr/2010/09/14/revue-de-presse-xebia-176/#Jackson" title="version 1.6" >version 1.6</a>, cette nouvelle mouture apporte quelques petites <a
href="http://blog.xebia.fr/2010/09/14/revue-de-presse-xebia-176/#Jackson" title="évolutions techniques" >évolutions techniques</a> et elle est totalement compatible avec la version précédente. La grande nouveauté vient de l’<a
href="http://wiki.fasterxml.com/JacksonFeatureModules" title="abstraction des modules" >abstraction des modules</a> qui facilite l’ajout de serializers/deserializers. Pour cela il suffira d’étendre la classe abstraite <code>Module</code>:</p><pre class="brush: java; title: ; notranslate">
public abstract class Module
{
    public abstract String getModuleName();
    public abstract Version version();
    public abstract void setupModule(SetupContext context);
}
</pre><p>Outre la personalisation des serializers/deserializers, le module pourra modifier ou ajouter ses propres annotations ou avoir accès à des configurations de sérialisations. Voici quelques idées de librairies qui pourrait être de bons candidats à une adaptation spécifiques, proposés sur le site de Jackson:</p><ul><li>Joda Time</li><li>Google guava pour sa partie  sur les collections surtout</li><li>Hibernate, pour par exemple gérer le <em>lazy loading</em></li><li>Apache commons</li><li>des types de donnée propre à des langages de la JVM <em>hors Java</em> comme Scala, Groovy ou Clojure</li></ul><p>Une <a
href="http://wiki.fasterxml.com/JacksonModuleProjects" title="page" >page</a> regroupe certains de ces modules. De plus il est possible en ajoutant le jar <a
href="http://wiki.fasterxml.com/JacksonFeatureMiniJAXB" title="jacksonxmldatabind" >jackson-xml-databind</a> d’utiliser le format XML pour la sérialisation grâce au nouveau <em>mapper</em> <code>XmlMapper</code>.</p><p><a
href="http://blog.xebia.fr/2010/08/18/comparatif-des-librairies-json/" title="Reconnu" >Reconnu</a> comme l’outil le plus performant sur le format JSON, Jackson tente d’étendre ses fonctionnalités et d’améliorer sa modularité, et c’est plutôt une bonne nouvelle.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="EcosystmeGroovyGrails"></a>Ecosystème Groovy/Grails</h4><p>Pour ceux qui suivent l&#8217;actualité Grails, beaucoup de mouvements cette semaine. Burt Beckwith, committer sur le projet, en fait une liste exhaustive <a
href="http://burtbeckwith.com/blog/?p=512" title="sur son blog" >sur son blog</a>. Plus d&#8217;une vingtaine de plugins ont été mis à jour, parmi lesquels :</p><ul><li><a
href="http://grails.org/plugin/liquibase" title="Liquibase" >Liquibase</a></li><li><a
href="http://grails.org/plugin/fixtures" title="Fixtures" >Fixtures</a></li><li><a
href="http://grails.org/plugin/webtest" title="Webtest" >Webtest</a></li><li><a
href="http://grails.org/plugin/jquery" title="JQuery" >JQuery</a></li><li>et d&#8217;autres &#8230;</li></ul><p>Vous trouverez également un tutoriel vidéo pour <a
href="http://marakana.com/forums/java/general/228.html" title="recoder un Twitter-like en 90 minutes" >recoder un Twitter-like en 90 minutes</a>, et un autre pour coder un <a
href="http://stevegood.org/blog/8-minute-grails-contact-manager/" title="gestionnaire de contact en 8 minutes" >gestionnaire de contact en 8 minutes</a>, le tout grâce à Grails.</p><p>L&#8217;outil de build Gradle est <a
href="http://docs.codehaus.org/display/GRADLE/2011/01/04/Gradle+0.9.1+released" title="sorti en version 0.9.1" >sorti en version 0.9.1</a>, vous trouverez <a
href="http://www.objectpartners.com/2011/01/04/using-gradle-to-augment-your-legacy-ant-build/" title="sur ce blog une stratgie intressante" >sur ce blog une stratégie intéressante</a> pour migrer vos scripts ant en douceur et ainsi apporter plus de flexibilité à votre processus de construction de projet.</p><p>Pour plus de détails sur l&#8217;activité Grails de la semaine, faites un tour <a
href="http://burtbeckwith.com/blog/?p=512" title="sur le blog de Burt" >sur le blog de Burt</a>.</p><h4><a
name="VersionmajeuredeJRubyenrelease"></a>Version majeure de JRuby : 1.6 en release candidate</h4><p>Information de dernière minute : JRuby vient de sortir en version 1.6 RC1 ! Il s&#8217;agit là d&#8217;une version majeure à plusieurs égards puisqu&#8217;elle apporte la compatibilité avec Ruby 1.9.2 ! Le support des extensions Ruby compilées en C est également disponible, mais en mode expérimental. Pour plus de détails, voir <a
href="http://jruby.org/2011/01/10/jruby-1-6-0-rc1" title="les release notes" >les release notes</a>. Plus de 265 problèmes solutionnés depuis la dernière version en 2000 commits sur 9 mois, soit une moyenne de 10 commits par jour ouvré ! Un grand bravo à l&#8217;équipe pour ce joli bébé !</p><p>Il va maintenant falloir tester tout ça pour permettre de valider la version. La compatibilité avec Ruby 1.9.2 est l&#8217;effort de test le plus grandement recherché par le projet. Avis aux amateurs&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/01/11/revue-de-presse-xebia-193/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>NoThunes, tests en tout genre et qualité de code</title><link>http://blog.xebia.fr/2010/12/09/nothunes-tests-en-tout-genre-et-qualite-de-code/</link> <comments>http://blog.xebia.fr/2010/12/09/nothunes-tests-en-tout-genre-et-qualite-de-code/#comments</comments> <pubDate>Thu, 09 Dec 2010 12:03:45 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[NoThunes]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6098</guid> <description><![CDATA[Avec un peu de retard sur les autres, voici le cinquième article de cette série sur Grails. Nous allons parler ici de : Tests unitaires Tests d&#8217;intégration Mesures de qualité de code Intégration continue En appliquant le tout à notre projet test bien aimé : NoThunes. Tout code sera testé, sinon par vous, alors par [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/09/nothunes_mini_logo.png" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Avec un peu de retard sur les autres, voici le cinquième article de cette <a
href="http://blog.xebia.fr/tag/nothunes/">série sur Grails</a>. Nous allons parler ici de :</p><ul><li>Tests unitaires</li><li>Tests d&#8217;intégration</li><li>Mesures de qualité de code</li><li>Intégration continue</li></ul><p>En appliquant le tout à notre projet test bien aimé : NoThunes.</p><h3><a
name="Toutcodeseratestsinonparvousal"></a>Tout code sera testé, sinon par vous, alors par vos utilisateurs &#8230;</h3><p>La nécessité de tester notre code, quel qu&#8217;il soit, a été largement décrite, soutenue et argumentée. Par conséquent, nous ne reviendrons pas dessus dans cet article. Je tiens à m&#8217;excuser pour avoir placé en dernier lieu l&#8217;activité qui devrait ouvrir le bal dans la rédaction d&#8217;une application (le TDD c&#8217;est bon, mangez-en). Cela m&#8217;a paru plus attractif de mettre les mains dans le cambouis de suite. Mais maintenant nous allons passer aux choses sérieuses : les Tests.</p><p>Scott Davis, sur le blog d&#8217;IBM, a rédigé une série d&#8217;articles <a
href="http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=mastering+grails" title="Mastering Grails" >Mastering Grails</a> dont 2 nous concernent plus particulièrement ici :</p><ul><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10209/index.html" title="Mock Testing with Grails" >Mock Testing with Grails</a></li><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10148/index.html" title="Testing your Grails application" >Testing your Grails application</a></li></ul><p>Les tests à la mode Grails sont largement bien décrits dans ces 2 articles. Je vais donc vous fournir ici mon retour d&#8217;expérience sur l&#8217;application en conditions réelles de ces conseils. Les tests unitaires au sens propre sont très bien décrits dans ces 2 articles, nous allons donc directement sauter aux tests d&#8217;intégration.</p><h3><a
name="TestsdintgrationGrailsdanslapr"></a>Tests d&#8217;intégration Grails dans la pratique</h3><p>Durant la phase des tests d&#8217;intégration, l&#8217;application est chargée entièrement, dans un <a
href="http://www.grails.org/Environments">mode test</a>. C&#8217;est l&#8217;équivalent du lancement de <code>grails test run-app</code>. Par conséquent nous disposons d&#8217;une base de données et de tous nos composants.</p><p>D&#8217;après Burt Beckwith, membre de la team Grails, il ne faut pas utiliser le framework de mock de Grails pour tester les classes de domaine. Sinon, tout ce qui est testé, c&#8217;est le framework de mock en lui-même et il ne supporte pas toutes les fonctionnalités de GORM (comme les closures <em>withCriteria</em> par exemple !). Pour les classes de domaine, il faut donc utiliser uniquement des tests d&#8217;intégration. L&#8217;exception à cette règle concerne les tests de méthode n&#8217;impliquant ni GORM, ni la base de données, comme les tests de validation de contraintes (regarder du côté de <code><a
href="http://www.ibm.com/developerworks/java/library/j-grails10209/index.html#N10205" title="mockForConstraintsTests()" >mockForConstraintsTests()</a></code> pour ça).</p><p>Cette méthode est un peu radicale et suppose que, dès qu&#8217;on fait usage, à un quelconque endroit, de requêtes nommées ou de closures Criteria, on se retrouve obligé de ne coder <em>que</em> des tests d&#8217;intégration. Une alternative consiste à <a
href="http://adhockery.blogspot.com/2010/01/using-gmock-to-complement-grails.html" title="utiliser GMock" >utiliser GMock</a> pour combler les manques actuels de Grails.</p><h4><a
name="Jeuxdedonnes"></a>Jeux de données</h4><p>Lorsqu&#8217;on code des tests d&#8217;intégration il est important de connaitre le contenu de la base de données avant chaque test. Il est donc utile de pouvoir se baser sur des jeux de données pour initialiser la base. Parmi les nombreuses solutions qui s&#8217;offrent à nous, voici celles qui ont retenu mon attention :</p><ul><li><strong>Utiliser la classe de configuration</strong> <code>Bootstrap.groovy</code> : Cela suppose de charger l&#8217;intégralité des données utiles pour tous les tests d&#8217;intégration, ce qui peut vite devenir encombrant. De plus le code nécessaire à instancier, lier et sauver toutes les instances utiles est assez verbeux.</li><li><strong>Le plugin</strong> <strong><a
href="http://www.grails.org/plugin/dbunit-operator" title="DbUnit Operator" >DbUnit Operator</a></strong> : Permet d&#8217;injecter à la demande des jeux de données écrits en XML. Ce plugin est basé sur la <a
href="http://www.dbunit.org/" title="librairie" >librairie</a> du même nom. C&#8217;est robuste et souple à la fois. L&#8217;inconvénient est que le modèle XML est centré sur le schéma de la base et va nécessiter une maintenance non négligeable.</li><li><strong>Le couple de plugin</strong> <strong><a
href="http://gpc.github.com/grails-fixtures/" title="Fixtures" >Fixtures</a>/<a
href="http://www.grails.org/plugin/build-test-data" title="BuildTestData" >BuildTestData</a></strong> : Fixtures permet de créer des jeux de données et de les sauvegarder en base rapidement avec une syntaxe concise. C&#8217;est la solution qui m&#8217;a semblée la plus pratique. L&#8217;association avec le plugin BuildTestData autorise à raccourcir encore la définition d&#8217;entités. Les champs non remplis manuellement dans une fixture peuvent être remplis automatiquement par BuildTestData.</li></ul><p>Après expérimentation, la dernière solution s&#8217;est révélée la plus simple et efficace. La documentation du plugin est un peu succincte et ne décrit pas de façon <em>explicite</em> tous les cas d&#8217;utilisation. En exclusivité, je vais prendre comme exemple un cas non documenté, sous vos yeux ébahis : l&#8217;utilisation conjointe des 2 plugins dans une fixture externe. Commençons par l&#8217;installation :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin fixtures
grails install-plugin build-test-data
</pre><p>L&#8217;installation du plugin Fixtures entraine l&#8217;apparition d&#8217;un répertoire <code>fixtures/</code> à la racine du projet. Tous les fichiers de fixtures déposés dedans seront rendus accessible pour être chargé dans le code de nos tests. Il est possible de mettre directement les fixtures dans notre code (comme décrit <a
href="http://gpc.github.com/grails-fixtures/docs/manual/guide/2.%20Defining%20The%20Data.html" title="dans la documentation" >dans la documentation</a>) mais j&#8217;ai préféré l&#8217;option de chargement de fichiers externes pour éviter d&#8217;introduire du bruit dans le code. Voici une fixture appliquée à notre modèle :</p><p><code><strong>fixtures/initialDev.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
import fr.xebia.nothunes.domain.*
import fr.xebia.nothunes.security.*
def member = User.findByUsername('user')
member.confirmPasswd = member.passwd
build {
  rtnp(Band) {
    name = 'RTNP'
    webSite = 'http://rtnp.org'
    owner = member
  }
  promotionCanape(Album) {
    name = &quot;Promotion Canapé&quot;
    band = rtnp
  }
  zombieNow(Track) {
    name = &quot;Zombie Now&quot;
    album = promotionCanape
  }
}
</pre><p>Décryptons ce fichier. Nous commençons par récupérer une instance de compte utilisateur en base, pour lui attribuer un <code>Band</code>. Cet utilisateur a été inséré dans la base via la classe de configuration <code>Bootstrap</code>, on peut donc compter dessus. La closures <code>build</code> sera interprétée par Fixtures pour créer les objets et les sauver en base. Fixture permet d&#8217;utiliser une closure <em>build</em>, qui s&#8217;appuie sur le plugin <code>BuildTestsData</code>, qui remplira automatiquement les champs non definis dans la fixture, de façon à ce que l&#8217;instance créée respecte ses contraintes d&#8217;intégrité.</p><p>Il est important de noter que les liens tissés entre les objets de la fixture sont écrits de façon directe. Par exemple la propriété <code>band</code> de notre instance <code>promotionCanape</code> est directement le nom de l&#8217;instance décrite juste au dessus. Pas besoin de sauvegarde intermédiaire, ce qui fait gagner pas mal de temps d&#8217;écriture.</p><p>Maintenant que nous disposons d&#8217;un petit jeu de données, pour le charger dans un test, il suffit de faire comme ceci :</p><pre class="brush: java; title: ; notranslate">
package fr.xebia.nothunes.domain
import grails.test.*
import fr.xebia.nothunes.domain.*
import fr.xebia.nothunes.security.*
class TrackIntegTests extends GrailsUnitTestCase {
  // definition de l'attribut fixtureLoader pour injection automatique
  def fixtureLoader
  protected void setUp() {
    super.setUp()
  }
  protected void tearDown() {
    super.tearDown()
  }
  void testLoadFixture() {
    // chargement du fichier fixtures/initialDev.groovy
    def fixture = fixtureLoader.load('initialDev')
    def result = Track.listOrderByName()
    assertEquals 1, result.size()
    assertEquals 'Zombie Now', result[0].name
  }
  void testNotLoadedFixture() {
    def result = Track.listOrderByName()
    assertEquals 0, result.size()
  }
}
</pre><p>Comme on peut le voir, la durée de vie des données en base ne dépasse pas la méthode de test. Ce comportement est plutôt pratique pour éviter que nos tests d&#8217;intégration se polluent les uns les autres.</p><h3><a
name="Testfonctionnels"></a>Test fonctionnels</h3><p>Pour aller encore un peu plus loin dans les tests, il faut monter encore d&#8217;un cran et passer aux tests d&#8217;IHM. Une référence dans le monde du web en Java : Selenium. C&#8217;est le premier nom qui m&#8217;est venu et j&#8217;ai donc cherché un plugin Grails. Il existe bel et bien mais la documentation initiale m&#8217;a fait faire demi-tour. Les tests peuvent être rédigés en trois formats différents, je vous colle des exemple de chacun pour que vous puissiez juger :</p><ul><li>HTML :</li></ul><pre class="brush: java; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;test1&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; border=&quot;1&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;td colspan=&quot;3&quot;&gt;test1&lt;/td&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;open&lt;/td&gt;&lt;td&gt;/selenium-test/&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt;&lt;td&gt;link=BookController&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt;&lt;td&gt;link=New Book&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;title&lt;/td&gt;&lt;td&gt;book1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt; &lt;td&gt;//input[@value='Create']&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clickAndWait&lt;/td&gt; &lt;td&gt;link=Book List&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;verifyTextPresent&lt;/td&gt; &lt;td&gt;book1&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><ul><li>Pipe separated values :</li></ul><pre class="brush: java; title: ; notranslate">
open|/selenium-test
clickAndWait|link=BookController
clickAndWait|link=New Book
type|title|book2
clickAndWait|//input[@value='Create']
clickAndWait|link=Book List
verifyTextPresent|book2
</pre><ul><li>Groovy Server Pages :</li></ul><pre class="brush: java; title: ; notranslate">
&lt;g:set var=&quot;bookTitle&quot; value=&quot;book0d&quot;/&gt;
&lt;sel:test name=&quot;MyTest&quot;&gt;
&lt;sel:row command=&quot;open&quot; target=&quot;${request.contextPath}&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|link=BookController&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|link=New Book&quot;/&gt;
&lt;sel:row command=&quot;type&quot; target=&quot;title&quot; value=&quot;${bookTitle}&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|//input[@value='Create']&quot;/&gt;
&lt;sel:row line=&quot;clickAndWait|link=Book List&quot;/&gt;
&lt;sel:row line=&quot;verifyTextPresent|${bookTitle}&quot;/&gt;
&lt;/sel:test&gt;
</pre><p>Si l&#8217;une de ces syntaxes vous emballe, faites en bon usage. Personnellement j&#8217;ai été refroidi par l&#8217;aspect très compact et plutôt dur à relire. J&#8217;ai donc continué mes investigations, et suis finalement tombé sur le plugin <a
href="http://www.grails.org/plugin/webtest" title="WebTest" >WebTest</a>, basé sur la librairie de <a
href="http://webtest.canoo.com/webtest/manual/WebTestHome.html" title="Canoo" >Canoo</a>. Une librairie beaucoup plus orienté Groovy que ne l&#8217;est le plugin Selenium. De plus WebTest fourni également de jolis rapports HTML plein de couleurs attrayantes, faciles à interpréter. Voici un exemple de ce que peut donner le code d&#8217;un test simpliste avec cette librairie :</p><pre class="brush: java; title: ; notranslate">
package nothunes
import nothunes.common.WebTestsNoThunes
class BandWebTests extends WebTestsNoThunes {
  def fixtureLoader
  void testLogin() {
    invoke(url:'login')
    verifyText(text:'Please Login..')
    def fixture = fixtureLoader.load('initialDev')
    invoke(url:'/navigation')
    verifyText(text:'RTNP')
  }
}
</pre><p>Les actions sont basiques, l&#8217;API est nativement en Groovy, et pour ceux qui ont déjà utilisé Selenium sur des projets Java, ce n&#8217;est vraiment pas dépaysant. La facilité de prise en main et les rapports parlants en font ma préférence pour l&#8217;automatisation de tests d&#8217;IHM web.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/webtests-report.png" alt="webtests-report" title="webtests-report" /></div><h3><a
name="Analysestatiqueducode"></a>Analyse statique du code</h3><p>Outre la pose d&#8217;un filet de sécurité autour des fonctionnalités de l&#8217;application, il est également intéressant d&#8217;affiner la qualité du code source produit. L&#8217;analyse statique de code est une méthode rodée chez les développeurs Java pour permettre de trouver des duplications de code, des bugs éventuels, évaluer la complexité, etc. Du coté du langage Groovy, l&#8217;outillage est un peu moins riche mais on trouve quand même quelques petites choses intéressantes.</p><h4><a
name="CodeNarc"></a>CodeNarc</h4><p>Tout d&#8217;abord : <a
href="http://codenarc.sourceforge.net/" title="CodeNarc" >CodeNarc</a>. Ce programme permet de valider du code Groovy en regard de règles de programmation établie. Un jeu de règle est proposé par défaut mais il est possible de définir ses propres règles. Un packaging sous forme de <a
href="http://www.grails.org/plugin/codenarc" title="plugin Grails" >plugin Grails</a> existe également, pour permettre une installation et une utilisation simplifiées :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin codenarc
grails codenarc
</pre><p>Cela va lancer l&#8217;analyse et générer un rapport détaillé de toutes les violations de règles, au format HTML :</p><p><strong>Extrait de CodeNarcReport.html</strong></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/codenarc_nothunes.png" alt="codenarc_nothunes" title="codenarc_nothunes" width="700px" /></div><p>La présentation est spartiate, mais ça tourne ! Le rapport commence par une vision macro avec la consolidation des erreurs par package, puis viens la liste détaillée de chacun des packages concernés, et enfin la description de chaque type de violation rencontré.<br
/> On peut également <a
href="http://codenarc.sourceforge.net/codenarc-creating-ruleset.html" title="crire soit mme des rgles" >écrire soit même des règles</a> de programmation à respecter. Il est donc aisé de se baser sur cet outil pour faire respecter les normes de votre choix. Pour ceux d&#8217;entre vous qui l&#8217;utilise déjà, sachez que la dernière version (la 0.11) est sortie le 13 novembre avec notamment 50 règles supplémentaires.</p><h4><a
name="GMetrics"></a>GMetrics</h4><p>GMetrics, quant à lui, est centré sur le calcul et la présentation de métriques. Le projet assure le calcul :</p><ul><li>de complexité cyclomatique</li><li>du nombre de lignes par méthode</li><li>du nombre de lignes par classe</li></ul><p>Selon le même principe que CodeNarc, l&#8217;installation de cette librairie se fait comme un plugin au projet : il se lance simplement et génère un rapport HTML :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin gmetrics
grails gmetrics
</pre><p><strong>Extrait d&#8217;un rapport GMetrics</strong></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/gmetrics_nothunes.png" alt="gmetrics_nothunes" title="gmetrics_nothunes" width="700px"/></div><p>GMetrics est encore assez léger dans les métriques collectées, mais il offre une excellente base de développement pour collecter ses propres métriques. Si par hasard vous en écrivez pour un projet, n&#8217;hésitez pas à en faire profiter la communauté.</p><h3><a
name="Conclusions"></a>Conclusions</h3><p>Il y aurait de quoi écrire un livre entier sur le seul sujet des tests dans le cadre de Grails. Comme d&#8217;habitude, les affinités entre le langage Groovy et le Java font que beaucoup d&#8217;outils Java sont déjà <em>pluginizé</em> ou ne coûterai pas cher à l&#8217;être. Longtemps cantonné aux scripting Java, le langage Groovy trouve ses lettre de noblesse avec Grails. Il est agréable de voir se développer pour le langage Groovy des outils de qualité qui apportent tant au langage Java. En quelques recherches, un projet peut se doter de tout ce qu&#8217;il faut pour développer des tests unitaires, d&#8217;intégration, fonctionnels mais aussi tests d&#8217;acceptance (avec <a
href="http://www.grails.org/plugin/fitnesse" title="Fitnesse" >Fitnesse</a> ou <a
href="http://www.grails.org/plugin/easyb" title="EasyB" >EasyB</a>), ou même des tests de vos fonctions Javascript avec <a
href="http://www.grails.org/plugin/jsunit" title="JsUnit" >JsUnit</a>.</p><p>Dans le framework Grails, les tests sont disponibles pour tous les goûts, toutes les tailles. Le véritable défi consiste à séparer le bon grain de l&#8217;ivraie au milieu du foisonnement de plugins disponibles (sans compter qu&#8217;il est toujours possible d&#8217;intégrer soit même des librairies Java). J&#8217;espère vous avoir apporté, sinon <em>La</em> réponse, au moins l&#8217;éclairage de mon expérience personnelle sur le sujet. Maintenant il ne reste plus qu&#8217;à trouver votre propre style de tests Grails.</p><p><strong>Ressources :</strong></p><ul><li><a
href="http://www.grails.org/Unit+Testing" title="Tests unitaires sur le site Grails" >Tests unitaires sur le site Grails</a></li><li><a
href="http://grails.org/doc/latest/guide/9.%20Testing.html" title="Section Testing de la documentation officielle" >Section Testing de la documentation officielle</a></li><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10209/index.html" title="Mock Testing with Grails" >Mock Testing with Grails</a></li><li><a
href="http://www.ibm.com/developerworks/java/library/j-grails10148/index.html" title="Testing your Grails application" >Testing your Grails application</a></li><li><a
href="https://github.com/aurelienmaury/nothunes" title="NoThunes sur GitHub" >NoThunes sur GitHub</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/09/nothunes-tests-en-tout-genre-et-qualite-de-code/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>NoThunes, MediaPlayer et moteur de recherche</title><link>http://blog.xebia.fr/2010/10/22/nothunes-mediaplayer-et-moteur-de-recherche/</link> <comments>http://blog.xebia.fr/2010/10/22/nothunes-mediaplayer-et-moteur-de-recherche/#comments</comments> <pubDate>Fri, 22 Oct 2010 09:39:22 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[NoThunes]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5687</guid> <description><![CDATA[Pour le quatrième volet de notre projet de plateforme de musique libre, NoThunes, nous allons ajouter les dernières fonctionnalités du backlog original : En tant qu&#8217;internaute, je dois pouvoir écouter un morceau En tant qu&#8217;internaute, je dois pouvoir rechercher des morceaux par mots-clés Pour cela, nous passerons par l&#8217;utilisation de 2 plugins très pratiques : [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/09/nothunes_mini_logo.png" alt="Projet NoThunes" /><br
/> Pour le quatrième volet de notre projet de plateforme de musique libre, NoThunes, nous allons ajouter les dernières fonctionnalités du <a
href="http://blog.xebia.fr/2010/09/09/nothunes-naissance-dun-projet-grails/" title="backlog original" >backlog original</a> :</p><ul><li>En tant qu&#8217;internaute, je dois pouvoir écouter un morceau</li><li>En tant qu&#8217;internaute, je dois pouvoir rechercher des morceaux par mots-clés</li></ul><p>Pour cela, nous passerons par l&#8217;utilisation de 2 plugins très pratiques :</p><ul><li><strong>Sound Manager</strong>, qui offre des tags GSP pour ajouter facilement des fonctions de media player dans les vues</li><li><strong>Searchable</strong>, qui apporte des fonctionnalités de recherche basées sur <a
href="http://www.compass-project.org/" title="Compass" >Compass</a> (et donc indirectement sur le moteur <a
href="http://lucene.apache.org/" title="Lucene" >Lucene</a>)</li></ul><p>Suivez le guide &#8230;</p><h3><a
name="Entantquinternautejedoispouvoi"></a>En tant qu&#8217;internaute, je dois pouvoir écouter un morceau</h3><p>Pour rappel, dans <a
href="http://blog.xebia.fr/tag/nothunes/" title="les pisodes prcdents" >les épisodes précédents</a>, nous avons offerts :</p><ul><li>aux utilisateurs membres : la possibilité d&#8217;uploader des morceaux de musique.</li><li>aux internautes : la possibilité de naviguer dans les morceaux disponibles en filtrant par Band et Album, et de les télécharger.</li></ul><p>Aujourd&#8217;hui nous allons leur permettre d&#8217;écouter les morceaux avant de les télécharger. Précisons tout d&#8217;abord cette User Story un peu vague. Il s&#8217;agit ici de fournir une fonctionnalité très minimaliste, permettant de jouer un morceaux directement dans l&#8217;interface de navigation, pour &laquo;&nbsp;goûter&nbsp;&raquo; avant de télécharger.</p><p>Le périmètre de notre besoin est très restreint et il se trouve qu&#8217;un plugin Grails le comble parfaitement : <strong>sound-manager</strong>. Ce plugin permet de transformer n&#8217;importe quel lien pointant vers un fichier mp3 dans la page en un mini lecteur audio flash.</p><p>Commençons donc par installer le plugin :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin sound-manager
</pre><p>Si vous avez une bonne mémoire, vous vous rappelez de notre GSP <code>grails-app/views/navigation/_trackList.gsp</code> qui sert à afficher la liste des <code>Tracks</code> recherchés. Il nous suffit d&#8217;ajouter en tête de ce fichier :</p><pre class="brush: java; title: ; notranslate">
&lt;head&gt;
  &lt;sm:inlinePlayer/&gt;
&lt;/head&gt;
</pre><p>Ce tag va, à chaque chargement de la page, rechercher les liens pointant vers des fichiers mp3 et les &laquo;&nbsp;entourer&nbsp;&raquo; avec un peu de sound-manager pour obtenir un mini flash-player dédié au lien.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/play_soundm.png" width="600" /></div><p>Comme nous avons mis une image dans le lien vers le mp3, il reste possible de télécharger le morceaux en cliquant sur l&#8217;icône plutôt que sur le bouton Play.</p><p><em>And voilà !</em> 100% de notre petit besoin est rempli, et l&#8217;opération a dû prendre 20 minutes en comptant :</p><ul><li>la recherche du plugin sur <a
href="http://www.grails.org/plugin/home" title="le portail Grails" >le portail Grails</a>.</li><li>la lecture de <a
href="http://www.grails.org/plugin/sound-manager" title="la documentation" >la documentation</a>.</li><li>l&#8217;installation.</li><li>la mise en œuvre.</li></ul><p>C&#8217;est presque allé trop vite pour en goûter toute la saveur.</p><p>Pour ceux qui veulent aller plus loin, sachez que ce plugin est basé sur <a
href="http://www.schillmania.com/projects/soundmanager2/" title="la librairie du mme nom" >la librairie du même nom</a>, et qu&#8217;il est donc également possible d&#8217;utiliser l&#8217;intégralité de l&#8217;API, qui est très complète, pour obtenir un lecteur plus riche, éventuellement en HTML5.</p><h3><a
name="Entantquinternautejedoispouvoi"></a>En tant qu&#8217;internaute, je dois pouvoir rechercher des morceaux par mots-clés</h3><p>Passons maintenant au moteur de recherche de notre navigation. Le but est ici d&#8217;ajouter un formulaire de recherche sur la page de navigation et de lancer la recherche sur les noms des <code>Bands</code>, <code>Albums</code> et <code>Tracks</code> existant en base. Là il y a un peu plus à faire. Tout d&#8217;abord, installons le plugin <a
href="http://www.grails.org/plugin/searchable" title="Searchable" >Searchable</a> :</p><pre class="brush: java; title: ; notranslate">
grails install-plugin searchable
</pre><p>Ce plugin est basé sur <a
href="http://www.compass-project.org/" title="Compass" >Compass</a>, qui est lui même basé sur <a
href="http://lucene.apache.org/" title="Apache Lucene" >Apache Lucene</a>, le moteur de recherche full-text Java Open Source le plus utilisé (notamment par Twitter depuis peu). Le première étape est de déterminer sur quelles données nous souhaitons baser nos recherches. Dans notre cas, nous avons choisi les champs <code>name</code> des classes de domaines <code>Band</code>, <code>Album</code> et <code>Track</code>.</p><p>Pour renseigner l&#8217;index du moteur Lucene, il suffit de rajouter cette ligne dans nos classes :</p><pre class="brush: java; title: ; notranslate">
static searchable = [only: ['name']]
</pre><p>Si vous souhaitez faire des mappings plus complexes, il existe de nombreuses possibilités : regardez du coté de la section Mappings de <a
href="http://www.grails.org/plugin/searchable" title="la documentation" >la documentation</a>.</p><p>Notre index est maintenant renseigné. Il nous faut une nouvelle méthode de contrôleur pour l&#8217;interroger. Pour plus de simplicité, nous la plaçons dans le <code>NavigationController</code>. Fait notable : la recherche par l&#8217;index Lucene remonte des entités incomplètes. Seuls les champs indexés sont renseignés. Par conséquent, pour l&#8217;affichage final, il faut interroger la base pour avoir tous les champs. Il faut également penser à modifier la chaîne de recherche pour la rendre compréhensible par Lucene. Nous utilisons ici une technique très basique, mais les query Lucene peuvent être autrement plus puissantes. Pour plus de détails, <a
href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html" title="voir la documentation du moteur" >voir la documentation du moteur</a>.</p><p><code><strong>grails-app/controllers/fr/xebia/nothunes/domain/NavigationController.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
  /**
    * Methode d'instrumentation pour transformer la chaine de recherche du formulaire en query Lucene-compliant
    * @param query Chaine de recherche
    */
   def instrument(String query) {
      return query+&quot;*&quot;
   }
   /**
    * Methode de recherche full-text
    */
   def search = {
      String searchQuery = instrument(params.searchQuery)
      log.debug &quot;search query is ${searchQuery}&quot;
      def result = searchableService.search(searchQuery)
      // Les *.searchEvery remontent des entités incomplètes, il faudra les récupérer en base pour avoir tous les champs
      def albumResult = Album.searchEvery(searchQuery)
      def bandResult = Band.searchEvery(searchQuery)
      def trackResult = Track.searchEvery(searchQuery)
      def trackList = [] as Set
      def bandList = [] as Set
      def albumList = [] as Set
      // filtrage des tracks pour n'afficher que ceux qui ont un fichier audio
      trackResult.each {
         def fullTrack = Track.get(it.id)
         if (fullTrack.audioPath) {
            trackList.add(fullTrack)
            albumList.add(fullTrack.album)
            bandList.add(fullTrack.album.band)
         }
      }
      // filtrage des albums pour afficher uniquement ceux qui ont au moins un track avec un fichier audio
      albumResult.each {
         def hasOneCompleteTrack = false
         def fullAlbum = Album.get(it.id)
         fullAlbum.tracks.each { aTrack -&gt;
            if (aTrack.audioPath) {
               trackList.add(aTrack)
               hasOneCompleteTrack = true
            }
         }
         if (hasOneCompleteTrack)  {
            albumList.add(fullAlbum)
            bandList.add(fullAlbum.band)
         }
      }
      bandResult.each {
         def fullBand = Band.get(it.id)
         fullBand.albums.each {anAlbum -&gt;
            def hasOneCompleteTrack = false
            anAlbum.tracks.each { aTrack -&gt;
               if (aTrack.audioPath) {
                  trackList.add(aTrack)
                  hasOneCompleteTrack = true
               }
            }
            if (hasOneCompleteTrack)  {
               bandList.add(fullBand)
               albumList.add(anAlbum)
            }
         }
      }
      // Rendu de la vue
      render (view:'list', model: [bandList: bandList, albumList: albumList, trackList: trackList, searchQuery: params.searchQuery])
   }
</pre><p>Dernière chose à ajouter : le formulaire de recherche dans la vue :</p><p><code><strong>grails-app/views/navigation/list.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;g:form action=&quot;search&quot;&gt;
   &lt;input type=&quot;text&quot; id=&quot;searchQuery&quot; name=&quot;searchQuery&quot; value=&quot;${searchQuery}&quot;/&gt;
   &lt;g:actionSubmit  value=&quot;Search&quot; /&gt;
&lt;/g:form&gt;
</pre><p>La chaine est maintenant complète et nous pouvons lancer des requêtes pour interroger notre base.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/lucene_all.png" width="600"  /></div><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/lucene_smiley.png" width="600"/></div><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/lucene_lune.png" width="600" /></div><h3><a
name="Conclusion"></a>Conclusion</h3><p>L&#8217;ajout de ces deux fonctionnalités a été assez rapide. Si l&#8217;on possède les bons points d&#8217;entrée et que l&#8217;on prend la peine de fouiller le repository de plugins de Grails, il y a de fortes chances de trouver son bonheur rapidement. Il va de soit que les exemples donnés ici sont des usages basique. Les librairies tirées par les plugins sont plus complètes et permettent d&#8217;aller beaucoup plus loin.</p><p>Je me permet ici personnel, mais l&#8217;utilisation de Grails me remplit de joie <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . C&#8217;est rapide, c&#8217;est concis, et si j&#8217;en veux plus, je peux. Le chemin vers le code qui fonctionne est bien tracé par les documentations.</p><p>Dans le prochain épisode, nous verrons comment tester notre code et contrôler sa qualité.</p><h3><a
name="Ressources"></a>Ressources</h3><ul><li><strong><a
href="http://github.com/aurelienmaury/nothunes/tree/v0.4">NoThunes version 0.4 sur GitHub</a></strong></li><li><strong><a
href="http://www.grails.org/plugin/sound-manager" title="Grails SoundManager Plugin" >Grails SoundManager Plugin</a></strong></li><li><strong><a
href="http://www.grails.org/plugin/searchable" title="Grails Searchable Plugin" >Grails Searchable Plugin</a></strong></li><li><strong><a
href="http://www.compass-project.org/" title="Compass SearchEngine Framework" >Compass SearchEngine Framework</a></strong></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/10/22/nothunes-mediaplayer-et-moteur-de-recherche/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>NoThunes, AJAX-ification sauce Grails</title><link>http://blog.xebia.fr/2010/10/07/nothunes-ajax-ification-sauce-grails/</link> <comments>http://blog.xebia.fr/2010/10/07/nothunes-ajax-ification-sauce-grails/#comments</comments> <pubDate>Thu, 07 Oct 2010 07:53:51 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[NoThunes]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5589</guid> <description><![CDATA[Retour sur notre plateforme de musique en ligne préférée. Comme promis, dans ce chapitre, nous allons ajouter une pincée de 2.0 à notre application. Nous allons donc nous pencher sur la mise en oeuvre d&#8217;AJAX à la mode de Grails. Listes déroulantes dynamiques avec JSON Mise à jour de fragments de page avec modèles GSP [...]]]></description> <content:encoded><![CDATA[<style type="text/css">table.tablo { border-collapse:collapse; border: 1px solid #6C626C; width:95%; font: normal normal normal 1.1em/normal Arial, sans-serif; } table.tablo thead { background: #EFEFEF; border-bottom: 1px solid #6C626C; border-top: 1px solid #6C626C; color: #4F2F4F; } table.tablo thead th { padding: 5px; } table.tablo tbody tr { border: 1px solid #6C626C; } table.tablo tbody tr td { padding: 5px; }</style><p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/09/nothunes_mini_logo.png" alt="Projet NoThunes" /></p><p>Retour sur notre plateforme de musique en ligne préférée. Comme promis, dans ce chapitre, nous allons ajouter une pincée de 2.0 à notre application. Nous allons donc nous pencher sur la mise en oeuvre d&#8217;AJAX à la mode de Grails.</p><ul><li>Listes déroulantes dynamiques avec JSON</li><li>Mise à jour de fragments de page avec modèles GSP</li></ul><p>Vous allez pouvoir découvrir l&#8217;intégration d&#8217;AJAX dans Grails, et à quel point la vie du développeur est facilitée. Les exemples d&#8217;utilisation sont simples mais déclinables à l&#8217;infini.</p><h3><a
name="SprintBacklogdtaill"></a>Sprint Backlog détaillé</h3><div><table
class="tablo" border="0"><thead><th>En tant que &#8230;</th><th>je dois pouvoir &#8230;</th><th>détail &#8230;</th></thead><tbody><tr><td>membre</td><td>Créer/modifier/supprimer des <code>Tracks</code> liés à mes albums, en uploadant un fichier mp3</td><td>CRUD standard avec upload de fichier.</td></tr><tr><tr><td>internaute</td><td>naviguer dans la hiérarchie de groupes/albums/morceaux existante</td><td>Dans une même page, on offre la sélection par groupe, album et morceaux. Si un groupe est sélectionné, on filtre les albums et les morceaux. Si un album est sélectionné, on filtre les morceaux.</td></tr><tr><tr><td>internaute</td><td>télécharger un morceau</td><td>Dans la navigation offerte aux internautes, on doit disposer d&#8217;un lien pour télécharger le fichier mp3 associé à un Track.</td></tr><tr></tbody></table></div><h3><a
name="GestiondesTracks"></a>Gestion des Tracks</h3><p>Nous sautons tout ce qui concerne la mise en place du CRUD et de la gestion de l&#8217;upload de fichier mp3. La méthode employée est foncièrement identique au <a
href="http://blog.xebia.fr/2010/09/23/nothunes-lespace-vip/">travail déjà fait</a> pour les classes <code>Band</code> et <code>Album</code>. Comme d&#8217;habitude le détail est dans <a
href="http://github.com/aurelienmaury/nothunes" title="le GitHub" >le GitHub</a>.</p><p>Attardons nous, par contre, sur un point particulier du formulaire de création de <code>Track</code> : l&#8217;attribution à un <code>Album</code>. Chaque Track appartient à un <code>Album</code> (par un lien <code>belongsTo</code>). Pour une meilleure ergonomie, nous avons choisi de proposer à l&#8217;utilisateur de sélectionner d&#8217;abord un <code>Band</code> dans un <code>&lt;select ../&gt;</code> et, dynamiquement, nous proposons les <code>Albums</code> de ce groupe dans un second <code>&lt;select ../&gt;</code>. Enfin un peu d&#8217;AJAX dans notre projet !</p><p>Pour ceux qui n&#8217;ont pas fait de veille techologique depuis plusieurs années, voici un <a
href="http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML" title="petit rappel sur AJAX" >petit rappel sur AJAX</a>.</p><p>Nous commençons par outiller nos pages avec ce qu&#8217;il faut de Javascript :</p><p><code><strong>grails-app/views/layouts/main.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;html&gt;
    &lt;head&gt;
...
      &lt;g:javascript library=&quot;application&quot; /&gt;
      &lt;g:javascript library=&quot;prototype&quot; /&gt;
    &lt;/head&gt;
...
</pre><p>Ces tags ajoutent dans toutes les pages l&#8217;import de la librairie <a
href="http://www.prototypejs.org/" title="Prototype" >Prototype</a>, fournie par défaut avec Grails, et du fichier <code>web-app/js/application.js</code>. Ce dernier est destiné à recevoir le code Javascript spécifique à notre appli. Ensuite nous créons une méthode dans notre <code>BandController</code> pour renvoyer, au format <a
href="http://fr.wikipedia.org/wiki/JavaScript_Object_Notation" title="JSON" >JSON</a>, la liste des albums appartenant au groupe dont l&#8217;id est passé en paramètre :</p><p><code><strong>grails-app/controllers/fr/xebia/nothunes/domain/BandController</strong></code></p><pre class="brush: java; title: ; notranslate">
...
// Pensez bien à faire cet import
import grails.converters.*
...
def ajaxGetAlbums = {
   render Band.get(params.id).albums as JSON
}
</pre><p>Comme on peut le voir le package <strong><code>grails.converters</code></strong> nous offre une méthode plus que simple pour la conversion d&#8217;objets en JSON. A noter que, dans la même famille il est possible d&#8217;utiliser <code>as XML</code>.</p><p>Maintenant il faut que nous lancions un appel AJAX vers cette méthode, lors de la sélection d&#8217;un groupe. Grails a prévu pour nous la méthode <code>remoteFunction</code> qui va générer le Javascript nécessaire.</p><p><code><strong>grails-app/views/tracks/create.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
...
&lt;tr class=&quot;prop&quot;&gt;
  &lt;td valign=&quot;top&quot; class=&quot;name&quot;&gt;
    &lt;label for=&quot;band.id&quot;&gt;
      &lt;g:message code=&quot;track.album.band.label&quot; default=&quot;Band&quot; /&gt;
    &lt;/label&gt;
  &lt;/td&gt;
  &lt;td valign=&quot;top&quot; class=&quot;value&quot;&gt;
    &lt;g:select name=&quot;band&quot;
              from=&quot;${bandList}&quot;
              value=&quot;${band?.id}&quot;
              noSelection=&quot;['':'---Choose a band---']&quot;
              optionValue=&quot;name&quot;
              optionKey=&quot;id&quot;
              onchange=&quot;${remoteFunction(
                  controller:'band',
                  action:'ajaxGetAlbums',
                  params:''id=' + escape(this.value)',
                  onComplete:'updateSelectAlbumWithJSON(e,'albums')')}&quot;
    /&gt;
  &lt;/td&gt;
&lt;/tr&gt;
...
</pre><p>Les paramètres de <code>remoteFunction</code> sont assez explicites :</p><ul><li><strong>controller, action :</strong> le contrôleur et l&#8217;action ciblée</li><li><strong>params :</strong> les paramètres de la requête</li><li><strong>onComplete :</strong> la méthode javascript callback de l&#8217;appel AJAX</li></ul><p>Il ne reste plus qu&#8217;à rédiger la méthode Javascript pour mettre à jour le <code>select</code> des <code>Albums</code> :</p><p><code><strong>web-app/js/application.js</strong></code></p><pre class="brush: java; title: ; notranslate">
function updateSelectAlbumWithJSON(e, albumListId) {
   var rselect = $(albumListId)
   // Vidage du select
   var l = rselect.length
   while (l &gt; 0) {
      l--
      rselect.remove(l)
   }
   // Evaluation du JSON retourné par le serveur
   var albums = eval(&quot;(&quot; + e.responseText + &quot;)&quot;)
   if (albums) {
   // Remplissage du select avec les nouvelles options
      addOption(rselect, '---Choose an album---', '')
      for (var i=0; i &lt; albums.length; i++) {
         addOption (rselect, albums[i].name, albums[i].id)
      }
   }
}
function addOption(selectId, text, value) {
   var opt = new Element('option');
   opt.text = text
   opt.value = value
   try {
      selectId.add(opt,null) // Standard, ne fonctionne pas avec IE
   }
   catch(ex) {
      selectId.add(opt) // seulement pour IE
   }
}
</pre><p>En mode développement, c&#8217;est certainement superflu, mais au cas où le listing des albums deviendrait un peu long, il est possible d&#8217;ajouter un gif d&#8217;attente. Cette image est gracieusement fournie par Grails. Ça n&#8217;a l&#8217;air de rien, d&#8217;ailleurs ce n&#8217;est rien, mais ça fait plaisir quand même ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br
/> Juste à coté du tag &lt;g:select/&gt; des Albums on peut ajouter un petit :</p><p><code><strong>grails-app/views/tracks/create.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;div id=&quot;waitingGif&quot;&gt;&lt;img src=&quot;${resource(dir:'images',file:'spinner.gif')}&quot; alt=&quot;${message(code:'spinner.alt',default:'Loading...')}&quot; /&gt;&lt;/div&gt;
</pre><p>Et dans le javascript, ajouter du <code>$('waitingGif').show()</code> et <code>$('waitingGif').hide()</code>. Ca fait toujours plus joli après tout.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/create_track.png" border="0" alt="create_track" title="create_track" width="600" /></div><p>Ça y est, pas besoin de plus ! Pour la page d&#8217;édition d&#8217;une instance existante, la méthode est pratiquement la même. il faut juste ajouter dans le <code>trackcontroller</code> le chargement de la liste des <code>albums</code> pour que les 2 <code>select</code> soient remplis au chargement. les gentils membres ont maintenant toutes les fonctionnalités pour alimenter notre plateforme de musique en contenu dûment étiquetté.</p><h3><a
name="Navigationpourlesinternautes"></a>Navigation pour les internautes</h3><p>Il faut maintenant penser aux internautes moyens, avides de pouvoir accéder au contenu des membres. Nous allons donc attaquer la navigation publique. Pour éviter de surcharger les contrôleurs existant, nous créons un <code>NavigationController</code>, qui sera dédié à la page de navigation destinée aux internautes lambdas, ainsi qu&#8217;une page GSP associée à l&#8217;action <code>list</code> (donc dans le fichier <code>grails-app/views/navigation/list.gsp</code>).</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/navig_all.png"  width="600" border="0" /></div><p>La sélection d&#8217;un <code>Band</code> doit déclencher le filtrage de la liste des <code>Albums</code> et des <code>Tracks</code>, et la sélection d&#8217;un <code>Album</code> doit déclencher le filtrage de la liste des <code>Tracks</code> uniquement. Le filtrage des <code>Albums</code> est identique au cas précédent, puisque c&#8217;est un <code>select</code>. Le tableau des <code>Tracks</code>, un peu plus riche, mérite qu&#8217;on s&#8217;y attarde un peu.</p><p>Le principe est globalement le même, à ceci près qu&#8217;on va utiliser un modèle GSP pour créer le fragment HTML qui servira à remplacer dynamiquement la liste des <code>Tracks</code>. Zoomons un peu sur la mécanique de notre page <code>list.gsp</code> :</p><pre class="brush: java; title: ; notranslate">
&lt;html&gt;
   &lt;head&gt;
      &lt;!-- ... --&gt;
      &lt;g:javascript&gt;
         // Fonction de filtrage du select des Albums et de la liste des Track, à partir d'un id de Band
         function filterByBand() {
            var bandId = $F('bandSelect');
            &lt;g:remoteFunction action=&quot;ajaxFilterTrackByBand&quot; params=&quot;'id=' + bandId&quot; onComplete=&quot;updateTrackList(e)&quot;/&gt;
            &lt;g:remoteFunction action=&quot;ajaxFilterAlbumByBand&quot; params=&quot;'id=' + bandId&quot; onComplete=&quot;updateAlbums(e)&quot;/&gt;
         }
         // Fonction de filtrage de la liste des Track, à partir d'un id d'Album
         function filterByAlbum() {
            var albumId = $F('albumSelect');
            &lt;g:remoteFunction action=&quot;ajaxFilterTrackByAlbum&quot; params=&quot;'id=' + albumId&quot; onComplete=&quot;updateTrackList(e)&quot;/&gt;
         }
         // Fonction de mise à jour de la liste des Track avec la réponse (au format HTML) de la requête AJAX.
         function updateTrackList(e) {
            $('navTrack').innerHTML = e.responseText;
         }
         // Fonction de mise à jour du select des Albums avec la réponse (au format JSON) de la requête AJAX.
         function updateAlbums(e) {
            // Le code est identique à l'exemple donné pour la
            // mise à jour de select du paragraphe précédent
         }
      &lt;/g:javascript&gt;
   &lt;/head&gt;
   &lt;body&gt;
      &lt;div class=&quot;body&quot;&gt;
         &lt;h1&gt;Navigation&lt;/h1&gt;
         &lt;div class=&quot;navigation&quot;&gt;
            &lt;!-- ... --&gt;
            &lt;!-- Selection de Band, le onchange déclenche le javascript de filtrage --&gt;
            &lt;g:select id=&quot;bandSelect&quot; name=&quot;band&quot; class=&quot;navigationSelect&quot;
                  from=&quot;${bandList}&quot;
                  noSelection=&quot;['':'All']&quot; optionValue=&quot;name&quot;
                  optionKey=&quot;id&quot; size=&quot;30&quot; onchange=&quot;filterByBand()&quot;/&gt;
            &lt;!-- ... --&gt;
            &lt;!-- Selection d'Album, le onchange déclenche le javascript de filtrage --&gt;
            &lt;g:select id=&quot;albumSelect&quot; name=&quot;album&quot; class=&quot;navigationSelect&quot;
                  from=&quot;${albumList}&quot;
                  noSelection=&quot;['':'All']&quot; optionValue=&quot;name&quot;
                  optionKey=&quot;id&quot; size=&quot;30&quot; onchange=&quot;filterByAlbum()&quot;/&gt;
            &lt;!-- ... --&gt;
            &lt;!-- Selection de Track, encapsulé dans une div pour pouvoir mettre a jour facilement son contenu --&gt;
            &lt;div id=&quot;navTrack&quot; class=&quot;list&quot;&gt;
               &lt;!-- on charge le fragment contenant la liste des Track, pour qu'elle apparaissent dès le premier chargement --&gt;
               &lt;g:render template=&quot;/navigation/trackList&quot;/&gt;
            &lt;/div&gt;
         &lt;/div&gt;
      &lt;/div&gt;
   &lt;/body&gt;
&lt;/html&gt;
</pre><p>Dans le tag <code>&lt;g:render .../&gt;</code> en fin de l&#8217;exemple, on voit qu&#8217;on fait appel au modèle GSP qui contient la liste formatée des <code>Tracks</code>. Passons à sa rédaction. Il faut penser à nommer le fragment qui servira de modèle en commençant par un caractère &#8216;_&#8217;, c&#8217;est la convention. Notez que dans la colonne <strong>Download</strong> on réutilise le <code>DlController</code> créé à l&#8217;épisode 2.</p><p><code><strong>grails-app/views/navigation/_trackList.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;table&gt;
   &lt;thead class=&quot;fixedHeader&quot;&gt;
      &lt;tr&gt;
         &lt;th&gt;${message(code: 'track.name.label', default: 'Name')}  &lt;/th&gt;
         &lt;th&gt;${message(code: 'band.name.label', default: 'Band')}   &lt;/th&gt;
         &lt;th&gt;${message(code: 'album.name.label', default: 'Album')} &lt;/th&gt;
         &lt;th style=&quot;width: 50px; text-align: center;&quot;&gt;Download      &lt;/th&gt;
      &lt;/tr&gt;
   &lt;/thead&gt;
   &lt;tbody class=&quot;navigationTable&quot;&gt;
      &lt;g:each in=&quot;${trackList}&quot; status=&quot;i&quot; var=&quot;trackInstance&quot;&gt;
         &lt;tr class=&quot;${(i % 2) == 0 ? 'odd' : 'even'}&quot;&gt;
            &lt;td&gt;
            ${fieldValue(bean: trackInstance, field: &quot;name&quot;)}
            &lt;/td&gt;
            &lt;td&gt;&lt;g:link url=&quot;${trackInstance.album.band.webSite}&quot;&gt;
               ${fieldValue(bean: trackInstance, field: &quot;album.band.name&quot;)}
            &lt;/g:link&gt;&lt;/td&gt;
            &lt;td&gt;
            ${fieldValue(bean: trackInstance, field: &quot;album.name&quot;)}
            &lt;/td&gt;
            &lt;td style=&quot;width: 50px; text-align: center;&quot;&gt;&lt;a
               href=&quot;${createLink(controller:'dl', action:'audio', params: [id: trackInstance.audioPath])}&quot;&gt;
            &lt;img src=&quot;${resource(dir:'images',file:'filesave.png')}&quot;
               border=&quot;0&quot; /&gt; &lt;/a&gt;&lt;/td&gt;
         &lt;/tr&gt;
      &lt;/g:each&gt;
   &lt;/tbody&gt;
&lt;/table&gt;
</pre><p>Enfin, dans notre méthode du contrôleur on pourra faire usage de <code>render</code> comme ceci :</p><p><code><strong>grails-app/controllers/fr/xebia/nothunes/domain/NavigationController.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
...
   def ajaxFilterTrackByAlbum = {
      def trackList = Track.withCriteria {
         ne('audioPath', 'empty')
         if (params.id) {
            album {
               eq('id', new Long(params.id))
               if (params.band) {
                  band {
                     eq('id', new Long(params.band))
                  }
               }
            }
         }
      }
      render (view:'_trackList', model: [trackList: trackList])
   }
...
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/navig_band.png" border="0" width="600" /></div><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/navig_album.png" border="0" width="600"/></div><p>Ça y est nos internautes peuvent naviguer dans les morceaux uploadés par nos gentils membres, et les télécharger à leur guise.</p><h3><a
name="SprintReview"></a>Sprint Review</h3><p>Nous avons pu voir dans cet épisode que la mise en place de méthodes AJAX est relativement intuitive et rapide. Les 2 cas décrits ici sont déclinables à l&#8217;infini pour répondre à beaucoup de besoins. L&#8217;API Grails est correctement documentée, et la librairie Prototype embarquée par défaut offre des outils plus que suffisant pour manipuler le DOM de la page. Pour ceux qui préférent, il existe les plugins <a
href="http://www.grails.org/plugin/jquery" title="JQuery" >JQuery</a> et <a
href="http://www.grails.org/plugin/jquery-ui" title="JQueryUI" >JQuery-UI</a> pour installer en une commande tous les fichiers au bon endroit.</p><p>Le programme du prochain épisode :</p><div><table
class="tablo" border="0"><thead><th>En tant que &#8230;</th><th>je pourrai &#8230;</th></thead><tbody><tr><td>internaute</td><td>écouter un morceau</td></tr><tr><td>internaute</td><td>rechercher des morceaux par mots-clés</td></tr></tbody></table></div><p>Stay (no)tuned &#8230;</p><h3><a
name="Ressources"></a>Ressources</h3><ul><li><a
href="http://github.com/aurelienmaury/nothunes/tree/v0.3">Tag v0.3 du projet NoThunes sur GitHub</a></li><li><a
href="http://www.grails.org/Ajax" title="Grails  AJAX" >Grails : AJAX</a></li><li><a
href="http://www.grails.org/AJAX-Driven+SELECTs+in+GSP" title="Grails  AJAX driven select" >Grails : AJAX driven select</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/10/07/nothunes-ajax-ification-sauce-grails/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>NoThunes, l&#8217;espace VIP</title><link>http://blog.xebia.fr/2010/09/23/nothunes-lespace-vip/</link> <comments>http://blog.xebia.fr/2010/09/23/nothunes-lespace-vip/#comments</comments> <pubDate>Thu, 23 Sep 2010 13:52:40 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[NoThunes]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5430</guid> <description><![CDATA[Continuons le montage de notre projet OpenSource propulsé par Grails. Au dernier épisode, nous avions démarré le projet, façonné les styles CSS, mis en place la sécurité, mais aussi et surtout, rédigé les classes du modèle de données. Aujourd&#8217;hui nous allons leur donner vie en ajoutant des fonctionnalités aux utilisateurs membres. Nous nous attarderons sur [...]]]></description> <content:encoded><![CDATA[<style type="text/css">table.tablo { border-collapse:collapse; border: 1px solid #6C626C; width:95%; font: normal normal normal 1.1em/normal Arial, sans-serif; } table.tablo thead { background: #EFEFEF; border-bottom: 1px solid #6C626C; border-top: 1px solid #6C626C; color: #4F2F4F; } table.tablo thead th { padding: 5px; } table.tablo tbody tr { border: 1px solid #6C626C; } table.tablo tbody tr td { padding: 5px; }</style><p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/09/nothunes_mini_logo.png" alt="Projet NoThunes" /></p><p>Continuons le montage de notre projet OpenSource propulsé par Grails. Au <a
href="http://blog.xebia.fr/2010/09/09/nothunes-naissance-dun-projet-grails/">dernier épisode</a>, nous avions démarré le projet, façonné les styles CSS, mis en place la sécurité, mais aussi et surtout, rédigé les classes du modèle de données. Aujourd&#8217;hui nous allons leur donner vie en ajoutant des fonctionnalités aux utilisateurs membres.</p><p>Nous nous attarderons sur :</p><ul><li>la gestion du profil utilisateur</li><li>la génération des écrans CRUD de nos données</li><li>leur adaptation à nos &#8216;règles métier&#8217;</li><li>la gestion des upload et download</li></ul><p>Ces étapes peuvent paraître triviales à ceux qui ont déjà une expérience de Grails. Cependant, j&#8217;ai choisi de les traiter malgré tout. J&#8217;ai moi-même perdu trop de temps à chercher des exemples concrets et simples sur la toile pour oser faire l&#8217;impasse dessus. Donc, toi qui débute sur Grails, sois le bienvenu.</p><h3><a
name="Sprintbacklogdtaill"></a>Sprint backlog détaillé</h3><div><table
class="tablo" border="0"><thead><th>En tant que &#8230;</th><th>je dois pouvoir &#8230;</th><th>détail &#8230;</th></thead><tbody><tr><td>membre</td><td>voir et mettre à jour mon profil utilisateur</td><td>Un membre authentifié doit pouvoir modifier son profil, sauf son login et ses rôles.</td></tr><tr><td>membre</td><td>créer/modifier/supprimer des groupes de musiques</td><td>Un membre authentifié doit pouvoir créer des groupes de musique et lister/modifier/supprimer les groupes qu&#8217;il a créés.</td></tr><tr><td>membre</td><td>créer/modifier/supprimer des albums liés à mes groupes</td><td>Si un membre a créé un groupe de musique, il peut créer un album pour ce groupe.</td></tr></tbody></table></div><h3><a
name="Gestionduprofilutilisateur"></a>Gestion du profil utilisateur</h3><h4><a
name="Confirmationdesmodificationsde"></a>Confirmation des modifications de mot de passe</h4><p>Lorsque nos membres pourront mettre à jour leur profil, ils pourront également modifier leur mot de passe. Pour commencer, il faut donc  que nous fassions des adaptations pour ajouter la confirmation du mot de passe dans la gestion des comptes utilisateurs. En deux coups de cuillère à pot, cela donne :</p><ul><li>Ajout d&#8217;un champ <code>confirmPasswd</code> dans la classe de domaine User, et d&#8217;un validateur associé :</li></ul><p><code><strong>grails-app/domain/fr/xebia/nothunes/security/User.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
class User {
   ...
   static transients = ['confirmPasswd']
   ...
   String confirmPasswd
   static constraints = {
      ...
      confirmPasswd(validator :{val, obj -&gt;
         if (obj.properties['passwd'] != val) {
            return 'default.invalid.confirmPasswd.message'
         }
      })
   }
}
</pre><p>Le champ nouvellement créé est passé en <code>transient</code> pour éviter que sa valeur ne soit persistée en base. Notez que la valeur retournée par le validateur est un <code>String</code> correspondant au message d&#8217;erreur à afficher. Par conséquent, il faut ajouter ce message dans les fichiers <code>messages.properties</code> pour avoir l&#8217;affichage de l&#8217;erreur dans les GSP :</p><p><code><strong>grails-app/i18n/messages.properties</strong></code></p><pre class="brush: java; title: ; notranslate">
default.invalid.confirmPasswd.message=Bad password confirmation
</pre><ul><li>Modification du <code>UserController</code> :</li></ul><p>Pour que le champ <code>confirmPasswd</code> soit correctement renseigné avant la validation, il faut aller modifier la classe <code>UserController</code>. Dans les méthodes <code>save()</code> et <code>update()</code>, le champ <code>passwd</code> est chiffré avant sauvegarde en base. Il faut appliquer le même traitement au champ <code>confirmPasswd</code>. De cette façon le validateur fait la comparaison entre les deux champs chiffrés. Si les versions chiffrées sont identiques alors la confirmation du mot de passe est valide, CQFD.</p><p><code><strong>grails-app/controllers/UserController.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
...
// à chaque occurence du chiffrage du champ 'passwd' ...
person.passwd = authenticateService.encodePassword(params.passwd)
// on ajoute le chiffrage du champ 'confirmPasswd'
person.confirmPasswd = authenticateService.encodePassword(params.confirmPasswd)
...
</pre><ul><li>Modification des formulaires de création et d&#8217;édition d&#8217;un User :</li></ul><p>Pour l&#8217;instant les formulaires de création et d&#8217;édition des User ne contiennent pas de champ pour <code>confirmPasswd</code> donc le validateur renvoie toujours une erreur. Il suffit d&#8217;ajouter un champ texte, initialisé avec la valeur du mot de passe.</p><p><code><strong>grails-app/views/user/create.gsp</strong></code> ET <code><strong>grails-app/views/user/edit.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
...
&lt;tr class=&quot;prop&quot;&gt;
   &lt;td valign=&quot;top&quot; class=&quot;name&quot;&gt;&lt;label for=&quot;passwd&quot;&gt;Password:&lt;/label&gt;&lt;/td&gt;
   &lt;td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean:person,field:'passwd','errors')}&quot;&gt;
      &lt;input type=&quot;password&quot; id=&quot;passwd&quot; name=&quot;passwd&quot; value=&quot;${person.passwd?.encodeAsHTML()}&quot;/&gt;
   &lt;/td&gt;
&lt;/tr&gt;
&lt;!-- on ajoute notre champ --&gt;
&lt;tr class=&quot;prop&quot;&gt;
   &lt;td valign=&quot;top&quot; class=&quot;name&quot;&gt;&lt;label for=&quot;confirmPasswd&quot;&gt;Confirm password:&lt;/label&gt;&lt;/td&gt;
   &lt;td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean:person,field:'confirmPasswd','errors')}&quot;&gt;
      &lt;input type=&quot;password&quot; id=&quot;confirmPasswd&quot; name=&quot;confirmPasswd&quot; value=&quot;${person.passwd?.encodeAsHTML()}&quot;/&gt;
   &lt;/td&gt;
&lt;/tr&gt;
...
</pre><h4><a
name="Crationduncontrleurddilafficha"></a>Création d&#8217;un contrôleur dédié à l&#8217;affichage et la mise à jour du profil</h4><p>Maintenant que nous disposons d&#8217;une validation correcte pour la mise à jour des mots de passe, nous pouvons attaquer le cœur du sujet. Pour cela, on crée un nouveau contrôleur grâce à la commande :</p><pre class="brush: java; title: ; notranslate">
grails create-controller fr.xebia.nothunes.profile.Profile
</pre><p>Cela génère une coquille vide nommée <strong><code>ProfileController</code></strong>. Le but de ce contrôleur est de permettre d&#8217;afficher le profil de l&#8217;utilisateur courant et de le mettre à jour. Par conséquent il faut créer les méthodes :</p><ul><li><code>index</code> : qu&#8217;on redirigera vers <code>show</code>. Dans le cas où le contrôleur est appelé sans méthode particulière, c&#8217;est <code>index()</code> qui sera lancé.</li><li><code>show</code> : pour récupérer le compte de l&#8217;utilisateur courant en base et l&#8217;afficher.</li><li><code>edit</code> : pour récupérer le compte de l&#8217;utilisateur courant en base et afficher le formulaire d&#8217;édition.</li><li><code>update</code> : pour persister en base un envoi de formulaire d&#8217;édition. Si la sauvegarde se passe bien, à la fin on redirige vers <code>show()</code> avec un message de succès ; sinon on redirige vers <code>edit()</code> avec un message d&#8217;erreur.</li></ul><p>Conjointement, il nous faut 2 vues :</p><ul><li><code>profile/show.gsp</code> : pour afficher le profil. Elle contient un bouton pour passer en édition.</li><li><code>profile/edit.gsp</code> : pour éditer le profil. Elle contient un formulaire qui pointe sur la méthode <code>update</code> du contrôleur.</li></ul><p>Afin de ne pas trop alourdir ce billet, je vous renvoie au GitHub pour le détail des vues et du contrôleur. Le code est <em>très</em> fortement inspiré de ce qui existe déjà dans le <code>UserController</code> et ses vues.</p><ul><li><a
href="http://github.com/aurelienmaury/nothunes/blob/v0.2/grails-app/controllers/fr/xebia/nothunes/profile/ProfileController.groovy" title="grailsappcontrollersfrxebianothunesprofileProfileControllergroovy" ><code>grails-app/controllers/fr/xebia/nothunes/profile/ProfileController.groovy</code></a></li><li><a
href="http://github.com/aurelienmaury/nothunes/blob/v0.2/grails-app/views/profile/show.gsp" title="grailsappviewsprofileshowgsp" ><code>grails-app/views/profile/show.gsp</code></a></li><li><a
href="http://github.com/aurelienmaury/nothunes/blob/v0.2/grails-app/views/profile/edit.gsp" title="grailsappviewsprofileeditgsp" ><code>grails-app/views/profile/edit.gsp</code></a></li></ul><p>Pour être sûr que l&#8217;utilisateur est authentifié quand il accède au contrôleur, on ajoute dans les règles de sécurité la protection de <code>/profile/*</code> directement dans le bootstrap de l&#8217;application :</p><p><code><strong>grails-app/conf/BootStrap.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
class BootStrap {
   def init = { servletContext -&gt;
      ...
      def protectUserProfileManaging = new RequestMap(url: '/profile/*', configAttribute: 'ROLE_ADMIN,ROLE_USER').save()
   }
   ...
}
</pre><p>Une fois tout ceci fait, il suffit de rajouter le lien vers l&#8217;affichage du profil dans la GSP qui contient le menu pour les membres :</p><p><code><strong>grails-app/views/menu/_user.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
...
   &lt;h1&gt;Member manages ...&lt;/h1&gt;
   &lt;ul&gt;
      &lt;li&gt;&lt;g:link controller=&quot;profile&quot;&gt;your profile&lt;/g:link&gt;&lt;/li&gt;
   &lt;/ul&gt;
...
</pre><p>On redémarre notre application et le tour est joué !</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/09/edit_profil.png" alt="edit_profil" borer="0" title="edit_profil" width="600px" /></div><h3><a
name="GestiondesCRUDmtierslesclasses"></a>Gestion des CRUD métiers : les classes Band et Album</h3><p>Attaquons maintenant la gestion des CRUD de nos objets métiers. Premier de la liste : Band. Pour rappel, cette classe représente un groupe de musique géré par un utilisateur membre. Un membre doit pouvoir créer des groupes et modifier uniquement ceux qu&#8217;il a créé. Pour avoir un petit rappel sur le contenu de la classe Band, <a
href="http://github.com/aurelienmaury/nothunes/blob/master/grails-app/domain/fr/xebia/nothunes/domain/Band.groovy" title="voir sur le GitHub" >voir sur le GitHub</a>. Grails nous offre un démarrage rapide en générant les vues et le contrôleur à partir de la classe de domaine avec la commande :</p><pre class="brush: java; title: ; notranslate">
grails generate-all fr.xebia.nothunes.domain.Band
</pre><p>Le contrôleur et les vues générés sont génériques et doivent être adaptés pour nos besoins particuliers. Ces fonctionnalités doivent être réservées aux membres, donc on ajoute dans le bootstrap les règles de sécurité pour protéger le contrôleur :</p><p><code><strong>grails-app/conf/BootStrap.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
class BootStrap {
   def init = { servletContext -&gt;
      ...
      def protectUserProfileManaging = new RequestMap(url: '/band/*', configAttribute: 'ROLE_ADMIN,ROLE_USER').save()
   }
   ...
}
</pre><p>Ensuite il faut rajouter des contrôles métier pour permettre aux membres de ne lister, visualiser et modifier que les <code>Band</code> qu&#8217;ils ont créés. Pour cela, on va s&#8217;appuyer sur l&#8217;appartenance de la classe <code>Band</code> à un User (lien <code>belongsTo</code>). Pour commencer, la méthode <code>list</code> ne doit afficher que les groupes dont l&#8217;utilisateur est propriétaire :</p><p><code><strong>grails-app/controllers/fr/xebia/nothunes/domain/BandController.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
...
def list = {
   params.max = Math.min(params.max ? params.int('max') : 10, 100)
   def owner = User.get(authenticateService.userDomain().id)
   [bandInstanceList: Band.findAllByOwner(owner, params), bandInstanceTotal: Band.count()]
}
...
</pre><p>Ensuite, lors d&#8217;une sauvegarde, on doit définir le propriétaire du Band avant la sauvegarde</p><p><code><strong>grails-app/controllers/fr/xebia/nothunes/domain/BandController.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
...
def save = {
   def bandInstance = new Band(params)
   // on définit le propriétaire du Band
   bandInstance.owner = User.get(authenticateService.userDomain().id)
   ...
}
...
</pre><p>Enfin, à l&#8217;entrée des méthodes <code>show</code>, <code>edit</code> et <code>update</code> du <code>BandController</code> on teste la légitimité de l&#8217;utilisateur courant à agir sur le <code>Band</code> demandé de la façon suivante :</p><p><code><strong>grails-app/controllers/fr/xebia/nothunes/domain/BandController.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
...
def show = {
   def bandInstance = Band.get(params.id)
   // on recupere le user courant
   def currentUser = User.get(authenticateService.userDomain().id)
   // s'il existe et qu'il est propriétaire du Band demandé, on autorise la suite
   if (bandInstance &amp;&amp; currentUser &amp;&amp; bandInstance.owner == currentUser) {
      [bandInstance: bandInstance]
   } else {
   // sinon on affiche un message et on le renvoie sur la liste de ses propres groupes
      flash.message = &quot;${message(code: 'default.not.found.message', args: [message(code: 'band.label', default: 'Band'), params.id])}&quot;
      redirect(action: &quot;list&quot;)
   }
}
...
</pre><p>Et, touche finale, on ajoute le lien vers la gestion des <code>Band</code> dans le menu utilisateur :</p><p><code><strong>grails-app/views/menu/_user.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
...
   &lt;h1&gt;Member manages ...&lt;/h1&gt;
   &lt;ul&gt;
      &lt;li&gt;&lt;g:link controller=&quot;profile&quot;&gt;your profile&lt;/g:link&gt;&lt;/li&gt;
      &lt;li&gt;&lt;g:link controller=&quot;band&quot;&gt;your bands&lt;/g:link&gt;&lt;/li&gt;
   &lt;/ul&gt;
...
</pre><p>La technique est la même pour les Albums :</p><ul><li>génération des vues et du contrôleur</li><li>protection par les règles de sécurité</li><li>ajout de contrôles métier pour filtrer les actions utilisateurs</li></ul><p>Pour le détail du code tournant autour des Albums, faites un tour par le <a
href="http://github.com/aurelienmaury/nothunes/tree/v0.2" title="GitHub" >GitHub</a>.</p><h3><a
name="UploadduneimagelogopourlesBand"></a>Upload d&#8217;une image logo pour les <code>Band</code></h3><p>Pour rendre notre gestion de Band un peu plus sexy, on y ajoute l&#8217;upload d&#8217;une image qui servira de logo. Rien de plus facile. Nous commençons par ajouter dans la configuration de l&#8217;application un chemin vers un répertoire de stockage :</p><p><code><strong>grails-app/conf/Config.groovy</strong></code></p><pre class="brush: java; title: ; notranslate">
...
storage.image.directory='/tmp/nothunes_images/'
...
</pre><p>Pour pouvoir réutiliser la méthode d&#8217;upload de fichier, on crée un service grails dédié :</p><pre class="brush: java; title: ; notranslate">
grails create-service fr.xebia.nothunes.upload.Upload
</pre><p>Puis on crée une méthode <code>saveImage</code>, qui s&#8217;occupe de vérifier le type mime du fichier soumis, et de le stocker dans le répertoire défini dans la <code>Config</code> de l&#8217;application.</p><pre class="brush: java; title: ; notranslate">
class UploadService {
   def authorizedImageContentType = [ 'image/jpeg' :'jpg', 'image/gif' :'gif', 'image/png' :'png']
   def grailsApplication
   def saveImageFile(anImageFile, name) {
      if (!anImageFile.empty) {
         FileNameMap fileNameMap = URLConnection.getFileNameMap();
         def contentType = fileNameMap.getContentTypeFor(anImageFile.originalFilename)
         if ( authorizedImageContentType.keySet().contains(contentType) ) {
            File storageDir = new File(grailsApplication.config.storage.image.directory)
            if (!storageDir.exists()) {
               if (!storageDir.mkdir()) {
                  log.error 'Directory does not exist and cannot be created '+grailsApplication.config.storage.image.directory
                  return false
               }
            }
            // Pour un minimum de standardisation, on génère le nom du fichier à enregistré à partir du paramètre
            // 'name' et du type mime
            def targetFilename = name + '_logo.' + authorizedImageContentType[contentType]
            // sauvegarde du fichier
            anImageFile.transferTo( new File(grailsApplication.config.storage.image.directory + targetFilename) )
            return targetFilename
         } else {
            log.debug 'Someone tried to upload a non-image file : '+contentType
            return false
         }
      } else {
         return false
      }
   }
}
</pre><p>Ensuite on modifie nos GSP de création et d&#8217;édition pour ajouter un champ de type <code>file</code> et faire des formulaires multipart :</p><p><code><strong>grails-app/views/band/create.gsp</strong></code> ET <code><strong>grails-app/views/band/edit.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;!-- Ici on rajoute le enctype --&gt;
&lt;g:form action=&quot;save&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
...
   &lt;tr class=&quot;prop&quot;&gt;
      &lt;td valign=&quot;top&quot; class=&quot;name&quot;&gt;
         &lt;label for=&quot;logoPath&quot;&gt;&lt;g:message code=&quot;band.logoPath.label&quot; default=&quot;Logo Path&quot; /&gt;&lt;/label&gt;
      &lt;/td&gt;
      &lt;td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean: bandInstance, field: 'logoPath', 'errors')}&quot;&gt;
         &lt;!-- et là un input file --&gt;
         &lt;input type=&quot;file&quot; name=&quot;logoFile&quot;/&gt;
      &lt;/td&gt;
   &lt;/tr&gt;
...
&lt;/g:form&gt;
</pre><p>A la soumission du formulaire, on peut désormais récupérer le fichier et le passer à notre service de sauvegarde en appelant :</p><pre class="brush: java; title: ; notranslate">
uploadService.saveImageFile(request.getFile('logoFile'), bandInstance.name)
</pre><p>Le paramètre passé à la méthode <code>request.getFile()</code> correspond à l&#8217;attribut <code>name</code> du champ input de notre formulaire. Encore une fois pour le code complet, voir le <a
href="http://github.com/aurelienmaury/nothunes/tree/v0.2" title="GitHub" >GitHub</a>. Il va de soi que ce code n&#8217;est pas en l&#8217;état complet, et qu&#8217;il faut lui ajouter des fonctionnalités techniques. Par exemple, pour supprimer les fichiers lors d&#8217;un changement d&#8217;image, ou dans d&#8217;autres cas tordus. La plupart de ces cas sont traités dans le code du projet. Je vous laisse lire le détail de l&#8217;implémentation directement dans le code, cet article étant déjà assez (trop ?) verbeux. <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/09/band_created.png" alt="band_created" title="band_created" width="600px" /></div><h3><a
name="Contrleurdetlchargement"></a>Contrôleur de téléchargement</h3><p>Nos images sont maintenant dans le répertoire dédié au stockage, mais on ne peut pas les afficher en faisant un lien directement dans nos pages, puisqu&#8217;elles sont en dehors de l&#8217;arborescence du site. Pour pallier ce problème, on crée un nouveau contrôleur, dédié au téléchargement des images. Le but est de pouvoir insérer dans nos GSP des tag <code>&lt;img/&gt;</code> avec un attribut <code>src="..."</code> pointant sur notre contrôleur. Encore une fois la méthode est assez directe :</p><ul><li>création d&#8217;un <code>DlController</code> :</li></ul><pre class="brush: java; title: ; notranslate">
grails create-controller fr.xebia.nothunes.Dl
</pre><ul><li>création d&#8217;une méthode <code>images</code> pour servir l&#8217;image en fonction des paramètres de requête :</li></ul><pre class="brush: java; title: ; notranslate">
class DlController {
   def images = {
      String filename = params.id
      log.debug &quot;dl image file : ${filename}&quot;
      def file = new File(grailsApplication.config.storage.image.directory + filename)
      if (file.exists()) {
         response.setContentType(&quot;application/octet-stream&quot;)
         response.setHeader(&quot;Content-Disposition&quot;, &quot;attachment; filename=${filename}&quot;)
         response.setContentLength(file.readBytes().size())
         response.getOutputStream() &lt;&lt; file.readBytes()
      }
      response.flush()
   }
}
</pre><p>Nous pouvons maintenant afficher l&#8217;image en créant un lien vers ce contrôleur :</p><p><code><strong>grails-app/views/band/show.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
...
&lt;img src=&quot;${createLink(controller:'dl', action:'images', params: [id: bandInstance.logoPath])}&quot;/&gt;
...
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/09/album_created.png" alt="album_created" title="album_created" width="600px"/></div><h3><a
name="Sprintreview"></a>Sprint review</h3><p>Comme je l&#8217;avais annoncé dans l&#8217;intro, ce billet est certainement plus intéressant pour ceux qui débutent avec Grails. Nous avons pu voir une méthode de création d&#8217;un contrôleur de bout en bout, et une façon simple de stocker et servir des fichiers à l&#8217;extérieur de l&#8217;arborescence du site. Retenez que les vues et contrôleurs générés par Grails sont très ouverts, il faut donc bien se souvenir de systématiquement :</p><ul><li>les protéger en rajoutant de filtres URL dans le bootstrap</li><li>ajouter les contrôles métiers si besoin dans le code du contrôleur</li><li>nettoyer les vues des informations techniques, superflues pour les utilisateurs</li></ul><p>Mission accomplie : le sprint backlog est bouclé et notre projet est livrable à la fin du sprint, ce qui reste un point crucial. Au prochain épisode, on va s&#8217;occuper des classes Tracks et de la navigation pour les internautes, le tout en utilisant massivement AJAX.</p><h3><a
name="Ressources"></a>Ressources</h3><ul><li><a
href="http://github.com/aurelienmaury/nothunes/tree/v0.2" title="Dpt GitHub du projet version 02" >Dépôt GitHub du projet, version 0.2</a></li><li><a
href="http://grails.org/File+Upload" title="Grails File upload" >Grails File upload</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/09/23/nothunes-lespace-vip/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>NoThunes, naissance d&#8217;un projet Grails</title><link>http://blog.xebia.fr/2010/09/09/nothunes-naissance-dun-projet-grails/</link> <comments>http://blog.xebia.fr/2010/09/09/nothunes-naissance-dun-projet-grails/#comments</comments> <pubDate>Thu, 09 Sep 2010 06:19:24 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[NoThunes]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5333</guid> <description><![CDATA[Les exemples de prise en main du framework Grails ne manquent pas sur la toile. Nous allons tenter de dépasser les Getting started en déroulant la réalisation d&#8217;une application web de bout en bout : Conception Réalisation Mise en production Evolutions et maintenance Parce qu&#8217;il est toujours plus agréable de travailler sur du concret, nous [...]]]></description> <content:encoded><![CDATA[<style type="text/css">table.tablo { border-collapse:collapse; border: 1px solid #6C626C; width:80%; font: normal normal normal 1.1em/normal Arial, sans-serif; } table.tablo thead { background: #EFEFEF; border-bottom: 1px solid #6C626C; border-top: 1px solid #6C626C; color: #4F2F4F; } table.tablo thead th { padding: 5px; } table.tablo tbody tr { border: 1px solid #6C626C; } table.tablo tbody tr td { padding: 5px; }</style><p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2010/09/nothunes_mini_logo.png" alt="Projet NoThunes" /></p><p>Les exemples de prise en main du framework Grails ne manquent pas sur la toile. Nous allons tenter de dépasser les <em>Getting started</em> en déroulant la réalisation d&#8217;une application web de bout en bout :</p><ul><li>Conception</li><li>Réalisation</li><li>Mise en production</li><li>Evolutions et maintenance</li></ul><p>Parce qu&#8217;il est toujours plus agréable de travailler sur du concret, nous allons réaliser pas à pas une plateforme de musique libre en ligne, que nous baptisons : <strong>Projet NoThunes</strong>, en clin d&#8217;oeil à une autre célèbre plateforme de musique payante. Tout le code du projet est <a
title="disponible sur GitHub" href="http://github.com/aurelienmaury/nothunes">disponible sur GitHub</a>.  Ce projet est donc Open Source mais aussi &laquo;&nbsp;Open méthode&nbsp;&raquo; puisque je vous ferai partager toutes les étapes de conception/réalisation au travers d&#8217;une série d&#8217;article. Chaque article sera associé à un tag du dépôt GitHub, pour que tout le monde puisse savoir à quelle version on se réfère.</p><p>Bien évidemment il y a plus d&#8217;une bonne façon de faire. Ce projet est mené dans une optique d&#8217;amélioration personnelle et de partage donc n&#8217;hésitez pas à discuter les choix techniques et à fournir des solutions alternatives en commentaire.</p><p>Dans ce premier billet, nous allons :</p><ul><li>définir le product backlog du projet</li><li>présenter les classes du modèle</li><li>démarrer notre projet</li><li>mettre en place la sécurité et les classes du modèle</li><li>créer un menu dynamique, différencié par rôle utilisateur</li></ul><h3><a
name="NoteTechnique"></a>Note technique</h3><p>Le projet est réalisé avec <a
title="Grails v133" href="http://grails.org/dist/grails-1.3.3.zip">Grails v1.3.3</a>.</p><h3><a
name="ProductBacklog"></a>Product Backlog</h3><p>On distingue 3 rôles utilisateurs :</p><ul><li><strong>les administrateurs :</strong> par définition omnipotents sur le site pour gérer les comptes utilisateurs, les règles de sécurité, etc.</li><li><strong>les internautes :</strong> les visiteurs lambda de notre site.</li><li><strong>les membres :</strong> des internautes qui se seront enregistrés pour accéder à plus de fonctionnalités.</li></ul><p>En sachant qu&#8217;un membre, s&#8217;il est authentifié, doit conserver l&#8217;accès à toutes les fonctionnalités des internautes, et qu&#8217;un administrateur doit aussi avoir accès aux fonctionnalités des membres.</p><p>Le product backlog est trié par business value décroissante. Je vous épargne le chiffrage agile et les fioritures de Scrum. <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><div><table
class="tablo" border="0"><thead><th>En tant que &#8230;</th><th>je dois pouvoir &#8230;</th></thead><tbody><tr><td>administrateur</td><td>créer des comptes utilisateurs (administrateurs et membres)</td></tr><tr><td>internaute</td><td>m&#8217;enregistrer pour obtenir un compte membre</td></tr><tr><td>membre</td><td>voir et mettre à jour mon profil utilisateur</td></tr><tr><td>membre</td><td>créer des groupes de musique</td></tr><tr><td>membre</td><td>modifier/supprimer les groupes de musique que j&#8217;ai créé</td></tr><tr><td>membre</td><td>créer/modifier/supprimer des albums liés à mes groupes</td></tr><tr><td>membre</td><td>créer/modifier/supprimer des morceaux liés à mes albums, en uploadant un fichier mp3</td></tr><tr><td>internaute</td><td>naviguer dans la hiérarchie de groupes/albums/morceaux</td></tr><tr><td>internaute</td><td>télécharger un morceau</td></tr><tr><td>internaute</td><td>écouter un morceau</td></tr><tr><td>internaute</td><td>rechercher des morceaux par mots-clés</td></tr></tbody></table></div><h3><a
name="Prsentationdumodlededonnes"></a>Présentation du modèle de données</h3><p>Il s&#8217;agit d&#8217;un cas d&#8217;école donc nous simplifions à l&#8217;extrême le modèle de données à gérer. Le but n&#8217;est pas (encore <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) de concurrencer les plateformes en place. On considère donc les objets :</p><div><table
class="tablo" border="0"><thead><th>Entité</th><th>représente &#8230;</th></thead><tbody><tr><td>Role</td><td>les rôles utilisateurs</td></tr><tr><td>User</td><td>les comptes utilisateurs administrateurs et membres</td></tr><tr><td>Band</td><td>un groupe de musique, créé par un membre</td></tr><tr><td>Album</td><td>un album enregistré par un groupe</td></tr><tr><td>Track</td><td>un morceau, une piste d&#8217;un Album</td></tr></tbody></table></div><p>Les attributs de chacun de ces objets sont volontairement simplistes. Cela nous donne le modèle suivant :</p><div><img
title="NoThunes" src="http://blog.xebia.fr/wp-content/uploads/2010/09/NoThunes.png" alt="NoThunes" /></div><h3><a
name="Dmarrageduprojet"></a>Démarrage du projet</h3><p>Comme tous ceux qui ont déjà survolé Grails le savent, un nouveau projet démarre toujours par le lancement de la commande :</p><pre class="brush: java; title: ; notranslate">
grails create-app nothunes
</pre><p>qui va générer l&#8217;arborescence initiale du projet. Comme c&#8217;est toujours plus confortable, l&#8217;étape suivante sera d&#8217;importer ce projet dans votre IDE favori. Pour travailler avec Grails le choix est limité et le support inégal : <a
title="NetBeans" href="http://www.netbeans.org/">NetBeans</a>, <a
title="SpringSource Tool Suite" href="http://www.springsource.com/products/sts">SpringSource Tool Suite</a> ou <a
title="IntelliJ IDEA" href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a>. Au pire un <a
title="bon vieux vim" href="http://www.vim.org/scripts/script.php?script_id=3120">bon vieux vim</a> suffira.</p><h4><a
name="Miseenplacedelascurit"></a>Mise en place de la sécurité</h4><p>Le plugin de sécurité officiel du projet Grails est depuis peu le <a
title="Spring Security Core Plugin" href="http://grails.org/plugin/spring-security-core">Spring Security Core Plugin</a>, couplé au plugin <a
title="Spring Security UI" href="http://grails.org/plugin/spring-security-ui">Spring Security UI</a> pour la génération des écrans de CRUD concernant les rôles et utilisateurs. Malgré cela, je lui préfère encore pour quelques temps son prédécesseur : <a
title="Acegi Plugin" href="http://www.grails.org/plugin/acegi">Acegi Plugin</a>, dont le développement a été stoppé, mais qui est plus complet et plus simple à mettre en place. D&#8217;autre part, le côté stable du plugin Acegi, comparé au développement hyperactif des plugins Spring Security est assez confortable pour notre projet.</p><p>Je vous renvoie donc au <a
title="prcdent article" href="http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/">précédent article</a> que j&#8217;ai écrit sur le sujet. Le package de base à utiliser est : <code>fr.xebia.nothunes</code>.</p><h4><a
name="Crationdesclassesdumodle"></a>Création des classes du modèle</h4><p>Maintenant que nous avons les classes utiles pour la gestion des utilisateurs et de la sécurité, ajoutons un peu de métier dans tout ça. Pour cela on utilise la commande <a
title="grails createdomainclass" href="http://www.grails.org/GORM+-+Creating+a+domain+class"><code>grails create-domain-class</code></a> pour chacune des entités qu&#8217;on souhaite obtenir, puis on passe en édition dessus pour ajouter les attributs. Je trouve dommage de n&#8217;avoir pas plus poussé la ressemblance avec Ruby on Rails en autorisant l&#8217;ajout des attributs directement en paramètre de la ligne de commande.</p><p>Parmi les attributs que l&#8217;on donne à chaque classe, il y en a 2 qui sont partout et bien utiles : <code>lastUpdated</code> et <code>dateCreated</code>. Ces 2 attributs indiquent à GORM qu&#8217;il faut gérer le <a
title="timestamping automatique" href="http://www.grails.org/GORM+-+Events">timestamping automatique</a> des objets qui les possèdent.</p><h3><a
name="Dynamisonslemenu"></a>Dynamisons le menu</h3><p>La documentation du plugin Acegi n&#8217;en parle pas mais si vous téléchargez les sources du plugin et que vous allez voir le fichier <code>grails-app/taglib/org/grails/plugins/springsecurity/taglib/AuthorizeTagLib.groovy</code> vous tombez alors sur une taglib tout à fait disponible dès que vous faites usage de ce plugin dans votre projet, et qui offre les tags suivants :</p><ul><li>ifAllGranted</li><li>ifNotGranted</li><li>ifAnyGranted</li><li>loggedInUserInfo</li><li>isLoggedIn</li><li>isNotLoggedIn</li><li>loggedInUsername</li></ul><p>Nous allons baser la différenciation des menus sur ces tags qui permettent de tester, directement dans les GSP si l&#8217;utilisateur courant possède un rôle donné ou non.</p><p>La première étape est de séparer le contenu du menu dans un fichier GSP à part. Pour l&#8217;instant notre application est telle que générée par grails. Dans le fichier <code>grails-app/views/index.gsp</code> se trouve la page d&#8217;accueil par défaut. Elle contient une balise <code>&lt;div id="nav"/&gt;</code> qui encapsule le menu de gauche de la page d&#8217;accueil de l&#8217;application.</p><p>Pour ajouter plus de flexibilité, on sort cette div dans un nouveau fichier qu&#8217;on va placer dans <strong><code>grails-app/views/menu/_nav.gsp</code></strong> (après avoir créé le répertoire menu bien sûr), puis on remplace dans index.gsp la présence de cette div par un tag</p><pre class="brush: java; title: ; notranslate">
&lt;g:render template=&quot;menu/nav&quot;/&gt;
</pre><p>Si vous lancez un <code>grails run-app</code> et que vous allez voir la page d&#8217;accueil vous remarquerez que rien n&#8217;a changé. Le paramètre passé au tag <code>render</code> indique d&#8217;inclure le code du fichier GSP situé dans le répertoire <strong>menu/</strong> et nommé <code>_nav.gsp</code> (le caractère est indispensable en début de nom).</p><p>Ce découpage, allié aux tags du plugin Acegi, nous conduit à un joli découpage propre :</p><p><code><strong>grails-app/views/menu/_nav.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;div id=&quot;nav&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Welcome,&lt;/li&gt;
	&lt;li&gt;Logout&lt;/li&gt;
	&lt;li&gt;Login&lt;/li&gt;
	&lt;li&gt;No account ? : Register&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;homePagePanel&quot;&gt;
&lt;div class=&quot;panelBody&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</pre><p><code><strong>grails-app/views/menu/_admin.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;h1&gt;Admin manages ...&lt;/h1&gt;
&lt;ul&gt;
	&lt;li&gt;roles&lt;/li&gt;
	&lt;li&gt;users&lt;/li&gt;
	&lt;li&gt;requestMaps&lt;/li&gt;
&lt;/ul&gt;
</pre><p><code><strong>grails-app/views/menu/_user.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;h1&gt;Member manages ...&lt;/h1&gt;
&lt;ul&gt;
	&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
</pre><p><code><strong>grails-app/views/menu/_all.gsp</strong></code></p><pre class="brush: java; title: ; notranslate">
&lt;h1&gt;Menu&lt;/h1&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;${createLinkTo(dir:'')}&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre><p>Maintenant il suffira d&#8217;utiliser le tag <code>&lt;g:render template="menu/nav" /&gt;</code> directement dans le layout global pour appliquer le menu sur toute notre application, et on a maintenant un fichier GSP par section de menu avec juste ce qu&#8217;il faut de tag de sécurité pour gérer l&#8217;affichage contextuel.</p><p>Après ce découpage, j&#8217;ai travaillé un peu le layout et la css afin d&#8217;avoir toutes les pages aux couleurs du projet, c&#8217;est toujours plus agréable pour travailler. Pour éviter de surcharger cet article, si vous voulez voir le détail complet du travail de mise en forme, reportez vous au <a
title="GitHub du projet" href="http://github.com/aurelienmaury/nothunes">GitHub du projet</a>.</p><h3><a
name="Debriefing"></a>Debriefing</h3><p>Voilà un bon démarrage pour notre plateforme de musique. Le projet est lancé et nous pouvons travailler dans de bonnes conditions pour la suite. L&#8217;état du product backlog :</p><div><table
class="tablo" border="0"><thead><th>En tant que &#8230;</th><th>je peux déjà &#8230;</th></thead><tbody><tr><td>administrateur</td><td>créer des comptes utilisateurs (administrateurs et membres)</td></tr><tr><td>internaute</td><td>m&#8217;enregistrer pour obtenir un compte membre</td></tr></tbody></table></div><p>Notre projet est déjà livrable en production avec ces fonctionnalités.</p><div><img
src="http://blog.xebia.fr/wp-content/uploads/2010/09/home_page.png" border="0" alt="" width="600px" /></div><p>A bientôt pour le prochain épisode :</p><div><table
class="tablo" border="0"><thead><th>En tant que &#8230;</th><th>je pourrai &#8230;</th></thead><tbody><tr><td>membre</td><td>voir et mettre à jour mon profil utilisateur</td></tr><tr><td>membre</td><td>créer des groupes de musique</td></tr><tr><td>membre</td><td>modifier/supprimer les groupes de musique que j&#8217;ai créé</td></tr><tr><td>membre</td><td>créer/modifier/supprimer des albums liés à mes groupes</td></tr></tbody></table></div><h3><a
name="Ressources"></a>Ressources</h3><ul><li><a
title="Site officiel de Grails" href="http://www.grails.org/">Site officiel de Grails</a></li><li><a
title="Dpt GitHub du projet NoThunes" href="http://github.com/aurelienmaury/nothunes">Dépôt GitHub du projet NoThunes</a></li><li><a
title="Tag de la version dcrite dans ce billet" href="http://github.com/aurelienmaury/nothunes/tree/v0.1">Tag de la version décrite dans ce billet</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/09/09/nothunes-naissance-dun-projet-grails/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/</link> <comments>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#comments</comments> <pubDate>Tue, 29 Jun 2010 05:50:07 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Gorm]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[MuleSoft]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[Tomcat Stats]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4971</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Outils Helios, Eclipse 3.6 SOA Tomcat Stats: administrer Tomcat depuis son iPhone Le coin de la technique Articles sur Groovy/Spring et Grails/Hibernate Un nouveau top 10 orienté performance Agilité Happy birthday Post-It ! Outils Helios, Eclipse 3.6 Après avoir épuisé les principales lunes de [...]]]></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" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Outils</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HeliosEclipse">Helios, Eclipse 3.6</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#SortiedeTomcatStatsladministra">Tomcat Stats: administrer Tomcat depuis son iPhone</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#ArticlessurGroovySpringetGrail">Articles sur Groovy/Spring et Grails/Hibernate</a></li><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#Unnouveautoporientperformance">Un nouveau top 10 orienté performance</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HappybirthdayPostIt">Happy birthday Post-It !</a></li></ul><h3><a
name="Outils"></a>Outils</h3><h4><a
name="HeliosEclipse"></a>Helios, Eclipse 3.6</h4><p>Après avoir épuisé les principales lunes de Jupiter (Callisto, Europa, Ganymède, Galileo), voici venu le tour d&#8217;<a
title="Helios" href="http://www.eclipse.org/">Helios</a> pour incarner la version annuelle d&#8217;Eclipse. Cette livraison ne contient pas moins de 39 projets de la fondation Eclipse et les supports pour Windows7, Ubuntu 10.04 et PowerPC 64 bit ont été ajoutés.</p><p>Pour ceux qui aiment ajouter une multitude de plugins à leur Eclipse, au lieu de passer par le &laquo;&nbsp;Install new software&#8230;&nbsp;&raquo;, un lien direct vers le Marketplace permet très facilement d&#8217;installer ces plugins, un peu à la manière d&#8217;un plugin Firefox (tout comme le redémarrage obligatoire). L&#8217;ancienne méthode marche toujours pour les applications qui ne se trouvent pas sur le Marketplace. Et sûrement que les fans de DVCS (Distributed Version Control System) vont se précipiter sur le plugin EGit/JGit pour gérer ses sources sous Git, JGit étant l&#8217;implémentation <em>full java</em> utilisée également sur d&#8217;autre projets alors qu&#8217;EGit est sa surcouche pour Eclipse. Le résultat est assez prometteur.</p><p>En ce qui concerne uniquement Java, quelques petites améliorations ont été apportées:</p><ul><li>Les options du <em>formatter</em> acceptent plus de sémantiques comme les annotations, la déclaration de méthodes ou la possibilité de désactiver le <em>formatter</em> d&#8217;une partie du code (intéressant pour aider des merges compliqués).</li><li>Les fonctionnalités sur le breakpoint, comme l&#8217;ajout d&#8217;une condition ou le compteur, sont à présent directement accessibles dans le panel <em>breakpoints</em> et non plus en passant par un menu contextuel dans le code.</li></ul><p>La version 3.7 devrait surtout se concentrer sur Java7. Ian Bull d&#8217;Eclipse propose un <a
title="top ten" href="http://eclipsesource.com/blogs/2010/06/23/top-10-eclipse-helios-features/">top ten</a> intéressant pour faire le tour des fonctionnalités. Arrive en tête l&#8217;application Xtext qui permet d&#8217;écrire son propre DSL puis de générer à partir de celui-ci son propre éditeur Eclipse contenant la complétion et différents outils pour coder dans ce nouveau langage. Une affaire à suivre.</p><p>Mais malgré toutes les nouvelles fonctionnalités, Helios sera surtout scruté pour les multiples bugs corrigés, sa gourmandise en RAM et sa stabilité, ce que seule une pratique intensive pourra valider. Alors à vos souris !</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SortiedeTomcatStatsladministra"></a>Tomcat Stats: administrer Tomcat depuis son iPhone</h4><p><a
title="MuleSoft" href="http://www.mulesoft.com">MuleSoft</a>, plus connu pour son ESB Open Source <a
title="Mule" href="http://www.mulesoft.com/mule-esb-open-source-esb">Mule</a>, a récemment annoncé la sortie de <a
title="Tomcat Stats" href="http://www.mulesoft.com/mulesoft-introduces-iphone-app-apache-tomcat">Tomcat Stats</a>, la première application de monitoring Tomcat pour iPhone. Cette application gratuite vient enrichir l&#8217;<a
title="offre de support" href="http://www.mulesoft.com/free-apache-tomcat-support">offre de support</a> également gratuite, proposée par MuleSoft depuis maintenant presque une année. L&#8217;application permet à un administrateur de gérer à distance plusieurs instances de Tomcat, qu&#8217;elles soient installées au sein de l&#8217;infrastructure propre de l&#8217;entreprise ou dans le Cloud. L&#8217;ensemble des informations critiques des serveurs administrés pourra alors être consulté depuis l&#8217;application, notamment l&#8217;utilisation mémoire, les statistiques sur le traffic Web, ainsi que le statut du serveur.</p><p>Pour télécharger l&#8217;application, rien de plus simple il suffit de se rendre sur l&#8217;App Store, directement depuis son mobile, ou sur iTunes à l&#8217;adresse suivante : <a
title="Tomcat Stats By MuleSoft Inc" href="http://itunes.apple.com/us/app/tomcat-stats/id376646649?mt=8">Tomcat Stats By MuleSoft Inc.</a></p><p>Bien qu&#8217;un peu gadget, et pas vraiment indispensable, cette application iPhone offrira toujours aux administrateurs la possibilité de prolonger leur pause café sans avoir à culpabiliser.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="ArticlessurGroovySpringetGrail"></a>Articles sur Groovy/Spring et Grails/Hibernate</h4><p><a
title="IBM developerWorks" href="http://www.ibm.com/developerworks/">IBM developerWorks</a> nous a récemment gratifié d&#8217;un  article en 2 parties intitulé &laquo;&nbsp;GroovierSpring&nbsp;&raquo;.  Dans <a
title="la premire partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring1.html">la première partie</a>, nous  apprenons à définir des beans Spring en Groovy. Quatre méthodes  sont à notre disposition:</p><ul><li>Utilisation de classes Groovy compilées en .class normaux</li><li>Utilisation de classes Groovy directement sous forme de .groovy</li><li>Utilisation de  scripts Groovy en ligne,  écrits dans la configuration Spring</li><li>Utilisation  de <a
title="Bean Builder" href="http://www.grails.org/Spring+Bean+Builder">Bean Builder</a> de Grails</li></ul><p>Cette  dernière possibilité permet de créer des beans dynamiquement, à  partir de code Groovy. Cela  sous entend que l&#8217;on peut, par le code, adapter les beans obtenus selon le contexte, les créer en utilisant des boucles, de la  logique&#8230; C&#8217;est d&#8217;ailleurs une solution utilisée dans Grails.</p><p>Une  fois les beans correctement  définis, nous pouvons les utiliser comme n&#8217;importe quel bean Java  défini plus classiquement. Le fait que les beans soient à  l&#8217;origine en Groovy est  complètement transparent à l&#8217;application.<br
/> <a
title="La seconde partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring2.html">La seconde partie</a> de l&#8217;article  va plus loin en explorant le rechargement à chaud des beans Groovy. C&#8217;est une plus-value  importante: qui n&#8217;a jamais rêvé de pouvoir changer facilement certains  bouts de code soumis aux désirs changeants des clients (ou à des bugs récurrents  !) ? De plus, l&#8217;article propose une implémentation permettant de  stocker son code Groovy en  base de donnée, car il n&#8217;est pas toujours évident d&#8217;accéder au système  de fichier des applications en production. C&#8217;est une idée assez peu  conventionnelle ! D&#8217;ailleurs, le paragraphe de fin, intitulé &laquo;&nbsp;When Groovy scripts go bad&nbsp;&raquo;,  constitue une mise en garde pour ne pas abuser de ces possibilités, et  être conscient des problèmes de sécurité soulevés.</p><p>Tant que nous  somme dans le monde de Groovy,  il nous semble intéressant de vous indiquer un article <a
title="du blog de SpringSource" href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/">du blog de SpringSource</a> qui s&#8217;intitule &laquo;&nbsp;GORM Gotchas (Part 1)&nbsp;&raquo;. Il pointe du  doigt des comportements de GORM (la couche de  persistance de Grails basée sur Hibernate) pouvant sembler bizarres. Les habitués d&#8217;Hibernate n&#8217;apprendront pas grand choses, mais l&#8217;article éclairera sans doutes  ceux qui, attirés par la simplicité de Grails, se sont  mis à l&#8217;utiliser sans expérience préalable d&#8217;Hibernate. Ils comprendront ainsi pourquoi leurs objets ne sont pas toujours sauvegardés immédiatement malgré un appel à &laquo;&nbsp;save()&nbsp;&raquo;, et pourquoi ils le sont parfois en l&#8217;absence d&#8217;appel à cette même méthode. <a
title="Un autre article" href="http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/">Un autre article</a> traitant de Grails et Hibernate nous vient de Ted Naleid.  Celui-ci explique comment il a pu améliorer les performances de son batch en <em>flushant</em> la session Hibernate et en vidant une Map de validation utilisée par Grails en interne. Ces 2 opérations exécutées régulièrement au cours du batch lui ont permis de démultiplier les performances. Grails s&#8217;appuie sur Hibernate, et il est parfois bon de se remémorer le fonctionnement de celui-ci pour expliquer et remédier à des problèmes observés coté Grails !</p><h4><a
name="Unnouveautoporientperformance"></a>Un nouveau top 10 orienté performance</h4><p>Ce top10 se trouve <a
title="sur le blog de lditeur Dynatrace" href="http://blog.dynatrace.com/2010/06/15/top-10-performance-problems-taken-from-zappos-monster-and-co/">sur le blog de l&#8217;éditeur Dynatrace</a>. A travers ce que ses consultants ont pu voir chez leur client (on parle donc d&#8217;un top 10 sélectif, chez des clients qui avaient conscience d&#8217;avoir des problèmes et qui pouvaient se permettre de les diagnostiquer avec un outil comme Dynatrace), il dresse un panorama qu&#8217;il est bon de toujours avoir à l&#8217;esprit durant nos développements. Nous nous sommes permis de le compléter avec nos propres retours d&#8217;expérience.</p><ul><li>une base de données trop sollicitée, ce qui inclut des données requetées trop grandes, ou requetées plusieurs fois, ou encore de trop nombreuses requêtes pour rapatrier une seule donnée (problème des mauvais usage des ORM).</li><li>une mauvaise programmation concurrente, avec un excès de synchronisation.</li><li>un manque de compréhension des appels <em>remote</em> et donc un trop grand nombre d&#8217;appels.</li><li>un mauvais usage des frameworks de mapping objet &#8211; relationnel. Ce point est largement répandu chez nos clients, en couvrant un large spectre, du simple problème de paramétrage à l&#8217;utilisation la plus hors de propos de la librairie.</li><li>l&#8217;existence de fuite mémoire (mais pourquoi ce point n&#8217;a t&#8217;il pas été placé en premier ?)</li><li>une librairie tierce coupable de mauvaises performance. Avec la multiplication des composants dans nos applications, le risque d&#8217;introduire des librairies moins robustes et moins performantes existe. Nous avons toujours trouvé étonnant de voir partir en production certains projets basés sur des librairies en béta&#8230;</li><li>une mauvaise utilisation des ressources machine (CPU, I/O&#8230;). Un traitement prend 50 % de CPU pendant 2 ms. Pas de quoi fouetter un chat ? Multipliez le par 1000 utilisateurs, une consommation mémoire excessive entraînant de fréquents GC, et nous en reparlerons.</li><li>des sites web trop chargés. La bande passante ne cesse d&#8217;augmenter, mais ce n&#8217;est pas une raison pour surcharger vos frontaux avec de nombreuses images trop volumineuses, des appels AJAX incessants, en ignorant joyeusement les stratégies de cache navigateur et/ou serveur.</li><li>une mauvaise gestion de caching des objets en mémoire. Surchargez votre mémoire pour alléger votre base, et c&#8217;est le Garbage Collector qui vous rappellera à l&#8217;ordre.</li><li>la sérialisation coute cher. Attention donc, si vous multipliez les appels RMI ou SOAP, à ne pas sérialiser trop d&#8217;objets, ou des objets trop volumineux.</li></ul><p>Nous avons échangé les places du point n°10 et du point bonus. Le point n°10, même si il a une réalité tangible, nous paraissait un peu trop marketing (mais c&#8217;est en partie la raison de vivre d&#8217;un blog éditeur) et nous préférons le déplacer en bonus :</p><ul><li>le problème intermittent, invisible. C&#8217;est celui dont il faut se prémunir en multipliant les tests (fonctionnels, de charge) ou en étant idéalement outillé.</li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="HappybirthdayPostIt"></a>Happy birthday Post-It !</h4><p>Et pour conclure cette revue de presse, nous ne résistons pas à l&#8217;envie de partager avec vous cette nouvelle d&#8217;importance: les Post-It, ces fameuses petites notes collantes multicolores, <a
title="fêtent leurs 30 ans" href="http://www.journaldunet.com/economie/industrie/fabrication-de-post-it/">fêtent leurs 30 ans</a>. Rappelons que l&#8217;utilisation de Post-It est devenue partie intégrante de la pratique de Scrum. Comment mettre à jour facilement la liste des tâche d&#8217;un Sprint sans Post-It ?! Alors pour leur rendre hommage, <a
title="regardons quelques photos" href="http://www.touilleur-express.fr/2009/03/30/3-exemples-de-tableaux-scrum/">regardons quelques photos</a> ou encore cette <a
title="magnifique vido de laquelle ils sont les acteurs majeurs" href="http://vimeo.com/4587652">magnifique vidéo de laquelle ils sont les acteurs majeurs</a>. Bon anniversaire les p&#8217;tits gars !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/05/11/revue-de-presse-xebia-158/</link> <comments>http://blog.xebia.fr/2010/05/11/revue-de-presse-xebia-158/#comments</comments> <pubDate>Tue, 11 May 2010 05:12:47 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[GemStone]]></category> <category><![CDATA[Google Labs]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Jarlsberg]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[Project Coin]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[VMWare]]></category> <category><![CDATA[xss]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4611</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII SpringSource se dote d&#8217;un cache distribué Le coin de la technique Jarlsberg, la sécurité en s&#8217;amusant Multi-Catch confirmé dans le projet Coin Evènements de notre communauté en France et à l&#8217;étranger C&#8217;est le printemps, les User Groups fleurissent 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" /><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/2010/05/11/revue-de-presse-xebia-158/#SpringSourcesedoteduncachedist">SpringSource se dote d&#8217;un cache distribué</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/05/11/revue-de-presse-xebia-158/#Jarlsberglascuritensamusant">Jarlsberg, la sécurité en <em>s&#8217;amusant</em></a></li><li><a
href="http://blog.xebia.fr/2010/05/11/revue-de-presse-xebia-158/#MultiCatchconfirmdansleprojetC">Multi-Catch confirmé dans le projet Coin </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/2010/05/11/revue-de-presse-xebia-158/#CestleprintempslesUserGroupsfl">C&#8217;est le printemps, les User Groups fleurissent</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="SpringSourcesedoteduncachedist"></a>SpringSource se dote d&#8217;un cache distribué</h4><p>VMware vient de faire l&#8217;acquisition de la société GemStone Systems, éditeur de la solution de cache distribué GemFire.  Elle sera gérée désormais sous la houlette de SpringSource.  Ce nouveau rapprochement s&#8217;inscrit dans <a
title="la stratgie affiche" href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#VMwareSpringSalesForceVMforce">la stratégie affichée</a> de la firme de fournir une plateforme complète de cloud destinée aux applications Java.</p><p>Par ailleurs, dans une <a
title="interview" href="http://www.infoq.com/news/2010/05/gemstone">interview</a> donnée à InfoQ, Rod  Johnson affirme que le <em>framework</em> Spring développera les abstractions nécessaires à l&#8217;intégration de ce type de produit, comme c&#8217;est déjà le cas pour les RDBMS, les broker JMS, etc via les <em>Templates</em> Spring, et pourrait permettre l&#8217;intégration d&#8217;autres solutions de data-grid comme Oracle Coherence ou encore Terracotta.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Jarlsberglascuritensamusant"></a>Jarlsberg, la sécurité en <em>s&#8217;amusant</em></h4><p>Xss, DoS, Xsrf&#8230; Des acronymes barbares qui désignent des failles de sécurité courantes dans nos applications Web. Si vous voulez mieux les connaitre, et ainsi vous en protéger, le nouveau projet de Google Labs, <a
title="Jarlsberg" href="http://jarlsberg.appspot.com/">Jarlsberg</a> (fromage norvégien), est pour vous.<br
/> Et comme le meilleur moyen d&#8217;apprendre est de faire, Google met à votre disposition un site truffé de failles de sécurité que vous pourrez hacker à loisir.<br
/> Les failles sont organisées en fonction de leur type :</p><ul><li>Cross-site Scripting (XSS)</li><li>Cross-site Request Forgery (XSRF)</li><li>Cross-site Script Inclusion (CSSI)</li><li>Manipulation de l&#8217;état du client</li><li>Traversée d&#8217;arborescence</li><li>Déni de Service (DoS)</li><li>Exécution de code</li><li>Vulnérabilité de la configuration</li><li>Vulnérabilités AJAX</li></ul><p>Pour venir à bout de ces failles, il existe trois types de tests :</p><ul><li>Tests boite noire : l&#8217;utilisateur ne connait pas le fonctionnement interne du site, il tente de hacker le site en passant par les pages exposées</li><li>Tests boite blanche : le code de l&#8217;application en python est connu par le hacker</li><li>Tests boite grise : un panaché des deux précédentes méthodes</li></ul><p>Ces tests sont servis pour une large variété d&#8217;outils de hacker :</p><ul><li>Snippets HTML</li><li>Upload de fichier</li><li>Administration du site</li><li>création de nouveaux comptes utilisateur</li><li>Language de templating Jarlsberg</li><li>Injection AJAX</li></ul><p>L&#8217;approche est très pédagogique, avec une succession de challenges à résoudre. Par exemple, le premier de ceux ci : pouvez vous uploader sur le site un fichier qui vous permettra d&#8217;exécuter un script sur le serveur d&#8217;application ? Chaque challenge propose des indices, une manière d&#8217;exploiter la faille et une correction.<br
/> Une plongée passionnante dans l&#8217;univers des hackers.</p><p>Avant de vous lancer dans ce Google Lab, nous vous conseillons la lecture de <a
title="larticle de Christian Heilmann" href="http://www.smashingmagazine.com/2010/01/14/web-security-primer-are-you-part-of-the-problem/">l&#8217;article de Christian Heilmann</a>.</p><p>Bien sûr, ces trucs et astuces ne doivent pas être reproduits <em>à la maison</em>, vous pourriez tomber sous le coup de la loi.</p><h4><a
name="MultiCatchconfirmdansleprojetC"></a>Multi-Catch confirmé dans le projet Coin</h4><p>Finalement, après plusieurs hésitations, <a
title="Joe Darcy" href="http://blogs.sun.com/darcy/entry/project_coin_multi_catch_rethrow">Joe Darcy</a> confirme la possibilité de rassembler plusieurs <em>catch</em> d&#8217;exceptions dans une même clause dans Java 7. Ainsi il sera possible d&#8217;écrire:</p><pre class="brush: java; title: ; notranslate">
try{
// code
} catch (ExceptionA|ExceptionB ex){
// code
}
</pre><p>Les discussions portaient sur la deuxième partie de cette proposition, le renvoi ( <em>rethrow</em> ) des exceptions. En effet il peut arriver qu&#8217;une exception soit renvoyée après avoir été attrapée. Dans ce cas elle doit apparaître dans la signature si c&#8217;est une exception vérifiée ( <em>checked</em> ). Par exemple :</p><pre class="brush: java; title: ; notranslate">
public void myMethod() throws Exception {
try{
// A hérite d'Exception
throw new A();
} catch (Exception e){
// code: par exemple un log
throw e;
}
}
</pre><p>Ce que propose le projet Coin, c&#8217;est de vérifier les exceptions possibles dans le bloc <em>try</em> et de donner la possibilité dans la signature de la méthode de renvoyer le type précis des exceptions. Pour cela on utilise le <em>modifier</em> <em>final</em>. Ce qui donne :</p><pre class="brush: java; title: ; notranslate">
public void myMethod() throws A {
try{
// A hérite d'Exception
throw new A();
} catch (final Exception e){
// code: par exemple un log
throw e;
}
}
</pre><p>Ceci permet d&#8217;avoir une signature plus précise et de pouvoir remonter une exception facilement. Les difficultés de cette proposition ont tourné autour du type d&#8217;exception qui se trouve dans la clause catch dans le cas où le type n&#8217;est connu qu&#8217;au Runtime.</p><p>Cette proposition en ravira plus d&#8217;un mais fera aussi sourire ceux qui prônent la suppression des exceptions vérifiées. Pour finir, un petit cas limite amusant de cette proposition, relevé par <a
title="Stephen Colebourne" href="http://mail.openjdk.java.net/pipermail/coin-dev/2010-May/002749.html">Stephen Colebourne</a> :</p><pre class="brush: java; title: ; notranslate">
public void myMethod() {
try{
//  du code sans exception
} catch (final Exception e){
// on envoie une exception vérifiée qui n'est pas dans la signature!
throw e;
}
}
</pre><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="CestleprintempslesUserGroupsfl"></a>C&#8217;est le printemps, les User Groups fleurissent</h4><p>Avec notre plateforme de prédilection, Java, qui s&#8217;ouvre de plus en plus à de nouveaux langages, il fallait bien que la communauté suive. Nous assistons donc ces derniers temps à l&#8217;éclosion de nouveaux User Groups. Le premier à bourgeonner fut le <a
title="Scala User Group" href="http://groups.google.com/group/paris-scala-user-group">Scala User Group</a> (attention, pas &laquo;&nbsp;SUG&nbsp;&raquo; car le nom <a
title="est déjà pris" href="http://www.frenchsug.org">est déjà pris</a>) qui a pris ses racines lors de la <a
title="soirée scala" href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100413">soirée Scala</a> organisée par le Paris JUG. Cette semaine, c&#8217;est Guillaume Laforge, Groovy project lead et <a
title="Cast Codeur émérite" href="http://lescastcodeurs.com/equipe/">Cast Codeur émérite</a>, qui <a
title="a annoncé" href="https://parisjug.dev.java.net/servlets/ReadMsg?list=users&amp;msgNo=828">a annoncé</a> sur la mailing liste du Paris JUG la création du Groovy User Group. La première rencontre est d&#8217;ores et déjà prévue <a
title="le 10 juin" href="http://www.meetup.com/Paris-Groovy-Grails/calendar/13379668/">le 10 juin</a>.<br
/> Ces nouveautés s&#8217;inscrivent dans la lignée de ce que nous avons déjà observé avec <a
title="la multiplication des JUGs" href="http://blog.developpez.com/christophej/p7447/java/la-multiplication-des-jug/">la multiplication des JUGs</a>: la communauté s&#8217;organise pour partager, lier connaissance et évoluer. Après les différents JUGs centrés sur Java, il n&#8217;est pas étonnant de voir des User Groups se créer pour rassembler les personnes intéressées par les nouveaux langages de cette plateforme.<br
/> Par la suite, ces langages resteront-ils sous la coupe des divers JUGs ou allons nous assister à la création du &laquo;&nbsp;Marseille Groovy User Group&nbsp;&raquo; ou du &laquo;&nbsp;Lyon Scala User Group&nbsp;&raquo; ? <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/2010/05/11/revue-de-presse-xebia-158/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Grails Spring Security Plugin, la sécurité facile</title><link>http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/</link> <comments>http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/#comments</comments> <pubDate>Thu, 25 Feb 2010 09:00:12 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[productivité]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4091</guid> <description><![CDATA[Le monde Grails a le vent en poupe ces temps-ci. Bien avant le printemps on peut voir fleurir des dizaines de tutoriaux sur le net pour prendre l&#8217;outil en main et créer sa première application. Mais un simple &#171;&#160;Getting started&#160;&#187; ne suffit pas toujours à bien prendre la mesure de la puissance de Grails. Je [...]]]></description> <content:encoded><![CDATA[<p>Le monde Grails a le vent en poupe ces temps-ci. Bien avant le printemps on peut voir fleurir des dizaines de tutoriaux sur le net pour prendre l&#8217;outil en main et créer sa première application. Mais un simple &laquo;&nbsp;Getting started&nbsp;&raquo; ne suffit pas toujours à bien prendre la mesure de la puissance de Grails.</p><p>Je vous propose donc un petit tutoriel pour mettre en place une gestion des utilisateurs, avec gestion des rôles, filtres URL/Rôles, formulaire de souscription de compte. Pour cela, nous allons nous appuyer sur le Spring Security Plugin de Grails. C&#8217;est une étape incontournable de la création d&#8217;application, et nous allons pouvoir constater à quel point l&#8217;utilisation de Grails booste la productivité.</p><h3><a
name="Bnisoitlescaffolding"></a>Béni soit le scaffolding</h3><p>Commençons par créer l&#8217;application <code>BookStore</code> qui nous servira de base, ainsi qu&#8217;une classe de domaine <code>Book</code>.</p><pre class="brush: java; title: ; notranslate">
grails create-app BookStore
cd BookStore
grail create-domain-class fr.xebia.bookstore.common.Book
</pre><p>Apportons quelques modifications à notre classe pour qu&#8217;elle soit un peu plus parlante dans la suite des exemples :</p><p><strong>grails-app/domain/fr/xebia/bookstore/common/Book.groovy</strong></p><pre class="brush: java; title: ; notranslate">
package fr.xebia.bookstore.common
class Book {
    String titre
    String auteur
    Date premierePublication
    static constraints = {
        titre(nullable:false)
        auteur(nullable:false)
    }
}
</pre><p>Maintenant nous générons le CRUD autour de notre classe <code>Book</code>.</p><pre class="brush: java; title: ; notranslate">
grails generate-all fr.xebia.bookstore.common.Book
</pre><p>Installation du plugin Spring Security. Pas de panique, <code>acegi</code> est toujours le nom du plugin, c&#8217;est un héritage de l&#8217;histoire</p><pre class="brush: java; title: ; notranslate">
grails install-plugin acegi
</pre><p>Creation des classes de domaines pour la gestion de la sécurité, Utilisateur, roles et mapping de security et génération des managers associés</p><pre class="brush: java; title: ; notranslate">
grails create-auth-domains
      fr.xebia.bookstore.security.User
      fr.xebia.bookstore.security.Role
      fr.xebia.bookstore.security.RequestMap
grails generate-manager
</pre><p>Maintenant nous générons les composants nécessaires à la souscription d&#8217;un compte par un internaute.</p><pre class="brush: java; title: ; notranslate">
grails generate-registration
</pre><p>A ce stade, nous disposons des contrôleurs suivants (et des vues qui vont avec) :</p><ul><li><strong>CaptchaController</strong> : permet de générer des images captcha pour éviter que des robots ne viennent créer des comptes utilisateurs</li><li><strong>fr.xebia.bookstore.common.BookController</strong> : CRUD de gestion de la classe <code>Book</code></li><li><strong>LoginController</strong> : Contrôleur de connexion</li><li><strong>LogoutController</strong> : Contrôleur de déconnexion</li><li><strong>RegisterController</strong> : Contrôleur d&#8217;enregistrement d&#8217;un compte utilisateur par un internaute</li><li><strong>RequestMapController</strong> : CRUD de gestion des règles de sécurité</li><li><strong>RoleController</strong> : CRUD de gestion des rôles</li><li><strong>UserController</strong> : CRUD de gestion des utilisateurs, destiné à notre espace d&#8217;administration</li></ul><p>On peut déjà démarrer l&#8217;application avec un <code>grails run-app</code> et voir ce que ça donne :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_11.png" alt="grails_tuto_1" title="grails_tuto_1" width="620" height="468" class="aligncenter size-full wp-image-4102" /></div><h3><a
name="Configurationetscurisation"></a>Configuration et sécurisation</h3><p>Cela fait déjà beaucoup de matières à exploiter en un temps relativement court. Mais en l&#8217;état c&#8217;est encore un peu brut de fonderie pour ressembler à une <em>vraie</em> application. Nous allons donc faire un peu de configuration et de rangement autour de tout ce code parachuté par Grails. Pour atteindre notre objectif, nous allons maintenant procéder à la sécurisation des écrans de :</p><ul><li>CRUD complet des utilisateurs</li><li>CRUD complet des rôles</li><li>CRUD complet des mappings de sécurité</li><li>Création de <code>Book</code></li></ul><p>Tout est déjà en place pour cela grâce au code que nous avons généré. Commençons par utiliser le <strong><code>RoleController</code></strong> pour créer un rôle utilisateur et un rôle administrateur :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_2.png" alt="grails_tuto_2" title="grails_tuto_2" width="620" height="361" class="aligncenter size-full wp-image-4105" /></div><p>Maintenant que nous avons des rôles, il faut créer un compte utilisateur avec le rôle ROLE_ADMIN pour éviter de se retrouver bloqué quand on posera les mappings de sécurité. Cette fois, c&#8217;est du coté des écrans du <strong><code>UserController</code></strong> que ça se passe :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_3.png" alt="grails_tuto_3" title="grails_tuto_3" width="620" height="431" class="aligncenter size-full wp-image-4106" /></div><p>Et pour finir, on pose des mappings de sécurité sur les URL qui nous intéressent, avec la liste des rôles autorisés à accéder. Pour cela, nous utilisons le <strong><code>RequestMapController</code></strong> :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_4.png" alt="grails_tuto_4" title="grails_tuto_4" width="620" height="331" class="aligncenter size-full wp-image-4107" /></div><p>Et voilà ! Notre application répond déjà mieux à nos attentes en terme de sécurité :</p><ul><li>tout le monde peut voir la liste des <code>Book</code> présents en base.</li><li>seuls les utilisateur ayant le rôle ROLE_USER ou ROLE_ADMIN peuvent insérer de nouveaux <code>Book</code></li><li>seuls les utilisateur ayant le rôle ROLE_ADMIN peuvent créer des utilisateurs, des rôles et modifier les règles de sécurité</li></ul><p>Si un utilisateur non authentifié tente d&#8217;accéder à une URL protégée, il sera automatiquement redirigé vers un écran de login avant d&#8217;accéder à la page désirée.</p><h3><a
name="Adaptationsdeconfort"></a>Adaptations de confort</h3><p>Par défaut, une application Grails utilise HSQLDB et démarre avec une base vierge à chaque lancement. Nous allons donc changer cela pour intégrer directement à chaque démarrage les rôles, mappings de sécurité et un compte administrateur :</p><p><strong>grails-app/conf/BootStrap.groovy</strong></p><pre class="brush: java; title: ; notranslate">
import fr.xebia.bookstore.security.User
import fr.xebia.bookstore.security.Role
import fr.xebia.bookstore.security.RequestMap
class BootStrap {
    def authenticateService
    def init = { servletContext -&gt;
        def roleAdmin = new Role(authority: 'ROLE_ADMIN', description: 'Administrateur').save()
        def roleUser = new Role(authority: 'ROLE_USER', description: 'Utilisateur').save()
        def userAdmin = new User(username: 'admin', userRealName: 'ATTAN Charles',
            passwd: authenticateService.encodePassword('admin'),
            enabled: true, email: 'admin@bookstore.fr')
        userAdmin.addToAuthorities(roleAdmin)
        userAdmin.save()
        def protectBookCreation = new RequestMap(url: '/book/create*', configAttribute: 'ROLE_ADMIN,ROLE_USER').save()
        def protectUserManaging = new RequestMap(url: '/user/*', configAttribute: 'ROLE_ADMIN').save()
        def protectRoleManaging = new RequestMap(url: '/role/*', configAttribute: 'ROLE_ADMIN').save()
        def protectSecurityMappingManaging = new RequestMap(url: '/requestMap/*', configAttribute: 'ROLE_ADMIN').save()
    }
    def destroy = {
    }
}
</pre><p>Voilà, au prochain démarrage nous retrouverons toutes nos chères données directement en base. Ensuite, nous pouvons nous attaquer à l&#8217;enregistrement des internautes en tant qu&#8217;utilisateur standard. Par défaut, le formulaire lié au <strong><code>RegisterController</code></strong> crée des utilisateurs sans rôle, ce qui ne nous convient pas du tout. De plus, comme il serait agréable pour les nouveaux utilisateurs de recevoir un mail de confirmation de leur inscription, on va le mettre en place dans la foulée :</p><p><strong>grails-app/conf/SecurityConfig.groovy</strong></p><pre class="brush: java; title: ; notranslate">
security {
	active = true
	loginUserDomainClass    = &quot;fr.xebia.bookstore.security.User&quot;
	authorityDomainClass    = &quot;fr.xebia.bookstore.security.Role&quot;
	requestMapClass         = &quot;fr.xebia.bookstore.security.RequestMap&quot;
        defaultRole             = 'ROLE_USER'   // Role par defaut des nouveaux utilisateurs
        useMail                 = true          // specifie d'envoyer un mail à l'enregistrement d'un compte
        mailHost                = 'localhost'   // serveur d'envoi de mails
        mailProtocol            = 'smtp'        // nom du protocole JavaMail
        mailFrom                = 'no.reply@bookstore.fr'   // adresse de l'envoyeur du mail
        mailPort                = 25            // port de connexion au serveur de mail
}
</pre><p>Avec ces modifications, tous les internautes qui créeront des comptes par le formulaire obtiendrons le rôle ROLE_USER et recevront un mail comme ceci :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/grails_tuto_5.png" alt="grails_tuto_5" title="grails_tuto_5" width="412" height="247" class="aligncenter size-full wp-image-4108" /></div><p>Si vous souhaitez adapter un peu le format du mail, le code associé est situé vers la ligne 170 du code de <strong><code>RegisterController</code></strong> :</p><p><strong>extrait de grails-app/controllers/RegisterController.groovy</strong></p><pre class="brush: java; title: ; notranslate">
[...]
if (config.security.useMail) {
                String emailContent = &quot;&quot;&quot;You have signed up for an account at:
 ${request.scheme}://${request.serverName}:${request.serverPort}${request.contextPath}
 Here are the details of your account:
 -------------------------------------
 LoginName: ${person.username}
 Email: ${person.email}
 Full Name: ${person.userRealName}
 Password: ${params.passwd}
&quot;&quot;&quot;
                def email = [
                    to: [person.email], // 'to' expects a List, NOT a single email address
                    subject: &quot;[${request.contextPath}] Account Signed Up&quot;,
                    text: emailContent // 'text' is the email body
                ]
                emailerService.sendEmails([email])
            }
[...]
</pre><p>Et voilà comment en quelques minutes on peut avoir une application, basique certes&#8230; mais sécurisée !</p><h3><a
name="Pourallerplusloin"></a>Pour aller plus loin</h3><p>Le plugin Grails Spring Security possède de nombreuses autres options. Je n&#8217;ai développé ici que la stratégie de stockage des règles de sécurité dans la base, mais il est également possible de les définir directement dans le fichier <strong><code>SecurityConfig</code></strong>, ou par annotations des méthodes des contrôleurs.</p><p>On peut appuyer la sécurité sur <a
href="http://fr.wikipedia.org/wiki/OpenID" title="OpenID" >OpenID</a>, <a
href="http://fr.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol" title="LDAP" >LDAP</a>, <a
href="http://fr.wikipedia.org/wiki/Central_Authentication_Service" title="CAS" >CAS</a>, <a
href="http://fr.wikipedia.org/wiki/NT_Lan_Manager" title="NTLM" >NTLM</a> ou même utiliser une connexion <a
href="http://developers.facebook.com/connect.php" title="FaceBook Connect" >FaceBook Connect</a>. On peut changer l&#8217;algorithme de cryptage des mots de passe, les possibilités sont assez étendues.</p><p>Et si vraiment Spring Security ne vous convient pas, il existe d&#8217;autres solutions de sécurité à base de plugins comme <a
href="http://www.grails.org/plugin/shiro" title="Shiro" >Shiro</a> ou <a
href="http://www.grails.org/plugin/stark-security" title="Stark" >Stark</a>, qui feront peut-être l&#8217;objet d&#8217;autres articles dans le futur.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>L&#8217;utilisation du plugin Grails Spring Security permet de mettre le pied à l&#8217;étrier très rapidement, en s&#8217;appuyant sur un standard des frameworks de sécurité en Java. J&#8217;ai personnellement beaucoup apprécié la simplicité de prise en main et les exemples fournis dans la documentation officielle. Je vous invite d&#8217;ailleurs à la parcourir, elle contient d&#8217;autres tutoriels notamment pour l&#8217;utilisation de OpenID et LDAP.</p><p><em>Nota Bene : Cet article est fortement inspiré de <a
href="http://www.grails.org/AcegiSecurity+Plugin+-+Basic+Tutorial" title="celuici" >celui-ci</a>, mais il méritait des précisions à mon goût.</em></p><p><strong>Ressources :</strong></p><ul><li><a
href="http://www.grails.org" title="Le projet Grails" >Le projet Grails</a></li><li><a
href="http://grails.org/plugin/acegi" title="Grails Spring Security Plugin" >Grails Spring Security Plugin</a></li><li><a
href="http://www.grails.org/AcegiSecurity+Plugin+-+Tutorials" title="Tutoriels officiels Spring Security Plugin" >Tutoriels officiels Spring Security Plugin</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/25/grails-spring-security-plugin-la-securite-facile/feed/</wfw:commentRss> <slash:comments>11</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/</link> <comments>http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#comments</comments> <pubDate>Mon, 08 Feb 2010 17:06:14 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[Kenaï]]></category> <category><![CDATA[Maven]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3987</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Kenaï, fermera, fermera pas ? Le coin de la technique Groovy++: bientôt dans votre JVM ? InfoQ sort un ebook gratuit sur Grails Maven vers une injection de dépendances via Guice Actualité éditeurs / SSII Kenaï, fermera, fermera pas ? [...]]]></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&#8217;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/2010/02/08/revue-de-presse-xebia-146/#Kenafermerafermerapas">Kenaï, fermera, fermera pas ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#GroovybienttdansvotreJVM">Groovy++: bientôt dans votre JVM ?</a></li><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#InfoQsortunebookgratuitsurGrai">InfoQ sort un ebook gratuit sur Grails</a></li><li><a
href="http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/#Mavenversuneinjectiondedpendan">Maven vers une injection de dépendances via Guice</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Kenafermerafermerapas"></a>Kenaï, fermera, fermera pas ?</h4><p>Comme il fallait le prévoir au vu de l&#8217;engouement d&#8217;Oracle pour les projets communautaires, la ferme de projets Kenaï vit ses derniers jours en tant que service public. La plateforme lancée en 2008 et construite autour de JRuby, Glassfish et MySQL fournissait un environnement de suivi de projet complet avec la gestion de version, des wikis, des mailing lists et que sais-je encore. Avec NetBeans 6.7, il est même possible de maintenir entièrement son projet depuis son IDE. Le site héberge encore aujourd&#8217;hui quelques 40 000 projets communautaires parmi lesquels on retiendra JRuby et Hudson. Oracle a d&#8217;abord annoncé la fermeture du site sous 60 jours afin de permettre aux projets de migrer vers d&#8217;autres solutions. L&#8217;idée de départ devait être de ré-utiliser la plateforme en interne mais plus du tout ouverte au public.<br
/> Faut il y voir les effets de la réaction d&#8217;une communauté importante ou un gros problème de communication : Oracle change son fusil d&#8217;épaule à travers la voix de Ted Farrell qui a clarifié l&#8217;avenir de la plateforme en annonçant que ce serait finalement une migration vers java.net. Dans son annonce, Farrell laisse entendre que tous les efforts seront poussés sur java.net et que la communauté Kenaï pourrait continuer à travailler sans perte sur la nouvelle version de cette ancienne plateforme de développement hosté.<br
/> Comme le dit la chanson, trois pas en avant, trois pas en arrière, &#8230;</p><ul><li><a
href="http://www.infoq.com/news/2010/02/kenai_to_close" title="Kena to close sur InfoQ" >Kenaï to close sur InfoQ</a></li><li><a
href="http://blogs.sun.com/projectkenai/entry/the_future_of_kenai_com" title="Le post de Ted Farrell" >Le post de Ted Farrell</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="GroovybienttdansvotreJVM"></a>Groovy++: bientôt dans votre JVM ?</h4><p>Nous avons éhontément passé sous silence nombre de news du monde Groovy récemment:</p><ul><li><a
href="http://docs.codehaus.org/display/GROOVY/Groovy+1.7+release+notes" title="Groovy 17" >Groovy 1.7</a></li><li><a
href="http://www.grails.org/1.2.1+Release+Notes" title="Grails 12" >Grails 1.2</a></li><li>La sortie du plugin Groovy Eclipse <a
href="http://groovy.codehaus.org/Eclipse+Plugin" title="en version 20" >en version 2.0</a></li><li>La sortie de <a
href="http://groovy.dzone.com/announcements/griffon-021-and-03-beta-1" title="nouvelles versions de Griffon" >nouvelles versions de Griffon</a>, le framework pour  clients lourds qui reprend les idées de Grails</li></ul><p>Alors pour nous rattraper, nous ne passerons pas à coté de la nouvelle suivante : le développement de Groovy++ ! Alex Tkachman, l&#8217;initiateur du projet nous explique <a
href="http://groovy.dzone.com/news/alex-tkachman-static-groovy" title="dans une interview" >dans une interview</a> de quoi il retourne et Roshan Dawrani <a
href="http://groovy.dzone.com/articles/sneak-peak-groovy-what-it-why" title="nous explique ce qu'il retient du projet" >nous explique ce qu&#8217;il retient du projet</a>. En fait, malgré tous ses avantages, Groovy est encore assez lent. En tout cas beaucoup plus que Java, à cause de son coté dynamique. L&#8217;idée de Groovy++ est de continuer à utiliser Groovy normalement, mais en pluggant un compilateur spécial pour certaines parties du code annotées avec @Typed. Le code ainsi annoté devra respecter de légères contraintes  (contraintes par rapport au laxisme de Groovy, mais légères par rapport au typage fort de Java). Le compilateur pourra donc effectuer des optimisations, notamment grâce à <a
href="http://en.wikipedia.org/wiki/Type_inference" title="l'inférence de type" >l&#8217;inférence de type</a>, et nettement améliorer les performances. Les premiers résultats semblent encourageant en tout cas : 197 fois plus rapide d&#8217;après <a
href="http://stronglytypedblog.blogspot.com/2010/02/groovy-performance-now-were-talkin.html" title="ce micro-bench" >ce micro-bench</a> et 33% plus rapide <a
href="http://www.touilleur-express.fr/2010/02/08/grovvy-plus-plus/" title="daprs le touilleur" >d&#8217;après cet article lu sur le Touilleur Express</a>.</p><p>Alors ce Groovy++, une révolution ? Difficile à dire ! En effet, d&#8217;un coté Groovy est de plus en plus utilisé (notamment à travers Grails) et un coup de boost ne peut pas lui faire de mal. Mais d&#8217;un autre coté, l&#8217;interaction de Groovy et Java étant très avancée, on peut se contenter d&#8217;écrire en Java les parties du programme nécessitant des performances optimales. On peut aussi voir en Groovy++ l&#8217;ajout d&#8217;une énième librairie dans le développement, avec ses contraintes, ses bugs&#8230; D&#8217;autant que, pour des problèmes de licence sur certaines parties de code, le compilateur n&#8217;est pas encore OpenSource (ce qui est prévu pour la suite). Donc, si vous sous sentez l&#8217;âme d&#8217;un aventurier ou que vous avez désespérément besoin de gains de performances tout en gardant la &laquo;&nbsp;Groovy attitude&nbsp;&raquo;, n&#8217;hésitez pas à nous faire vos retours sur l&#8217;utilisation de Grovvy++ !</p><h4><a
name="InfoQsortunebookgratuitsurGrai"></a>InfoQ sort un ebook gratuit sur Grails</h4><p>InfoQ vient de sortir, dans sa série <a
href="http://www.google.com/search?q=minibooks+site%3Awww.infoq.com" title=""Minibooks"" >&laquo;&nbsp;Minibooks&nbsp;&raquo;</a> la seconde version de son <a
href="http://www.infoq.com/minibooks/grails-getting-started" title="Getting started with Grails" >&laquo;&nbsp;Getting started with Grails&nbsp;&raquo;</a>. La première version, datant d&#8217;il y a déjà 3 ans, était basée sur Grails 0.3.1 alors que celle-ci s&#8217;appuie sur le tout récent 1.2. Le principe reste identique : les auteurs s&#8217;appuient sur une application de gestion de course de chevaux pour nous faire découvrir au fur et à mesure nombre des possibilités offertes par le framework. A la vue du sommaire, largement remanié, on peut penser que les changements ont été profonds. Sans avoir encore lu cette seconde édition, nous pouvons d&#8217;ores et déjà la recommander chaudement à toute personne qui s&#8217;intéresse à Grails et voudrait rapidement avoir un éventail clair des possibilités qu&#8217;il offre (si elle est dans la même veine que la précédente). D&#8217;autant qu&#8217;au format électronique, le livre est gratuit (juste besoin de s&#8217;inscrire à InfoQ)!</p><h4><a
name="Mavenversuneinjectiondedpendan"></a>Maven vers une injection de dépendances via Guice</h4><p>Sonatype (<a
href="http://www.infoq.com/news/2010/02/maven3_guice" title="via InfoQ" >via InfoQ</a>) a annoncé la migration progressive de Maven vers une injection de dépendances gérée par Google Guice. Ce qui signifie l&#8217;abandon à moyen terme de Plexus, le framework quelque peu obsolète (et abscons, faute de documentation) utilisé depuis les débuts du framework de build. Dans un premier temps, la migration sera gérée via un bridge créé sous Guice.<br
/> De plus, l&#8217;introduction de Guice devrait se faire via les annotations de la JSR 330, ce qui rendra Maven moins adhérent à Guice dans le cas d&#8217;une nouvelle migration vers un autre framework d&#8217;IoC.<br
/> Cette nouvelle devrait réjouir les développeurs de plugins, qui n&#8217;auront plus à maitriser les arcanes de Plexus. Autre conséquence, plus directe, les développeurs Maven n&#8217;auront plus à jouer les comitters Plexus pour débugger et ou faire avancer cet outil (qui devrait rapidement se diriger vers une fin de vie en l&#8217;absence de ce soutien de poids).<br
/> On peut noter que Jason van Zyl, le créateur de Maven, et Bob Lee, l&#8217;un des principaux artisans de Guice, avaient œuvré ensemble à imposer la JSR 330 face à la JSR 299 (<a
href="http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/#more-1979" title="la fameuse bataille Inject contre WebBeans" >la fameuse bataille @Inject contre WebBeans</a>).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/08/revue-de-presse-xebia-146/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Grails scaffolding</title><link>http://blog.xebia.fr/2009/12/23/grails-scaffolding/</link> <comments>http://blog.xebia.fr/2009/12/23/grails-scaffolding/#comments</comments> <pubDate>Wed, 23 Dec 2009 16:33:09 +0000</pubDate> <dc:creator>Guillaume Mathias</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[scaffolding]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3620</guid> <description><![CDATA[Grails est un framework web Groovy qui se vante de haute-productivité. Mais qu&#8217;est-ce qui lui permet de se prétendre plus productif qu&#8217;un autre framework ? Un de ses meilleurs atouts s&#8217;appelle le scaffolding. Le scaffolding, c&#8217;est le générateur de code de grails qui permet de créer une application entière en cinq minutes à partir des [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.grails.org" title="grails" >Grails</a> est un framework web <a
href="http://groovy.codehaus.org/" title="groovy" >Groovy</a> qui se vante de haute-productivité. Mais qu&#8217;est-ce qui lui permet de se prétendre plus productif qu&#8217;un autre framework ? Un de ses meilleurs atouts s&#8217;appelle le <em>scaffolding</em>. Le scaffolding, c&#8217;est le générateur de code de grails qui permet de créer une application entière en cinq minutes à partir des objets métier  ! Dit comme ça, ça fait rêver ! Oui, mais j&#8217;entends déjà les détracteurs des générateurs de code qui hurlent à l&#8217;illusion du gain de productivité&#8230; Et bien peut-être pas, pour une fois !</p><h3><a
name="Questcequelescaffolding"></a>Qu&#8217;est-ce que le scaffolding ?</h3><p>Le scaffolding (&laquo;&nbsp;l&#8217;échafaudage&nbsp;&raquo; pour les puristes francologues), c&#8217;est l&#8217;effet &laquo;&nbsp;magique&nbsp;&raquo; de Grails, ou &laquo;&nbsp;comment générer toute une application <a
href="http://fr.wikipedia.org/wiki/CRUD" title="CRUD" >CRUD</a> à partir de quelques classes métier&nbsp;&raquo;. Voyons de plus près comment le scaffolding fonctionne.<br
/> &#8230;LE scaffolding !? LES scaffolding plutôt. Car Grails propose deux approches différentes pour générer les écrans à partir des classes métier : statique ou dynamique.</p><p>Regardons d&#8217;abord le scaffold statique.</p><h4><a
name="Scaffoldingstatique"></a>Scaffolding statique</h4><p>Commençons par créer 2 classes métier (domain en grails) :</p><pre class="brush: java; title: ; notranslate">
grails create-app bookstore
grails create-domain-class Book
</pre><p>Ajoutons les attributs suivants à la classe créée :</p><pre class="brush: java; title: ; notranslate">
class Book {
    String title
    String author
    static constraints = {}
}
</pre><p>Puis générons les écrans CRUD avec la commande suivante :</p><pre class="brush: java; title: ; notranslate">
grails generate-all Book
</pre><p>Cela génère le controller (BookController) et les pages dans views/book : create.gsp, edit.gsp, list.gsp, show.gsp.</p><p>Admirez le résultat en lançant l&#8217;application :</p><pre class="brush: java; title: ; notranslate">
grails run-app
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/12/home.png" border="0" alt="" /></div><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/12/book-list.png" border="0" alt="" /></div><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/12/book-create.png" border="0" alt="" /></div><p>Ce scaffolding statique est finalement juste un générateur de code comme on peut en trouver dans beaucoup de frameworks. Et comme tout générateur de code, son intérêt est assez limité puisqu&#8217;à la moindre évolution de la classe Book (ajout d&#8217;un attribut par exemple), il faudra tout regénérer.</p><p>C&#8217;est là que vient le scaffold dynamique ! Recommençons depuis la création de la classe Book.</p><h4><a
name="Scaffoldingdynamique"></a>Scaffolding dynamique</h4><p>Après l&#8217;object domain, créons le controller. Manuellement (dans grails-app/controllers) ou avec la commande :</p><pre class="brush: java; title: ; notranslate">
grails create-controller Book
</pre><p>Ouvrons la classe générée BookController et ajoutons l&#8217;attribut scaffold :</p><pre class="brush: java; title: ; notranslate">
class BookController {
    def scaffold = true
}
</pre><p>Lancez l&#8217;application et admirez de nouveau : le résultat est identique. Mais quel est l&#8217;intérêt alors ? L&#8217;intérêt n&#8217;est pas visible mais il est pourtant de taille pour nous les développeurs : la maintenance ! Nous avons ici une solution beaucoup plus souple qui va s&#8217;adapter aux modifications de l&#8217;objet métier.</p><p>Reprenons la classe Book et ajoutons un attribut description :</p><pre class="brush: java; title: ; notranslate">
class Book {
    String title
    String author
    String description
    static constraints = {}
}
</pre><p>Relancez l&#8217;application et vous pouvez voir le nouveau champ.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/12/book-create2.png" border="0" alt="" /></div><h3><a
name="Personnalisationduscaffolding"></a>Personnalisation du scaffolding</h3><p>Comme vous l&#8217;avez peut-être remarqué, les champs du formulaire de création ne sont pas forcément dans l&#8217;ordre le plus intuitif (author avant title) et le champ description est un peu court.<br
/> Heureusement, le scaffolding est suffisamment intelligent et se base sur les <em>constraints</em> de l&#8217;objet métier.</p><p>Pour changer l&#8217;ordre d&#8217;affichage des champs, il suffit de déclarer les contraintes de ces champs dans l&#8217;ordre désiré :</p><pre class="brush: java; title: ; notranslate">
class Book {
    String title
    String author
    String description
    static constraints = {
        title()
        author()
        description()
    }
}
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/12/book-create3.png" border="0" alt="" /></div><p>Mais ce n&#8217;est pas tout, ajoutons quelques attributs pour illustrer les capacités du scaffolding :</p><pre class="brush: java; title: ; notranslate">
class Book {
    String title
    String author
    Date publicationDate
    String category
    String description
    boolean available
    static constraints = {
    	title(blank:false)
    	author()
    	publicationDate()
    	category(inList:['Groovy', 'Java', '.Net'])
    	description(widget:'textarea')
    	available()
    }
}
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/12/book-create4.png" border="0" alt="" /></div><p>Regardons les contraintes :</p><ul><li>&laquo;&nbsp;blank:false&nbsp;&raquo; rend le champ obligatoire</li><li>&laquo;&nbsp;inList&nbsp;&raquo; génère un élément &lt;select&gt; avec les valeurs spécifiées</li><li>&laquo;&nbsp;widget:&#8217;textarea&#8217;&nbsp;&raquo; génère un élément HTML &lt;textarea&gt;</li></ul><h3><a
name="Staticvsdynamic"></a>Static vs dynamic</h3><p>Le scaffold statique fonctionne comme n&#8217;importe quel générateur de code. Vous concevez votre objet métier puis vous générez le controller et les vues. Mais à chaque modification de l&#8217;objet <strike> renommer un attribut par exemple </strike> vous devrez mettre à jour les méthodes du controller et les 4 pages gsp. Beaucoup de travail pour une si petite modification.<br
/> Or les objets métier sont modifiés très souvent durant la vie d&#8217;un projet (surtout dans un développement agile).</p><p>Le scaffold dynamique permet d&#8217;éviter cette perte de temps puisque les modifications de l&#8217;objet métier sont automatiquement répercutées sur les vues au démarrage de l&#8217;application. Le gain de temps est donc énorme !</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>La différence entre le scaffolding statique et le scaffolding dynamique se résume au moment du cycle de développement où le code est généré. Le code statique est généré par le développeur alors que le code dynamique est généré au runtime. Mais cette petite différence a un énorme impact en terme de maintenance : le scaffold dynamique permet de se concentrer sur le code métier, alors que le scaffold statique oblige à maintenir inutilement les vues et le controller générés.</p><p>Grails possède donc avec le scaffolding dynamique un atout précieux qui permet réellement d&#8217;augmenter la productivité. Cette fonctionnalité risque à l&#8217;avenir de se retrouver dans un grand nombre de frameworks tant elle est bénéfique.</p><p>En étant honnête, les écrans CRUD ne pourront que rarement être exposés tels quels au grand public. Mais dans toutes les applications de gestion, la plus grosse partie est la partie immergée, le back-office. Et là, il est tout à fait envisageable d&#8217;exposer ces écrans en interne dans l&#8217;entreprise.</p><p>On peut regretter toutefois que la liste du CRUD ne propose pas de possibilités de recherche ou de filtre, car une liste <strike> même paginée </strike> devient vite inutilisable dès qu&#8217;on dépasse 3 pages. On peut aussi reprocher quelques lacunes niveau ergonomie mais on peut espérer que le scaffold va s&#8217;améliorer au fur et à mesure des versions de Grails.</p><p>Sinon, Grails offre la possibilité de modifier complètement les templates utilisés pour générer le code, mais ça ce sera pour la prochaine fois !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/12/23/grails-scaffolding/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Devoxx &#8211; Jour 1 &#8211; JSF 2</title><link>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-jsf-2/</link> <comments>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-jsf-2/#comments</comments> <pubDate>Wed, 18 Nov 2009 12:01:33 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Ajax]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Facelets]]></category> <category><![CDATA[Gracelets]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[JEE6]]></category> <category><![CDATA[JSF]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3205</guid> <description><![CDATA[Une des sessions très attendues de ce Devoxx 2009 (avec JEE6) est JSF 2.0. Beaucoup de spécificités de JSF premier du nom ont découragé de nombreux développeurs. De ce fait, JSF n&#8217;a pas très bonne réputation&#8230; Et il faut rattraper ça ! C&#8217;est en tout cas ce qui ressort des premiers slides de cette présentation [...]]]></description> <content:encoded><![CDATA[<p>Une des sessions très attendues de ce Devoxx 2009 <em>(avec JEE6)</em> est <a
href="http://www.devoxx.com/display/DV09/JSF+2+and+beyond" title="JSF 20" >JSF 2.0</a>. Beaucoup de spécificités de JSF premier du nom ont découragé de nombreux développeurs. De ce fait, JSF n&#8217;a pas très bonne réputation&#8230; Et il faut rattraper ça ! C&#8217;est en tout cas ce qui ressort des premiers slides de cette présentation avec l&#8217;accroche choc : <em>JSF 2.0 : it is not only us, it is you too !</em></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jsf2_speakers.jpg" border="0" alt="" /></div><p>Car oui : JSF 2.0 annonce la couleur et souhaite faire participer la communauté. Dans cet esprit, les speakers nous présentent le topic twitter <a
href="http://search.twitter.com/search?q=%23jsf2next"  title="JSF2NEXT">#jsf2next</a> pour partager autour des évolutions futures de JSF, souhaitées ou non. Ils enchaînent ensuite avec un trombinoscope de toutes les personnes qui se trouvent <em>derrière</em> JSF 2.0 <em>(on reconnaîtra quelques visages au passage)</em> :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jsf2_many_faces.jpg" border="0" alt="" /></div><p>L&#8217;aspect communautaire sera rappelé tout au long de la session et on sent vraiment que JSF met le paquet pour être apprécié des développeurs. Les speakers insisteront beaucoup sur le tag <code>JSF2.next</code> avec des slides spécifiques pour donner quelques idées internes ou remontées par la communauté pour <em>(déjà)</em> améliorer JSF 2.0.</p><p>La présentation fût découpée en 3 parties : <em>Vue</em>, <em>Contrôleur</em> et <em>Modèle</em> (approximativement 1h pour chaque partie), ce qui nous donne ainsi un bon aperçu de tous les changements de chaque couche du MVC. Une session de <a
href="http://en.wikipedia.org/wiki/Birds_of_a_Feather_%28computing%29" title="BOF" >BOF</a> spéciale <a
href="http://www.devoxx.com/display/DV09/JSF2+and+Beyond" title="JSF 20" >JSF 2.0</a>, qui a eu lieu le soir même, apportera quelques précisions sur certaines fonctionnalités non évoquées lors de la conférence.</p><h3><a
name="Vue"></a>Vue</h3><p>Premier rappel côté <em>Vue</em> et déjà quelques tacles à la gorge : JSP avec ses points faibles <em>(dont certains sont assez discutables&#8230;)</em> :</p><ul><li>la complexité de développer une librairie,</li><li>l&#8217;état <em>stateful</em> des tags qui impose de faire des appels à release sur les objets tags pour les réinitialiser,</li><li>l&#8217;obligation d&#8217;une phase de compilation lors du premier affichage,</li><li>le mélange de la présentation avec la couche métier</li><li>le fait que JSP soit orienté contenu (et non composant).</li></ul><p><em>Facelets</em> arrive ainsi avec ses XHTML tags, <em>stateless</em> par défaut, des librairies plus simples à développer, du templating et plus de compilation Java. Et, première bonne nouvelle pour les fans de <em>Facelets</em>, la librairie est incluse dans la spécification avec les mêmes fonctionnalités et quelques améliorations. Elle inclura aussi <em>Gracelets</em> (Groovy pour JSF / Facelets).<br
/> La présentation se focalise ensuite sur un des points noirs de JSF : la création de composant&#8230; Vous savez, les composants pour lesquels il faut coder un <code>UIComponent</code>, un <code>Renderer</code>, tag/tld, le <em>(ugly)</em> faces-config.xml&#8230;</p><p>La création de composants est simplifiée dans JSF 2.0 : soit en utilisant les annotations et le fichier taglibs.xml (configuration ainsi simplifiée) soit les <em>Composite Components</em>, une des grosses nouveautés de cette version. Nous avons ainsi les tags <code>composite:interface</code> et <code>composite:implementation</code> pour définir le composite et l&#8217;implémentation.</p><p>Ces composites sont accessibles directement dans la webapp ou dans un JAR, avec la possibilité d&#8217;ajouter des <em>listeners</em> et <em>converters</em>, de plugger un <em>resource bundle</em>&#8230;</p><p>L&#8217;Ajax n&#8217;est pas en reste avec un composant embarqué dans JSF 2.0 : <code>jsf.ajax.request()</code>, utilisable par le tag <code>&lt;f:ajax&gt;</code> qui peut-être soit <em>nested</em> soit <em>wrapping</em>.</p><h3><a
name="Contrleur"></a>Contrôleur</h3><p>Comme la plupart des frameworks web du moment (Wicket pour ne citer que lui), JSF 2.0 pourra enfin se targuer de supporter&#8230; GET (pas de sarcasme svp <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) ! La conséquence directe est que nous allons enfin pouvoir <em>bookmarker</em> nos URLs. Un exemple avant/après :</p><pre class="brush: java; title: ; notranslate">
&lt;h:link outcome=&quot;product&quot; value=&quot;View&quot;&gt;
    &lt;f:param name=&quot;id&quot; value=&quot;#{product.id}&quot; /&gt;
&lt;/h:link&gt;
// qui donnera :
&lt;a href=&quot;/product.jsf ?id=3&quot;&gt;View&lt;/a&gt;
</pre><p>Côté événement, le nouveau <code>SystemEvent</code> fonctionne en mode publish/subscribe avec des événements de type <code>PostAddToViewEvent</code> (après la création du composant) et <code>PreRenderViewEvent</code> (avant le rendering du composant).</p><p>Une autre partie intéressante est la gestion des ressources dans l&#8217;application avec 2 possibilités de récupération selon que la ressource soit présente dans un dossier de la webapp ou dans un JAR :</p><pre class="brush: java; title: ; notranslate">
// Web root
&lt;h:graphicImage name=&quot;hello.png&quot; /&gt;
// Classpath of myimages.jar
&lt;h:graphicImage name=&quot;hello.png&quot; library=&quot;myimages&quot; /&gt;
&lt;h:graphicImage value=&quot;#{resources['myimages:hello.png']}&quot; /&gt;
</pre><h3><a
name="Modle"></a>Modèle</h3><p>Pour la partie modèle, ce sera surtout une présentation des différentes technologies JEE 6 avec leur intégration dans JSF 2.0 : Managed Beans (partie de JSR-316), Contexts and Dependency Injection (JSR-299), Bean-Validation (JSR-303) et JAX-RS (JSR-311).</p><p>Outre les fameuses annotations @Inject (CDI) et @Named (EL), la présentation fera la part belle à Bean-Validation avec l&#8217;ajout d&#8217;une annotation au niveau de notre POJO qui validera côté Data, Business mais surtout, ce qui nous intéresse, Client.</p><p>On se retrouve donc avec les exemples suivants qui sont nativement gérés par JSF 2.0 dans nos pages JSF :</p><pre class="brush: java; title: ; notranslate">
public class User {
   ...
   @NotNull @Size(min=3, max=25)
   public String getUsername() {return username;}
   @NotNull @Email
   public String getEmail() {return email;}
}
</pre><p>Il sera toutefois possible, côté JSF, de désactiver certaines validations, soit par paquet soit au cas par cas.</p><p>A noter une bonne gestion du <code>null</code> dans un champ (<code>null</code> ou String vide) avec la possibilité de valider ou non le champ si une annotation Bean-Validation est présente ou si le <code>context-param</code> suivant est présent :</p><pre class="brush: java; title: ; notranslate">
&lt;context-param&gt;
   &lt;param-name&gt;javax.faces.VALIDATE_EMPTY_FIELDS&lt;/param-name&gt;
   &lt;param-value&gt;true&lt;/param- value &gt;
&lt;/context-param&gt;
</pre><p>Mais, il est aussi possible de forcer le champ vide à <code>null</code> avec le paramètre assez explicite suivant :</p><pre class="brush: java; title: ; notranslate">
&lt;context-param&gt;
   &lt;param-name&gt;javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL&lt;/param-name&gt;
   &lt;param-value&gt;true&lt;/param- value &gt;
&lt;/context-param&gt;
</pre><p>Dernier point abordé, la validation multiple avec plusieurs approches :</p><ul><li>Avant la construction du modèle avec un test de tous les champs sur un événement PostValidateEvent ;</li><li>Après la construction du modèle avec Bean-Validation (mais un objet a déjà été construit&#8230; à vous de vous faire votre idée).</li></ul><h3><a
name="BOF"></a>BOF</h3><p>Au niveau des sujets esquivés en conférence, quid d&#8217;un projet comme Spring Web Flow pour la gestion d&#8217;un flow de page qui est supporté par Seam mais pas par JSF ? Une des réponses est que le projet est plutôt complexe et mériterait peut-être une spécification plus globale pour définir ce qu&#8217;est un flow de page, les événements autour de ce flow&#8230; Il n&#8217;en reste pas moins que JSF 2.0 supporte parfaitement le mode <em>Stateless</em> mais pour l&#8217;instant le <em>Stateful</em> ne l&#8217;est pas&#8230;</p><p>Au niveau des tags ajax embarqués, il devrait être assez simple de brancher un jQuery ou un Script.aculo.us sur JSF 2.0 et profiter d&#8217;une expérience Ajax complète. Reste à voir l&#8217;intégration avec des <em>Composite Components</em>.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Une présentation très rythmée avec beaucoup de slides (peut-être trop) qui ne laissent donc que très peu de temps pour la prise de note. Dommage car certains sujets, non évoqués dans cet article, auraient aussi mérité leur place. Mais ce n&#8217;est que partie remise pour un prochain article !</p><p>En tout cas, force est de constater que JSF 2.0 tend vraiment à une simplification d&#8217;utilisation, orienté annotation et zero-XML. Des <code>Composite Component</code> simples à écrire, une intégration gracieuse avec Bean-Validation&#8230; en bref, beaucoup de bons points !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-jsf-2/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/</link> <comments>http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#comments</comments> <pubDate>Mon, 26 Oct 2009 18:32:17 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Artifactory]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[VisualVM]]></category> <category><![CDATA[WADL]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3036</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. SOA SOA Manifesto : pragmatisme utopique ? WADL devient une Submission W3C Le coin de la technique Play! Framework 1.0 Mise à jour de VisualVM en 1.2 Comment concevoir un datacenter, &#8230; par Google Ca bouge dans la communauté Groovy/Grails Votre application web est [...]]]></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>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#SOAManifestopragmatismeutopiqu">SOA Manifesto : pragmatisme utopique ?</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#WADLsurlavoiedelastandardisati">WADL devient une <em>Submission</em> W3C</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#PlayFramework">Play! Framework 1.0</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#MisejourdeVisualVMen">Mise à jour de VisualVM en 1.2</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#Commentconcevoirundatacenterpa">Comment concevoir un datacenter, &#8230; par Google</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#CabougedanslacommunautGroovyGr">Ca bouge dans la communauté Groovy/Grails</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#Votreapplicationwebestellevuln">Votre application web est elle vulnérable ?</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#ArtifactoryvolutionsetmodeSaaS">Artifactory : évolutions et mode SaaS</a></li></ul><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SOAManifestopragmatismeutopiqu"></a>SOA Manifesto : pragmatisme utopique ?</h4><p>La communauté SOA vient de publier son <a
href="http://soa-manifesto.org/" title="SOA Manifesto" >SOA Manifesto</a>. Les valeurs sont très consensuelles, on pourrait même les trouver trop lisses quand on a vécu un naufrage SOA (avec l&#8217;oubli des objectifs métier, sa perfection naïve initiale, ses services faussement partagés qui finalement ne satisfont même pas le premier consommateur et autres ESB passe-plats).</p><p>Saluons tout de même cette initiative. SOA est une réalité. Les projets utopistes sont aujourd&#8217;hui minoritaires face à tous les projets qui intègrent des web services pour interconnecter les applications.<br
/> Le Manifeste SOA en français :<br
/> <strong>Valeur métier</strong> plutôt que stratégie technique,<br
/> <strong>Objectifs stratégiques</strong> plutôt que bénéfices spécifiques à un projet,<br
/> <strong>Interopérabilité intrinsèque</strong> plutôt qu&#8217;intégration propriétaire,<br
/> <strong>Services partagés</strong> plutôt qu&#8217;implémentation spécifique à un besoin particulier,<br
/> <strong>Flexibilité</strong> plutôt qu&#8217;optimisation,<br
/> <strong>Amélioration incrémentale</strong> plutôt que recherche de la perfection initiale.</p><p>Et rassurons-nous, ce n&#8217;est pas un manifesto qui empêchera les zélotes SOA de se déchirer. La guerre SOAP versus REST bat (toujours) son plein <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>Ils parlent du SOA Manifesto : <a
href="http://www.innoq.com/blog/st/2009/10/soa_manifesto.html" title="InfoQ SOA Manifesto" >InfoQ SOA Manifesto</a>, <a
href="http://www.innoq.com/blog/st/2009/10/comments_on_the_soa_manifesto.html" title="Stefan Tilkovs Weblog  Comments on SOA Manifesto" >Stefan Tilkov&#8217;s Weblog : Comments on SOA Manifesto</a>.</p><p>Allez, je retourne à mes web services Contract First avec CXF <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p><h4><a
name="WADLsurlavoiedelastandardisati"></a>WADL devient une <em>Submission</em> W3C</h4><p>Marc Hadley, auteur de la spécification <a
href="http://www.w3.org/Submission/2009/SUBM-wadl-20090831/" title="WADL" >WADL</a> et <em>spec-lead</em> de la JSR-311 (JAX-RS), <a
href="http://weblogs.java.net/blog/mhadley/archive/2009/10/23/wadl-submitted-w3c" title="a annonc" >a annoncé</a> que WADL venait d&#8217;être accepté en tant que <em>Submission</em> W3C.</p><p>Cette spécification portée par Sun a pour but de définir un format XML de description de services REST. Il s&#8217;agit donc d&#8217;un équivalent à WSDL pour REST. Alors que REST-*, porté par JBoss, a récemment <a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#LinitiativeRESTfaitdbat" title="relanc le dbat" >relancé le débat</a> sur la tendance récurrente à vouloir intégrer dans REST les fonctionnalités des très controversés WS-*, la soumission de WADL au W3C fait réapparaître la question de l&#8217;intérêt de définir des contrats pour des services REST.</p><p>Joe Gregorio <a
href="http://bitworking.org/news/193/Do-we-need-WADL" title="sopposait vivement" >s&#8217;opposait vivement</a> à l&#8217;initiative WADL il y a deux ans déjà. Il reprochait principalement :</p><ul><li>l&#8217;insuffisance de WADL pour définir élégamment tous les types de services REST</li><li>la fragilité du client qui ne fonctionne plus lorsque le contrat change comme c&#8217;est déjà le cas avec WSDL</li><li>le manque de réalisme de l&#8217;approche WADL2Java qui ne permettrait pas la pleine exploitation de REST. Il préférait donc une approche d&#8217;écriture du client REST manuelle, en se basant sur un socle commun.</li></ul><p>Toutefois, l&#8217;approche &laquo;&nbsp;REST avec un contrat&nbsp;&raquo; est séduisante pour les applications d&#8217;entreprise dont les services sont souvent aussi nombreux que les consommateurs variés.<br
/> C&#8217;est dans cette logique que de nombreux projets lèvent les ambiguïtés de leurs services REST en préférant XSD à JSON. Les URL et paramètres d&#8217;appel restant alors décrits uniquement dans une documentation annexe.</p><p>Par ailleurs, on peut regretter que WADL n&#8217;ait pas mieux adressé que WSDL des problèmes aussi important que le <em>versioning</em> des services alors qu&#8217;un projet comme <a
href="http://incubator.apache.org/thrift/" title="Apache Thrift" >Apache Thrift</a> a su être innovant sur le sujet.</p><p>La soumission de WADL au W3C n&#8217;implique donc pas forcément son succès à venir. La disponibilité en masse d&#8217;outils et de <em>frameworks</em> permettant de gérer ce format pourrait en revanche attirer une partie des adeptes de SOAP.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="PlayFramework"></a>Play! Framework 1.0</h4><p><a
href="http://www.theserverside.com/" title="The Server Side" >The Server Side</a> nous annonce la sortie de <a
href="http://www.playframework.org/" title="Play! Framework" >Play! Framework</a> en version 1.0.</p><p>Play! est un framework web de haute productivité (tout comme <a
href="http://grails.org/" title="Grails" >Grails</a> ou <a
href="http://www.springsource.org/roo" title="Spring Roo" >Spring Roo</a>) qui simplifie la création et le développement d&#8217;applications Web en langage Java. Ce framework <em>full stack</em> inclut tout une batterie de composants tels que Groovy (pour le <em>templating</em>), Apache Mina mais aussi Hibernate. Quant à l&#8217;architecture de vos projets Play!, elle sera de type RESTful.</p><p>Cette <a
href="http://vimeo.com/7087610" title="vido" >vidéo</a> nous donne un bon aperçu du produit, surtout en ce qui concerne le fameux <em>Fix the bug and hit reload !</em> c&#8217;est à dire pas de compilation, de déploiement ou de redémarrage serveur suite à la modification de vos classes Java, juste un rafraîchissement de votre navigateur pour voir vos modifications.</p><p>A noter que l&#8217;équipe travaille déjà sur la version 1.1 et, entre autres, sur le support de <a
href="http://www.scala-lang.org/" title="Scala" >Scala</a></p><p>Pour les liens utiles, la documentation complète du produit se trouve sur cette <a
href="http://www.playframework.org/documentation" title="page" >page</a>. Le téléchargement se passe par <a
href="http://download.playframework.org/" title="ici" >ici</a>. Et, comme le rappelle TSS, n&#8217;oubliez pas la présentation <a
href="http://www.devoxx.com/display/DV09/Play+framework+in+practice" title="Play! framework in practice" >Play! framework in practice</a> à Devoxx, en tous cas nous y serons !</p><h4><a
name="MisejourdeVisualVMen"></a>Mise à jour de VisualVM en 1.2</h4><p>8 mois après la sortie de la version 1.1, l&#8217;équipe nous gratifie d&#8217;une nouvelle version de son outil de monitoring de JVM. Avec un passage de 1.1.1 à 1.2, il ne faut pas s&#8217;attendre à de grandes révolutions. Une liste de <a
href="https://visualvm.dev.java.net/issues/buglist.cgi?Submit+query=Submit+query&#038;issue_type=DEFECT&#038;component=visualvm&#038;resolution=FIXED&#038;target_milestone=1.2&#038;email1=&#038;emailtype1=exact&#038;emailassigned_to1=1&#038;email2=&#038;emailtype2=exact&#038;emailreporter2=1&#038;issueidtype=include&#038;issue_id=&#038;changedin=&#038;votes=&#038;chfield=creation_ts&#038;chfieldfrom=&#038;chfieldto=Now&#038;chfieldvalue=&#038;short_desc=&#038;short_desc_type=fulltext&#038;long_desc=&#038;long_desc_type=fulltext&#038;issue_file_loc=&#038;issue_file_loc_type=fulltext&#038;status_whiteboard=&#038;status_whiteboard_type=fulltext&#038;field0-0-0=noop&#038;type0-0-0=noop&#038;value0-0-0=&#038;cmdtype=doit&#038;order=Reuse+same+sort+as+last+time" title="31 bugs corrigs" >31 bugs corrigés</a>, suivie de quelques nouvelles fonctionnalités notables:</p><ul><li>Un sampling profiler CPU et mémoire</li><li>Support de plusieurs instances de JStatd</li><li>Amélioration de l&#8217;API de génération de graphes</li><li>Sauvegarde d&#8217;un snapshot de l&#8217;application dans un fichier nps pouvant-être utilisé plus tard pour analyse</li></ul><p>Nous vous passons les améliorations de GUI et le support des proxys qui peut toujours s&#8217;avérer utile pour les analyses à distance. La vraie grande nouveauté c&#8217;est le plugin permettant de profiler l&#8217;application par sampling. Il ne faut pas s&#8217;attendre à la précision des outils instrumentant l&#8217;application comme <a
href="http://www.jinspired.com/products/jxinsight/" title="JXInsight" >JXInsight</a>. Cependant, cela permettra une analyse assez poussée sans impact sur les performances.</p><h4><a
name="Commentconcevoirundatacenterpa"></a>Comment concevoir un datacenter, &#8230; par Google</h4><p>Lors de la conférence Ladis 2009 (<b>La</b>rge Scale <b>Di</b>stributed <b>S</b>ystems and Middleware), <a
href="http://research.google.com/people/jeff/index.html" title="Jeff Dean" >Jeff Dean</a>, du groupe infrastructure chez Google, a présenté <a
href="http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf" title="les manires de concevoir un systme distribu" >les manières de concevoir un système distribué</a>.</p><p>Il passe en revue différentes problématiques :</p><ul><li>Infrastructure</li><li>Stockage</li><li>Clustering</li><li>Échange de données sur le réseau</li><li>Communication entre applications</li><li>Construction d&#8217;application sur de telles infrastructures</li></ul><p>Il est intéressant de voir les problématiques posées et les solutions proposées, sur des problématiques que nous avons trop tendance à oublier en tant que développeurs. Citons entre autres :</p><ul><li>Latence réseau : un critère important, car difficile à optimiser</li><li>Bande passante du réseau</li><li>Capacité de stockage (mémoire et disque)</li></ul><p>Il est donc très important même pour un <a
href="http://surana.wordpress.com/2009/01/01/numbers-everyone-should-know/" title="dveloppeur davoir ces chiffres en tte" >développeur d&#8217;avoir ces chiffres en tête</a>.</p><p>Par retour d&#8217;expérience, Jeff Dean montre les joies d&#8217;interagir avec du matériel physique. Les applications ne doivent pas supposer que le matériel est infaillible, il y a différentes erreurs que nos applications doivent gérer. Quand on voit les nombres d&#8217;occurrences de ce type de problème et leur nature, leur gestion par l&#8217;application n&#8217;est pas aussi triviale qu&#8217;il y parait :</p><ul><li>Problème DNS</li><li>Plantage de serveur</li><li>Perte de connections</li><li>&#8230;</li></ul><p>Cette présentation est très riche, et elle permet de voir les tenants et aboutissants d&#8217;une bonne infrastructure mais aussi les impacts que cela peut avoir dans nos développements de tous les jours.</p><p>Les contraintes que s&#8217;est imposé Google en terme de disponibilité, dimensionnement, &#8230;  ont amené plusieurs innovations technologiques en terme d&#8217;infrastructure qui ont des impacts sur le développement applicatif :</p><ul><li>Protocol Buffer</li><li>MapReduce</li><li>Google File System</li><li>Big Table</li></ul><p>Les lecteurs intéressés par les innovations mises en place par Google sur ses infrastructures noteront que Gregor Hohpe (auteur de <a
href="http://www.eaipatterns.com/" title="Enterprise Integration Patterns" >Enterprise Integration Patterns</a>) présentera à Devoxx une session <a
href="http://www.devoxx.com/display/DV09/Distributed+Programming+the+Google+Way" title="Distributed Programming the Google Way" >Distributed Programming the Google Way</a>.</p><h4><a
name="CabougedanslacommunautGroovyGr"></a>Ca bouge dans la communauté Groovy/Grails</h4><p>Pour commencer, on peut noter <a
href="http://www.infoq.com/presentations/Web-Development-Grails-Graeme-Rocher" title="la longue prsentation de Grails" >la longue présentation de Grails</a> faite par Graeme Rocher sur InfoQ. Le &laquo;&nbsp;papa&nbsp;&raquo; de Grails revient sur de nombreux points relatifs à ce très bon framework permettant de créer des applications web rapidement en bénéficiant de la puissance de Java, Groovy, Hibernate, Spring&#8230;</p><p>Ensuite, et c&#8217;est la rançon du succès, il y a beaucoup de discussions et d&#8217;interrogations autour des besoins auxquels répondent Groovy et Grails. <a
href="http://blog.peterdelahunty.com/2009/10/grails-iron-man-suit-for-tony-stark.html" title="Sur son blog" >Sur son blog</a>, Peter Delahunty précise par exemple que, pour lui, Grails n&#8217;est l&#8217;arme absolue que si on a une bonne connaissance des technologies sous-jacentes (Spring, Hibernate&#8230;). Il ne faut pas débuter par Grails sans s&#8217;attendre à bloquer sur des problèmes relatifs à ces technologies.</p><p><a
href="http://www.danielhonig.info/index.php?/archives/1-Groovy-and-Grails-Java-Skills-Not-Directly-Relevant.html" title="Cet article" >Cet article</a> va dans le même sens et rappelle qu&#8217;à partir du moment où l&#8217;on parle de &laquo;&nbsp;la magie Groovy&nbsp;&raquo; il faut être conscient que des choses qui n&#8217;ont rien de magique (cela reste du code !) se passent. Les &laquo;&nbsp;dynamic finders&nbsp;&raquo;, le MOP (Meta Object Protocol) et la magie des closures font rêver mais s&#8217;expliquent bel et bien ! Ensuite, il y est noté que la proximité de Groovy et Java fait que de nombreuses personnes pensent que l&#8217;on peut passer de Java à Groovy sans formation particulière. Si l&#8217;on ne comprend pas les principes de ces choses magiques et que l&#8217;on se contente de les accepter comme tels, on s&#8217;expose tôt ou tard à des retours de flamme sévères qui se matérialisent généralement sous la forme de StackTraces incompréhensibles. Enfin, le manque de support professionnel pour Groovy/Grails est évoqué. Sur ce point, je pense que l&#8217;auteur se trompe. On note en effet que Springsource semble fournir un <a
href="http://www.springsource.com/services/enterprisesupport" title="support commercial pour ces technologies" >support commercial pour ces technologies</a>. Mais, il y a peu, Groovy et Grails n&#8217;étaient pas encore dans le giron de Springsource et l&#8217;on devait &laquo;&nbsp;se contenter&nbsp;&raquo; du support de la communauté. Néanmoins, celui-ci a toujours été assez réactif et de bon niveau.</p><p>Toujours concernant Groovy, on peut noter la version Community Edition de l&#8217;IDE IntelliJ, tout récemment publiée, semble <a
href="http://mrhaki.blogspot.com/2009/10/groovy-intentions-in-intellij-idea.html" title="bien lotie" >bien lotie</a> au niveau du support de ce langage. Malheureusement, le support de Grails, lui, n&#8217;est <a
href="http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html" title="pas prsent dans cette version" >pas présent dans cette version</a>.</p><h4><a
name="Votreapplicationwebestellevuln"></a>Votre application web est elle vulnérable ?</h4><p>Le Web Application Security Consortium (WASC) estime que 87% des applications de la toile sont vulnérables. Tout le monde ne peut pas s&#8217;offrir les services d&#8217;un expert en sécurité, et un développeur ne peut pas écrire du code sécurisé s&#8217;il ne connaît ou ne comprends pas les risques auxquels il s&#8217;expose. C&#8217;est pour cette raison que DeveloperWorks revient sur les principales failles de sécurité qui nous guettent, et quelques outils simples pour analyser notre code.<br
/> Les points de faiblesse les plus connus sont :</p><ul><li>le cross site scripting : le pirate injecte, via un autre site (de type forum par exemple), un script (de type javascript) vers le site visé. Ce script lui permet de récupérer des informations de connexion, des cookies&#8230;</li><li>l&#8217;injection de SQL : le pirate saisit du code SQL dans un formulaire web. Celui-ci est poussé jusqu&#8217;à la base, exécuté et donne (le plus souvent) accès à la base &#8216;en direct&#8217; au pirate (l&#8217;un des exemples le plus connus est l&#8217;injection de <em>OR 1=1-</em> dans un formulaire d&#8217;authentification, qui retourne alors toujours TRUE).</li></ul><p>Et <a
href="http://blog.xebia.fr/2009/06/30/jazoon-jour-3-agile-et-securite/" title="lon reparle de lOWASP" >l&#8217;on reparle de l&#8217;OWASP</a>, qui propose un outil open source pour détecter ces erreurs de conception : WebScarab. WebScarab s&#8217;utilise comme un proxy HTTP (qui se place entre votre browser et votre serveur d&#8217;applications, par simple redirection des ports). Ensuite, un simple fichier .txt permet d&#8217;injecter votre site avec quelques-uns des plus célèbres cas de cross site scripting ou d&#8217;injection SQL. Un autre outil open source est présenté, d&#8217;un fonctionnement similaire, Paros Proxy.<br
/> Reste ensuite à détecter les faux positifs, opération généralement manuelle.</p><p>On notera que la section <a
href="http://www.ibm.com/developerworks/web/library/wa-appsecurity/?S_TACT=105AGX01&#038;S_CMP=HP&#038;ca=drs-#resources" title="Ressources" >Ressources</a> de l&#8217;article original est richement fournie, et permet de réellement comprendre les risques auxquels sont exposées les applications accessibles sur internet.</p><p>Saurez-vous trouver les failles du site de test <a
href="http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project" title="Webgoat" >Webgoat</a> ?</p><h4><a
name="ArtifactoryvolutionsetmodeSaaS"></a>Artifactory : évolutions et mode SaaS</h4><p><a
href="http://www.jfrog.org/products.php" title="Artifactory" >Artifactory</a> est un <em>repository</em> Maven dont la principale particularité est de s&#8217;appuyer sur <a
href="http://en.wikipedia.org/wiki/Content_repository_API_for_Java" title="Java Content Repository (JCR)" >Java Content Repository (JCR)</a> pour assurer le stockage des artefacts. Le choix de JCR plutôt qu&#8217;un simple système de fichiers n&#8217;avait pas fait l&#8217;unanimité car il rend les tâches courantes d&#8217;administration plus délicates. En effet, lorsque l&#8217;on veut supprimer, remplacer ou déplacer un ensemble d&#8217;artefacts, l&#8217;action est triviale lorsque le système de fichier est utilisé alors qu&#8217;elle devient plus complexe avec JCR, qui n&#8217;est pas aussi directement manipulable.</p><p>Conscient de ce problème <a
href="http://www.jfrog.org" title="JFrog" >JFrog</a>, l&#8217;éditeur derrière Artifactory, a peu à peu intégré un certain nombre de fonctionnalités permettant d&#8217;effectuer ces tâches courantes d&#8217;administration des artefacts directement depuis l&#8217;interface Web. Ainsi, la dernière version du projet permet même le déplacement d&#8217;artefacts entre plusieurs <em>repository</em>.</p><p>Début septembre, JFrog a également lancé <a
href="http://www.jfrog.org/art-online.php" title="ArtifactoryOnline" >ArtifactoryOnline</a>, un service d&#8217;hébergement de <em>repository</em> Maven Artifactory en mode SaaS (Software as a Service). Ce type d&#8217;offre répond clairement à un besoin puisque la présence d&#8217;un <em>repository</em> Maven est souhaitable pour de nombreux cas d&#8217;utilisation et que cette infrastructure nécessite du temps et du matériel dont ne disposent pas toujours les équipes de taille réduite.</p><p>Par ces innovations, le <em>repository</em> Maven de JFrog saura sûrement séduire les utilisateurs déçus par les solutions concurrentes que sont <a
href="http://nexus.sonatype.org/" title="Nexus" >Nexus</a> et <a
href="http://archiva.apache.org/" title="Archiva" >Archiva</a>.</p><p><em>Article mis à jour le 26/10/2009 à 21h25</em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/</link> <comments>http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/#comments</comments> <pubDate>Mon, 27 Jul 2009 16:02:37 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[DBMS]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[GAE]]></category> <category><![CDATA[Gaelyk]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Hadoop]]></category> <category><![CDATA[HadoopDB]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JPA]]></category> <category><![CDATA[mapreduce]]></category> <category><![CDATA[Mockito]]></category> <category><![CDATA[PostGIS]]></category> <category><![CDATA[RIA]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2584</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. RIA Mockito-Flex Le coin de la technique JPA implementation patterns HadoopDB : un hybride entre MapReduce et DBMS Gaelyk ou Groovy sur AppEngine PostGIS, le SIG Open Source qui monte Evènements de notre communauté en France et à l&#8217;étranger Enquête JavaEE 6 RIA Mockito-Flex [...]]]></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>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/#MockitoFlex">Mockito-Flex</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/#JPAimplementationpatterns">JPA implementation patterns</a></li><li><a
href="http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/#HadoopDBunhybrideentreMapReduc">HadoopDB : un hybride entre MapReduce et DBMS</a></li><li><a
href="http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/#GaelykouGroovysurAppEngine">Gaelyk ou Groovy sur AppEngine</a></li><li><a
href="http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/#PostGISleSIGOpenSourcequimonte">PostGIS, le SIG Open Source qui monte</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/27/revue-de-presse-xebia-119/#EnquteJavaEE">Enquête JavaEE 6</a></li></ul><h3><a
name="RIA"></a>RIA</h3><h4><a
name="MockitoFlex"></a>Mockito-Flex</h4><p>Un mois après la sortie de la version 1.0, <a
href="http://bitbucket.org/loomis/mockito-flex/wiki/Home" title="MockitoFlex" >Mockito-Flex</a> se met à jour en 1.0.1. Une <em>release</em> mineure donc mais qui apporte toutefois son petit lot de nouveautés (<em>matchers</em> <code>anyOf(type:Class)</code>, <code>notNull()</code> &#8230;).</p><p>Les utilisateurs de <a
href="http://mockito.org/" title="Mockito" >Mockito</a> ne seront pas perdus, le code Flex étant très similaire au code Java que ce soit pour les assertions ou pour le <code>verify</code>:</p><pre class="brush: java; title: ; notranslate">
var list:ArrayCollection = ArrayCollection(mock(ArrayCollection, &quot;collection&quot;, [[]]));
given(list.getItemAt(1)).willReturn(&quot;A&quot;);
assertEquals(&quot;A&quot;, list.getItemAt(1));
assertNull(list.getItemAt(2));
...
var array:Array = mock(Array) as Array;
array.push(&quot;1&quot;);
array.pop();
verify().that(array.push(&quot;1&quot;));
verify().that(array.pop());
</pre><p>Le projet est très récent et néanmoins en bonne voie : article sur <a
href="http://www.infoq.com/news/2009/07/mockito-java-flex" title="InfoQ" >InfoQ</a>, <a
href="http://groups.google.com/group/mockito-flex?pli=1" title="mailing-list" >mailing-list</a>, <a
href="http://bitbucket.org/loomis/mockito-flex/wiki/tutorials/Tutorial1.0" title="tutoriel" >tutoriel</a>&#8230; Comme toujours, rendez-vous est pris dans la <a
href="http://bitbucket.org/loomis/mockito-flex/downloads/" title="section tlchargements" >section téléchargements</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="JPAimplementationpatterns"></a>JPA implementation patterns</h4><p>Vincent Partington, collègue de Xebia Hollande, a réalisé <a
href="http://blog.xebia.com/2009/07/13/jpa-implementation-patterns-wrap-up/" title="une srie darticles autour de la spcification JPA" >une série d&#8217;articles autour de la spécification JPA</a>. Ses articles sont un complément à la documentation existante afin de faire le tour sur les fondamentaux et les faux-amis de JPA :</p><ul><li><a
href="http://blog.xebia.com/2009/03/09/jpa-implementation-patterns-data-access-objects/" title="Dao gnrique" >Dao générique</a></li><li><a
href="http://blog.xebia.com/2009/03/23/jpa-implementation-patterns-saving-detached-entities/" title="Persister" >Persister</a>, <a
href="http://blog.xebia.com/2009/04/03/jpa-implementation-patterns-retrieving-entities/" title="retrouver" >retrouver</a>, <a
href="http://blog.xebia.com/2009/04/09/jpa-implementation-patterns-removing-entities/" title="effacer" >effacer</a> une entité</li><li><a
href="http://blog.xebia.com/2009/05/11/jpa-implementation-patterns-service-facades-and-data-transfers-objects/" title="Pattern darchitecture  Pour ou contre les DAO DTO ou facade service " >Pattern d&#8217;architecture : Pour ou contre les DAO, DTO ou facade service, &#8230;</a></li><li>Et bien d&#8217;autres patterns &#8230;</li></ul><p>JPA et ses implémentations (telle qu&#8217;Hibernate) restent une technologie difficile à maitriser, et ces articles vous aideront à prendre des décisions techniques importantes pour vos projets.</p><h4><a
name="HadoopDBunhybrideentreMapReduc"></a>HadoopDB : un hybride entre MapReduce et DBMS</h4><p>Daniel Abadi <a
href="http://dbmsmusings.blogspot.com/2009/07/announcing-release-of-hadoopdb-longer.html" title="a présenté" >a présenté</a> <a
href="http://db.cs.yale.edu/hadoopdb/hadoopdb.html" title="HadoopDB" >HadoopDB</a>, un projet issu des universités de Yale et de Brown, qu&#8217;il qualifie d&#8217;hybride entre MapReduce et DBMS classique. Il s&#8217;agit d&#8217;une extension pour <a
href="http://hadoop.apache.org/" title="Hadoop" >Hadoop</a> et <a
href="http://wiki.apache.org/hadoop/Hive" title="Hive" >Hive</a> qui permet d&#8217;utiliser une base de données en remplacement de HDFS, le <em>file system</em> distribué utilisé par Hadoop.</p><p>Concrètement chaque nœud Hadoop embarque son propre serveur de base de données. HadoopDB reçoit des requêtes SQL qu&#8217;il analyse, traduit en tâches MapReduce qui seront envoyées sur chacun des nœuds du <em>cluster</em> Hadoop, puis retraduites en SQL pour être finalement exécutées par la base de données sous-jacente <em>(SQL to MapReduce to SQL Planner)</em>.</p><p>L&#8217;ensemble du projet est décrit dans la <a
href="http://db.cs.yale.edu/hadoopdb/hadoopdb.pdf" title="publication qui lui est consacrée" >publication qui lui est consacrée</a>. Celle-ci présente en détail les réflexions qui ont accompagné la conception d&#8217;HadoopDB et les performances obtenues faces à des DBMS parallèles dédiés à l&#8217;analyse de données tels que <a
href="http://www.vertica.com/" title="Vertica" >Vertica</a>. Si les performances mesurées d&#8217;HadoopDB sont en léger retrait face à Vertica, l&#8217;auteur met en avant que sa solution repose uniquement sur des technologies Open Source et qu&#8217;une base de données relationnelle (PostgreSQL) a été utilisée : il espère de meilleurs résultats en utilisant une <a
href="http://en.wikipedia.org/wiki/Column-oriented_DBMS" title="base de donnes oriente colonnes" >base de données orientée colonnes</a>.</p><h4><a
name="GaelykouGroovysurAppEngine"></a>Gaelyk ou Groovy sur AppEngine</h4><p>Parmi les sujets traités régulièrement sur notre blog, on retrouve <a
href="http://blog.xebia.fr/?s=groovy" title="Groovy" >Groovy</a> et <a
href="http://blog.xebia.fr/?s=appengine" title="Google AppEngine (GAE)" >Google AppEngine (GAE)</a>. Qu&#8217;obtient-on en mélangeant ? Et bien le dernier projet de <a
href="http://marceloverdijk.blogspot.com/" title="Marcel Overdijk" >Marcel Overdijk</a> et de <a
href="http://glaforge.free.fr/blog/groovy" title="Guillaume Laforge" >Guillaume Laforge</a> à savoir <a
href="http://gaelyk.appspot.com/" title="Gaelyk" >Gaelyk</a> (<a
href="http://www.gg3721.com/list/49/436662.html" title="annonce" >annonce</a>).</p><p>Le toolkit s&#8217;appuie sur <a
href="http://groovy.codehaus.org/Groovlets" title="Groovlets" >Groovlets</a> et <a
href="http://groovy.codehaus.org/Groovy+Templates" title="Groovy Template" >Groovy Template</a>, et permet de déployer rapidement de petites applications sur GAE. Les auteurs rappellent en effet que pour de plus grosses applications, il vaut mieux se tourner vers <a
href="http://www.grails.org/" title="Grails" >Grails</a>.</p><p>Le <a
href="http://gaelyk.appspot.com/tutorial/" title="tutoriel" >tutoriel</a> très complet permet de faire un rapide tour d&#8217;horizon de Gaelyk.<br
/> Celui-ci décrit l&#8217;arborescence d&#8217;un projet Gaelyk, la configuration du <code>web.xml</code> et du <code>appengine-web.xml</code>.<br
/> La partie <em>vues et contrôleurs</em> s&#8217;intéresse :</p><ul><li>aux variables implicites mises en place par la servlet principale (<code>eager</code> avec <code>request, response, context, session</code>&#8230; et <code>lazy</code> avec <code>out, html...</code>),</li><li>aux Groovy Templates, avec plusieurs exemples de <code>gtpl</code>, gestion des <code>incude</code> et <code>redirect</code>,</li><li>aux Groovlets, avec là aussi plusieurs exemples de scripts.</li></ul><p>Enfin, une dernière partie détaille les ajouts de syntaxes/méthodes spécifiques à Google AppEngine (envoi de mails, <code>Entity</code>, <code>withTransaction()</code>&#8230;) et explique comment déployer son application.<br
/> Un exemple d&#8217;application qui utilise Gaelyk est la <a
href="http://groovyconsole.appspot.com/" title="Groovy Web Console" >Groovy Web Console</a>, ou l&#8217;écriture de code Groovy <em>live</em>. Alors, un petit <a
href="http://gaelyk.appspot.com/download/" title="HelloWorld" >HelloWorld</a> ?</p><h4><a
name="PostGISleSIGOpenSourcequimonte"></a>PostGIS, le SIG Open Source qui monte</h4><p>Les <a
href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_d%27information_g%C3%A9ographique" title="SIG (Systèmes d'Information Géographique)" >SIG (Systèmes d&#8217;Information Géographique)</a> prennent de nos jours une nouvelle dimension avec la généralisation progressive de terminaux mobiles connectés à Internet et capables de se géolocaliser ou encore avec les sites Web riches proposant des cartes, des calculs d&#8217;itinéraires ou des recherches du plus proche point de vente. A travers cette évolution, un plus grand nombre d&#8217;entreprises peut potentiellement être intéressé par les SIG.</p><p>Alors que pendant un temps les principaux acteurs sur ce marché étaient des produits commerciaux, <a
href="http://en.wikipedia.org/wiki/List_of_GIS_software" title="on trouve désormais une offre Open Source" >on trouve désormais une offre Open Source</a> : <a
href="http://forge.mysql.com/wiki/GIS_Functions" title="MySQL Spacial" >MySQL Spacial</a>, <a
href="http://geosysin.iict.ch/irstv-trac/wiki/H2spatial/Download" title="H2Spacial" >H2Spacial</a>, <a
href="http://www.gaia-gis.it/spatialite-2.0/index.html" title="SpacialLite" >SpacialLite</a> et <a
href="http://postgis.refractions.net/" title="PostGIS" >PostGIS</a>.<br
/> Au sein de cette offre, <a
href="http://postgis.refractions.net/" title="PostGIS" >PostGIS</a>, une extension de <a
href="http://www.postgresql.org/" title="PostgreSQL" >PostgreSQL</a> qui a fait son apparition il y a 4 ans, se distingue par sa maturité et sa popularité. Ainsi, l&#8217;éditeur Manning a récemment annoncé <a
href="http://manning.com/obe/" title="un ouvrage qui lui sera consacr" >un ouvrage qui lui sera consacré</a> pour début 2010.</p><p>Le site du projet <a
href="http://postgis.refractions.net/news/20090724/" title="vient d'annoncer la disponibilité" >vient d&#8217;annoncer la disponibilité</a> de la version 1.4 de PostGIS apportant son lot d&#8217;améliorations et de corrections. Le driver JDBC dédié, composé principalement d&#8217;extensions à l&#8217;API JDBC standard, est lui aussi mis à jour, on le trouve dans <a
href="http://postgis.refractions.net/download/" title="la mme archive que PostGIS" >la même archive que PostGIS</a>.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="EnquteJavaEE"></a>Enquête JavaEE 6</h4><p>Sun, <a
href="http://www.theserverside.com/news/thread.tss?thread_id=55247" title="via TheServerSide" >via TheServerSide</a>, relance la communauté Java pour <a
href="http://www.sun.com/training/ee6_jtasurvey.html" title="ses cinq enqutes  thme auprs des dveloppeurs JavaEE6" >ses cinq enquêtes à thème auprès des développeurs JavaEE6</a>. Ces enquêtes doivent servir à optimiser les cours et les certifications JavaEE 6. Si vous êtes prêts à donner cinq minutes de votre temps à l&#8217;amélioration de la formation Java, n&#8217;attendez plus, vous avez jusqu&#8217;au 31 juillet.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/07/27/revue-de-presse-xebia-119/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Jazoon &#8211; Jour 3 &#8211; Un arbre est tombé</title><link>http://blog.xebia.fr/2009/06/26/jazoon-jour-3-un-arbre-est-tombe/</link> <comments>http://blog.xebia.fr/2009/06/26/jazoon-jour-3-un-arbre-est-tombe/#comments</comments> <pubDate>Fri, 26 Jun 2009 09:27:51 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[dmServer]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[jazoon]]></category> <category><![CDATA[ROO]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Sun]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2394</guid> <description><![CDATA[Hier avait lieu la dernière journée de Jazoon. Et pour changer, l&#8217;opening keynote n&#8217;était pas tenue par Sun, mais par Adrian Colyer, CTO de SpringSource. Et le moins que l&#8217;on puisse dire, c&#8217;est que le changement de ton a été radical. Par une analogie avec la forêt primaire, A. Colyer a annoncé la chute de [...]]]></description> <content:encoded><![CDATA[<p>Hier avait lieu la dernière journée de Jazoon.</p><p>Et pour changer, l&#8217;opening keynote n&#8217;était pas tenue par Sun, mais par Adrian Colyer, CTO de SpringSource. Et le moins que l&#8217;on puisse dire, c&#8217;est que le changement de ton a été radical.</p><p>Par une analogie avec la forêt primaire, A. Colyer a annoncé la chute de Sun, et la très prochaine émergence de nouvelles firmes leader dans le monde JEE <em>(on imagine bien que SpringSource fait partie de ces nouvelles pousses)</em>.<br
/> Il a expliqué la chute de Sun sous un angle différent de celui du pur rachat financier : selon lui, les acteurs du monde JEE ne veulent plus suivre les recommandations <em>(dogmes)</em> énoncés par Sun, et c&#8217;est pour cela que nous voyons apparaitre de nouveaux langages, mais aussi de nouvelles volontés de modulariser la monolithique stack JEE.</p><p>Il a ensuite donné sa vision du futur. Sur les langages dynamiques d&#8217;abord, et en prenant un fort pari sur l&#8217;avenir <em>(comme Neal Ford l&#8217;avait fait avec Clojure)</em>. Dans les candidats au &laquo;&nbsp;java.next&nbsp;&raquo; langage, il a cité Erlang, JRuby, Groovy, Clojure, <a
href="http://blog.xebia.fr/2008/03/21/introduction-a-scala/">Scala</a>, Jython et Ruby. Il a rapidement éliminé tous ceux qui ne tournent pas sur une JVM <em>(lui aussi pense que la force de Java est sa JVM, un thème récurrent durant ce Jazoon)</em>.<br
/> Restent donc 4 candidats : deux orientés fortement syntaxe et framework <em>(Groovy et JRuby)</em>, et deux orientés gestion de la concurrence <em>(<a
href="http://blog.xebia.fr/2008/03/21/introduction-a-scala/">Scala</a> et Clojure)</em>. Selon Adrian, le prochain langage star devra, pour bénéficier d&#8217;une adoption large et rapide, avoir une syntaxe proche de Java, ce qui élimine rapidement Clojure et <a
href="http://blog.xebia.fr/2008/03/21/introduction-a-scala/">Scala</a>. Attention cependant, cela ne signifie pas que ces langages sont plus faibles, mais simplement qu&#8217;ils ont moins de chances d&#8217;être largement adoptés.<br
/> Restent donc Groovy/Grails face à JRuby/Rails.<br
/> La deuxième force que devront posséder ces langages est leur capacité à se mélanger avec Java <em>(en ayant des interactions bidirectionnelles)</em>, car les millions de programmes Java actuellement en production ne risquent pas de disparaitre du jour au lendemain. Dans ce domaine, Adrian donne l&#8217;avantage à Groovy, d&#8217;autant plus que Grails  interagit avec un framework très largement adopté : Spring.</p><p>Le CTO de SpringSource a réussi ensuite une belle pirouette : à ceux qui vont lui reprocher de mettre en avant deux poulains de l&#8217;écurie SpringSource <em>(Groovy et Grails)</em>, il répond que si ils font partie de sa firme, c&#8217;est bien parce qu&#8217;il croit qu&#8217;ils sont l&#8217;avenir&#8230; Imparable.</p><p>Autre sujet, les frameworks qui vont se développer autour de ces nouveaux langages. Il cite Grails, Rails, Lift <em>(framework pour <a
href="http://blog.xebia.fr/2008/03/21/introduction-a-scala/">Scala</a>)</em> et <a
href="http://blog.xebia.fr/2009/05/03/springone-2009-synthese/">Spring ROO</a>. Ils sont l&#8217;avenir, car même si ils demandent de sacrifier un peu de liberté, ils offrent une nette augmentation de productivité <em>(avec notamment la notion de scaffolding)</em>.</p><p>Sujet suivant, le nécessaire besoin de modularité dans la pile JEE. Avec <a
href="http://blog.xebia.fr/2008/10/16/osgi-au-paris-jug-slides-de-la-presentation/">OSGI</a> bien sûr, mais surtout avec le seul serveur d&#8217;application qui expose <a
href="http://blog.xebia.fr/2008/10/16/osgi-au-paris-jug-slides-de-la-presentation/">OSGI</a> à ses utilisateurs, à savoir le produit maison <a
href="http://blog.xebia.fr/2009/04/06/revue-de-presse-xebia-103/#LesnouveautsdufuturSpringSourc">dmServer</a> et sa notion de service BluePrint.</p><p>Enfin, et c&#8217;est une vision qu&#8217;on voyait clairement se dessiner depuis quelques mois, Adrian Colyer prévoit un changement de paradigme pour les techniciens que nous sommes : à l&#8217;avenir, il ne sera plus question de se concentrer uniquement sur la phase de développement dans le cycle de vie d&#8217;une application, mais d&#8217;embrasser la totalité de ce cycle, en particulier les phases de déploiement et de supervision <em>(on se souvient des annonces faites lors du rachat de Hyperic)</em>. Il a mis en avant la notion de BluePrint de déploiement : un déploiement, c&#8217;est une injection de références <em>(l&#8217;adresse de la DB)</em>, une injection de configuration <em>(la taille du pool de la dataSource)</em> et des considérations transverses <em>(sécurité, &#8230;)</em>. Bref, cela est très similaire à une configuration SpringCore, et il n&#8217;y a donc pas de raison que la stack Spring ne puisse pas s&#8217;en occuper !</p><p>Bref, les changements interviennent aujourd&#8217;hui à de très nombreux niveaux &#8230; Et une chose est sûre, <i>le futur arrive, que nous soyons prêt ou pas. Cette vague arrive, et la seule chose importante pour pouvoir la surfer est d&#8217;être dans l&#8217;eau au moment où elle arrivera.</i> Il est donc important, <i>dans ces temps troublés</i>, d&#8217;expérimenter et de prendre du plaisir, avant l&#8217;arrivée d&#8217;une autre période stable.</p><p>Nous retiendrons deux choses de cette keynote : comme tous les speakers qui ont donné ces conférences d&#8217;ouverture, Adrian Colyer est un orateur né, et il a une vision très précise du futur qu&#8217;il envisage. Deuxième enseignement, pour lui, Sun est à terre et il est temps que de nouveaux acteurs s&#8217;avancent pour prendre la place du <i>grand arbre</i>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/06/26/jazoon-jour-3-un-arbre-est-tombe/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Jazoon &#8211; Jour 1 &#8211; Groovy</title><link>http://blog.xebia.fr/2009/06/24/jazoon-jour-1-groovy/</link> <comments>http://blog.xebia.fr/2009/06/24/jazoon-jour-1-groovy/#comments</comments> <pubDate>Wed, 24 Jun 2009 08:36:18 +0000</pubDate> <dc:creator>Guillaume Mathias</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[jazoon]]></category> <category><![CDATA[language dynamique]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2317</guid> <description><![CDATA[L&#8217;un des sujets très présents dans cette 1ère journée était le langage Groovy, et plus généralement les langages dynamiques. Dierk König (Canoo) a commencé la matinée en présentant &#171;&#160;sept patterns d&#8217;utilisation de Groovy&#160;&#187; sur les projets. On a bien apprécié la concision du &#171;&#160;reader RSS en swing&#160;&#187; et le &#171;&#160;script ant musical&#160;&#187; (en faisant jouer [...]]]></description> <content:encoded><![CDATA[<p>L&#8217;un des sujets très présents dans cette 1ère journée était le langage Groovy, et plus généralement les langages dynamiques.</p><p>Dierk König <em>(Canoo)</em> a commencé la matinée en présentant &laquo;&nbsp;sept patterns d&#8217;utilisation de Groovy&nbsp;&raquo; sur les projets.<br
/> On a bien apprécié la concision du &laquo;&nbsp;reader RSS en swing&nbsp;&raquo; et le &laquo;&nbsp;script ant musical&nbsp;&raquo; <em>(en faisant jouer <a
href="http://www.jfugue.org/">jfugue</a> quelques notes au début et fin du build)</em>. Vous pouvez retrouver les <a
href="http://www.touilleur-express.fr/2009/06/23/jazoon-groovy-seven-usage-patterns/">7 points très bien résumés sur le blog du Touilleur Express</a>.<br
/> Pour l&#8217;anecdote, les extraits de code étaient tapés dans une console Groovy, recopiés caractère par caractère par &#8230; un script Groovy ! <em>(la classe, non ?)</em></p><p>Neal Ford <em>(ThoughtWorks)</em> a enchainé avec les &laquo;&nbsp;design patterns&nbsp;&raquo; dans les langages dynamiques : il a pris quelques patterns du GoF et a montré en quoi les langages dynamiques &#8211; comme Ruby ou Groovy &#8211; sont plus adaptés pour résoudre les problèmes posés par ces patterns.</p><p>Après un salade/saucisse/cornetto <em>(bon appétit)</em> rapidement avalé, ce fut le tour de <a
href="http://www.gradle.org/">Gradle</a>. Il s&#8217;agit d&#8217;un système de build qui élève Ant grâce à la puissance de Groovy. Il se veut plus souple que Maven et apporte les capacités de programmation des scripts Groovy <em>(boucles, conditions, etc)</em>.<br
/> Dommage que la présentation se soit contentée d&#8217;exemples du style &laquo;&nbsp;hello world&nbsp;&raquo;, c&#8217;est du coup assez difficile de juger le potentiel de l&#8217;outil. Néanmoins, ça a l&#8217;air prometteur.</p><p>Pour finir avec Groovy, Jetbrains nous a fait une démo très séduisante du support Groovy/Grails sur IntelliJ IDEA. C&#8217;est définitivement le <em>(seul)</em> meilleur outil pour coder en Groovy !</p><p>Jazoon nous confirme que les langages dynamiques gagnent du terrain, et Groovy est le grand représentant de ces langages dans la sphère Java.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/06/24/jazoon-jour-1-groovy/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/</link> <comments>http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/#comments</comments> <pubDate>Mon, 25 May 2009 16:50:06 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Flash]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[IntelliJ IDEA]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JDO]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Sun]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2041</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Sun veut créer un Java App Store MySQL forké par son fondateur RIA FlexBuilder devient FlashBuilder Le coin de la technique Nos IDEs se corrigent Les nouveautés de JDO 2.3 Evènements de notre communauté en France et à l&#8217;étranger Retour [...]]]></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/25/revue-de-presse-xebia-110/#SunveutcrerunJavaAppStore">Sun veut créer un Java App Store</a></li><li><a
href="http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/#MySQLforkparsonfondateur">MySQL forké par son fondateur</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/#FlexBuilderdevientFlashBuilder">FlexBuilder devient FlashBuilder</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/#NosIDEssecorrigent">Nos IDEs se corrigent</a></li><li><a
href="http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/#LesnouveautsdeJDO">Les nouveautés de JDO 2.3</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/05/25/revue-de-presse-xebia-110/#RetoursurlaGrlaConfrenceGroovy">Retour sur la Gr8, la Conférence Groovy</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="SunveutcrerunJavaAppStore"></a>Sun veut créer un Java App Store</h4><p>Jonathan Schwartz, CEO de Sun Microsystems, <a
href="http://blogs.sun.com/jonathan/entry/will_java_be_the_world" title="vient dannoncer sur son blog" >vient d&#8217;annoncer sur son blog</a> son intention de créer un Java App Store sur le même modèle que l&#8217;iPhone App Store. Aucun détail précis n&#8217;est fourni au-delà de l&#8217;annonce.</p><p><a
href="http://arstechnica.com/open-source/news/2009/05/sun-hopes-to-cash-in-on-java-install-base-with-new-app-store.ars" title="Ryan Paul fait une analyse raliste" >Ryan Paul fait une analyse réaliste</a> de ce projet en rappelant qu&#8217;il n&#8217;existe pas, selon lui, en dehors d&#8217;Azureus et Eclipse, d&#8217;applications Java pour PC très populaires et doute, par conséquent, du marché qui s&#8217;ouvrirait à cet App Store.</p><p>Reste qu&#8217;il s&#8217;agirait là d&#8217;un modèle de distribution d&#8217;application inédit sur PC qui pourrait séduire certains utilisateurs souhaitant obtenir facilement et rapidement des applications dont le niveau de qualité serait garanti par Sun, alors qu&#8217;actuellement les filières Open Source restent le principal vecteur de diffusion d&#8217;applications Java.</p><h4><a
name="MySQLforkparsonfondateur"></a>MySQL forké par son fondateur</h4><p><a
href="http://askmonty.org/wiki/index.php/Main_Page" title="Monty Program Ab" >Monty Program Ab</a> est une société créé par Michael Widenius, le fondateur de MySQL. Son but est de maintenir le projet <a
href="http://askmonty.org/wiki/index.php/MariaDB" title="MariaDB" >MariaDB</a>, un fork de MySQL estampillé &#8216;Open&#8217; et &#8216;Libre&#8217;, et d&#8217;offrir des services autour de ce projet. En collaboration avec Percona, une autre entreprise offrant de l&#8217;expertise MySQL, ils viennent de créer l&#8217;<a
href="http://opendatabasealliance.com/" title="Open Database Alliance" >Open Database Alliance</a> afin de former une entité unique derrière l&#8217;ensemble des développements MySQL libres.</p><p>Plusieurs réactions et analyses ont suivi l&#8217;annonce :</p><ul><li><a
href="http://it.toolbox.com/blogs/database-soup/monty-declares-open-database-alliance-31633" title="Josh Berkus met lhypothse" >Josh Berkus émet l&#8217;hypothèse</a> que l&#8217;équipe MySQL actuellement chez Sun soit embauchée par Monty Program Ab.</li><li><a
href="http://blogs.the451group.com/opensource/2009/05/21/are-closed-source-mysql-storage-engines-compatible-with-mariadb/" title="Matthew Aslett sinquite" >Matthew Aslett s&#8217;inquiète</a> des limitations qu&#8217;imposeront la licence GPL de MariaDB quant à l&#8217;inclusion d&#8217;un éventuel <em>storage engine</em> qui ne suivrait pas cette licence.</li><li><a
href="http://arstechnica.com/open-source/news/2009/05/open-database-alliance-hedges-against-oracle-plans-for-mysql.ars" title="Ryan Paul met en avant" >Ryan Paul met en avant</a> l&#8217;ambiguïté de cette annonce en raison de l&#8217;absence de définition du type de relation entre l&#8217;Alliance et Sun / Oracle.</li></ul><p>Dès lors, comme sur de nombreux autres sujets, il sera nécessaire d&#8217;attendre de connaître le positionnement d&#8217;Oracle sur la question MySQL pour pouvoir établir des certitudes quant à l&#8217;avenir de ce SGBDR.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="FlexBuilderdevientFlashBuilder"></a>FlexBuilder devient FlashBuilder</h4><p>Une nouvelle qui fait réagir la communauté <em>Flex</em> depuis plus d&#8217;une semaine est l&#8217;annonce du nouveau nom de l&#8217;IDE <em>FlexBuilder</em> qui, dans sa version 4, se nommera désormais <em>FlashBuilder</em>.</p><p>Les <em>flasheurs / flexeurs</em>, que l&#8217;on pourra lire sur <a
href="http://theflashblog.com/?p=993" title="The Flash Blog" >The Flash Blog</a>, <a
href="http://www.flex-tutorial.fr/2009/05/18/flash-builder-4-sera-le-nom-du-prochain-flex-builder/" title="Adobe Flex Tutorial" >Adobe Flex Tutorial</a> ou bien <a
href="http://codemoiunmouton.wordpress.com/2009/05/16/flex-builder-devient-flash-builder/" title="Code moi un mouton" >Code moi un mouton</a>, se réjouissent de la standardisation du terme Flash (il faut rappeler qu&#8217;au final, une application <em>Flex</em> est compilé en <em>SWF</em> donc du <em>Flash</em> lisible par <em>Flash Player</em>). Toutefois, quelques craintes subsistent chez certains concernant ce nouveau terme <em>Flash</em>, qui selon eux ferrait moins <em>professionnel / entreprise</em>. Au moins, maintenant tout est clair : avec <em>FlashBuilder</em>, vous allez créer des applications <em>Flash</em> pour <em>Flash Player</em> !</p><p>Pour le reste, rien ne change. <em>Flex</em>, c&#8217;est un framework <em>Actionscript</em> qui s&#8217;appuiera sur le <em>Flex SDK</em>. Le plugin sera toujours un plugin Eclipse. Et le développeur <em>Flex</em> restera un développeur <em>Flex</em> ! Et vous, que pensez-vous de ce changement de nom ?</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="NosIDEssecorrigent"></a>Nos IDEs se corrigent</h4><p>C&#8217;est le mot d&#8217;ordre actuel. Peu, voir pas de nouvelles fonctionnalités mais de nombreuses corrections de bugs pour <a
href="http://www.eclipse.org/downloads/" title="Eclipse IDE" >Eclipse IDE</a> et <a
href="http://www.jetbrains.com/idea/download/index.html" title="IntelliJ IDEA" >IntelliJ IDEA</a>.</p><p>Ainsi, Eclipse nous annonce fièrement la <a
href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&#038;short_desc_type=allwordssubstr&#038;short_desc=&#038;classification=Eclipse&#038;classification=RT&#038;product=Equinox&#038;product=JDT&#038;product=PDE&#038;product=Platform&#038;target_milestone=3.5+RC1&#038;long_desc_type=allwordssubstr&#038;long_desc=&#038;bug_file_loc_type=allwordssubstr&#038;bug_file_loc=&#038;status_whiteboard_type=allwordssubstr&#038;status_whiteboard=&#038;keywords_type=allwords&#038;keywords=&#038;bug_status=RESOLVED&#038;bug_status=VERIFIED&#038;bug_status=CLOSED&#038;resolution=FIXED&#038;emailtype1=substring&#038;email1=&#038;emailtype2=substring&#038;email2=&#038;bugidtype=include&#038;bug_id=&#038;votes=&#038;chfieldfrom=&#038;chfieldto=Now&#038;chfieldvalue=&#038;cmdtype=doit&#038;order=Reuse+same+sort+as+last+time&#038;field0-0-0=noop&#038;type0-0-0=noop&#038;value0-0-0=" title="correction de 341 bugs" >correction de 341 bugs</a> (rien que ça !) pour son IDE en version 3.5 RC1, mais pas de nouvelles fonctionnalités. Du côté de chez IntelliJ, c&#8217;est plus d&#8217;une cinquantaine de <a
href="http://www.jetbrains.com/idea/features/release_notes812.html" title="bugs et exceptions corrigés" >bugs et exceptions corrigés</a> pour la version IDEA 8.1.2, avec quelques optimisations de performance (<a
href="http://www.jetbrains.com/idea/features/release_notes812.html#Performance_Problem" title="éditeurs de fichiers Java et SQL" >éditeurs de fichiers Java et SQL</a>) et 2 nouvelles fonctionnalités (au niveau du <a
href="http://www.jetbrains.com/idea/features/release_notes812.html#New_Feature" title="debugger et des raccourcis" >debugger et des raccourcis</a>).</p><p>Le téléchargement d&#8217;Eclipse 3.5 RC1 se passe <a
href=" http://download.eclipse.org/eclipse/downloads/drops/S-3.5RC1-200905151143/index.php" title="par ici" >par ici</a> et pour IntelliJ IDEA 8.1.2 c&#8217;est par <a
href="http://www.jetbrains.com/idea/download/" title="l" >là</a>.</p><h4><a
name="LesnouveautsdeJDO"></a>Les nouveautés de JDO 2.3</h4><p><a
href="http://java.sun.com/jdo/index.jsp" title="JDO (Java Data Objects)" >JDO (Java Data Objects)</a>, longtemps délaissé au profit d&#8217;Hibernate, puis de JPA, a été récemment remis en avant par <a
href="http://blog.xebia.fr/2009/04/14/revue-de-presse-xebia-104/#GoogleAppEnginepourJavaetGroov" title="le support Java de Google App Engine" >le support Java de Google App Engine</a> qui préconise l&#8217;utilisation de cette API pour assurer la persistance des données dans les applications qu&#8217;il héberge.</p><p>Andy Jefferson, co-fondateur du projet <a
href="http://www.datanucleus.org/" title="DataNucleus" >DataNucleus</a>, vient de poster un <a
href="http://java.dzone.com/articles/whats-new-jdo-23" title="tour d'horizon des nouveautés de JDO 2.3" >tour d&#8217;horizon des nouveautés de JDO 2.3</a> dont l&#8217;API est actuellement disponible en <a
href="http://db.apache.org/jdo/releases/release-2.3-ea.cgi" title="early access" ><em>early access</em></a>. Ces nouveautés sont :</p><ul><li><strong>Metadata API</strong> : la définition des classes à persister pouvait jusqu&#8217;alors se faire par XML ou par annotations. Cette JDO 2.3 vient ajouter une troisième possibilité avec cette API permettant de définir dynamiquement des classes persistables.</li><li><strong>Enhancer API</strong> : cette API vient en complément de la précédente. En effet dans la mesure où les implémentations de JDO s&#8217;appuient sur du <em>bytecode enhancement</em> des classes persistables, il est nécessaire d&#8217;offrir aux développeurs un moyen d&#8217;invoquer <em>l&#8217;enhancer</em> après avoir déclaré dynamiquement une nouvelle classes via la Metadata API.</li><li><strong>Timeout et annulation de requêtes</strong> : dans le monde JPA, ces deux fonctionnalités ne sont pas supportées par la spécification mais seulement en tant qu&#8217;extensions propriétaires.</li><li><strong>Contrôle des verrous en lecture des objets</strong> : permet un contrôle fin des objets qui doivent être verrouillés automatiquement lors de la lecture, évitant ainsi d&#8217;opérer un verrouillage global.</li></ul><p>Répondant à des besoins modernes, ces changements devraient être appréciés par les développeurs. Reste que l&#8217;avenir de JDO est flou : ne pouvant rivaliser avec la popularité de JPA, JDO pourrait se maintenir dans des cas d&#8217;utilisation particuliers et ainsi perdurer dans les années à venir tout en restant marginal.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="RetoursurlaGrlaConfrenceGroovy"></a>Retour sur la Gr8, la Conférence Groovy</h4><p>La première édition de la <a
href="http://www.gr8conf.org/" title="Gr8 Conference" >Gr8 Conference</a> vient de se terminer. Il s&#8217;agit d&#8217;une conférence entièrement dédiée au langage <a
href="http://groovy.codehaus.org/" title="Groovy" >Groovy</a> et aux frameworks gravitant autour. On trouve de nombreux compte rendu sur Internet, <a
href="http://gettinggroovy.wordpress.com/" title="Peter Bell en signe le plus complet" >Peter Bell en signe le plus complet</a>. Parmi les points les plus intéressants on compte :</p><ul><li>Jim Shingler qui a présenté une introduction à Griffon, un framework Groovy visant à faciliter la production de clients lourds en Swing</li><li>Une session portant sur la création de plugins pour Grails</li><li>Graeme Rocher qui a fait une présentation au titre très explicite &#8216;Building a Twitter Clone in Grails&#8217;</li></ul><p>Par ailleurs les cas d&#8217;utilisation de Groovy ont été passés en revue par Dierk Konig :</p><ul><li>Utilisation en tant que glue et création d&#8217;infrastructure des applications</li><li>Ecriture des règles métiers complexes évoluant régulièrement</li><li>Utilisation pour les <em>hot fixes</em>, en s&#8217;appuyant sur le fait que Groovy peut être utilisé de manière interprété</li><li>Définition de fichiers de configuration basés sur la syntaxe Groovy</li><li>Utilisation de Groovy comme unique langage sur un projet de taille réduite ou moyenne</li><li>Utilisation de Groovy comme langage de script pour les tâches courantes (automatisation, installation, déploiement).</li></ul><p>Les organisateurs ont annoncé que l&#8217;ensemble des sessions de cette conférence seront disponibles sur <a
href="http://www.parleys.com" title="Parleys" >Parleys</a> dès que possible.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/25/revue-de-presse-xebia-110/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
