<?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; Romain Maton</title> <atom:link href="http://blog.xebia.fr/author/rmaton/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>Soirée Scala au Lorraine JUG</title><link>http://blog.xebia.fr/2011/05/13/soiree-scala-au-lorraine-jug/</link> <comments>http://blog.xebia.fr/2011/05/13/soiree-scala-au-lorraine-jug/#comments</comments> <pubDate>Fri, 13 May 2011 05:05:14 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7693</guid> <description><![CDATA[Et 1, et 2, et 2.9 ! Ce n&#8217;est pas au stade que cela se passe mais à l&#8217;ESIAL : Scala, dont la toute dernière version est d&#8217;ailleurs disponible depuis hier, est à nouveau mis à l&#8217;honneur et cette fois-ci au Lorraine JUG. Je vous donne rendez-vous le mercredi 18 mai pour une soirée de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/12/logo-lorrainejug.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Et 1, et 2, et 2.9 ! Ce n&#8217;est pas au stade que cela se passe mais à l&#8217;ESIAL : Scala, dont la toute dernière version est d&#8217;ailleurs disponible depuis hier, est à nouveau mis à l&#8217;honneur et cette fois-ci au <a
href="http://lorrainejug.blogspot.com/2011/04/le-lorraine-jug-java-user-group-de.html" title="Lorraine JUG" >Lorraine JUG</a>. Je vous donne rendez-vous le mercredi 18 mai pour une soirée de deux heures consacrée à Scala avec au programme :</p><ul><li>Ses origines</li><li>Les outils et frameworks de son écosystème</li><li>Les difficultés et freins à son adoption</li><li>Les nouveautés de la toute nouvelle version 2.9.0</li><li>Les entreprises qui l’utilisent</li><li>Une session d&#8217;une heure de live coding : exemples de programmation fonctionnelle, un <a
href="http://aperiodic.net/phil/scala/s-99/" title="S-99" >S-99</a> et&#8230; du <a
href="http://scala.playframework.org/" title="Play Framework" >Play Framework</a> !</li></ul><p>Les inscriptions se passent par <a
href="http://jugevents.org/jugevents/event/37403" title="ici" >ici</a>. Venez nombreux !</p><div
align="center"><a
href="http://twitter.com/rmat0n"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png" /></a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/13/soiree-scala-au-lorraine-jug/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Devoxx &#8211; Comparaison des Frameworks Web sur JVM</title><link>http://blog.xebia.fr/2010/11/19/devoxx-comparaison-des-frameworks-web-sur-jvm/</link> <comments>http://blog.xebia.fr/2010/11/19/devoxx-comparaison-des-frameworks-web-sur-jvm/#comments</comments> <pubDate>Fri, 19 Nov 2010 14:12:34 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[Ruby on Rails]]></category> <category><![CDATA[Spring MVC]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5938</guid> <description><![CDATA[Nouvelle journée de Devoxx et cela commence plutôt bien avec une comparaison des Frameworks Web sur JVM par Matt Raible. Avec un accent Américain trés prononcé, et aprés une présentation &#171;&#160;lessig style&#160;&#187; trés appréciée, il présente le programme de la session : les candidats, les points de comparaison, la matrice et quelques graphiques. Comment choisir [...]]]></description> <content:encoded><![CDATA[<p> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_matt_raible.png" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Nouvelle journée de Devoxx et cela commence plutôt bien avec une <a
href="http://www.devoxx.com/display/Devoxx2K10/Comparing+JVM+Web+Frameworks" title="comparaison des Frameworks Web sur JVM" >comparaison des Frameworks Web sur JVM</a> par <a
href="http://raibledesigns.com/" title="Matt Raible" >Matt Raible</a>. Avec un accent Américain trés prononcé, et aprés une présentation &laquo;&nbsp;<a
href="http://www.presentationzen.com/presentationzen/2005/10/the_lessig_meth.html" title="lessig style" >lessig style</a>&nbsp;&raquo; trés appréciée, il présente le programme de la session : les candidats, les points de comparaison, la <em>matrice</em> et quelques graphiques.</p><p>Comment choisir ces fameux Frameworks Web qui sont, et c&#8217;est le moins que l&#8217;on puisse dire, assez nombreux. Et bien tout d&#8217;abord, il va falloir restreindre cette liste à quelques Frameworks et, pour chacun d&#8217;entre eux, prototyper une application. A partir de ces prototypes, il sera alors possible de créer une <em>matrice</em> comprenant différents critères qui seront notés pour chaque Frameworks. De là, on pourra faire ressortir les meilleurs prétendants, un petit document et faire nos recommandations. C&#8217;est ce qu&#8217;a fait Matt Raible durant cette présentation et voici ses résultats !</p><p>&nbsp;<br
/> &nbsp;</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_web_frameworks.png" border="0" alt="" /></div><p>Matt fait un petit rappel sur les facteurs clés qui nous permettaient de choisir un Framework Web en 2007 <em>(de son expérience)</em> :</p><ul><li>composant, requête ou RIA,</li><li>facilité de développement,</li><li>communauté autour du Framework,</li><li>roadmap et futur du Framework,</li><li>maintenance,</li><li>fonctionnalités.</li></ul><p>Aujourd&#8217;hui, nous en demandons beaucoup plus à nos Frameworks Web et, pour Matt, nous passons de 6 à 20 ! Avec un peu d&#8217;exagération sur cette fulgurante croissance car certains points faisaient déjà parti de nos préoccupations en 2007 ; de là à dire que ce sont de nouveaux points&#8230; En tout cas, les voici au complet :</p><ul><li>productivité du développeur,</li><li>perception du développeur,</li><li>courbe d&#8217;apprentissage,</li><li>santé du Framework,</li><li>disponibilité des développeurs <em>(sur le marché)</em>,</li><li>offres d&#8217;emploi,</li><li>templating,</li><li>composants,</li><li>ajax,</li><li>plugins ou add-ons,</li><li>scalabilité,</li><li>support pour les tests,</li><li>i18n et l10n,</li><li>validation,</li><li>support du multi-langage (groovy, scala&#8230;),</li><li>qualité de la documentation / tutoriaux,</li><li>publications,</li><li>support de REST,</li><li>support mobile,</li><li>et degré de risque.</li></ul><p>Bien sûr, nous pouvons remettre en cause certains points de cette liste et passer plusieurs journées à en débattre mais le débat n&#8217;est pas là. Matt assume que les choix qui sont fait sont les siens et il nous invite à participer pour ajouter des éléments à la liste ou lui indiquer pourquoi il se trompe sur telle ou telle appréciation. L&#8217;idée est ici de donner une base solide afin de pouvoir comparer sur plusieurs points importants de nos projets d&#8217;entreprise ces fameux innombrables Frameworks Web.</p><p>Roulement de tambour&#8230; voici la matrice ! (<a
href="http://spreadsheets.google.com/pub?key=0AtkkDCT2WDMXdC1HOEtnUHpCejJMbUhGeGJWUmh5dVE&#038;hl=en&#038;output=html" title="google spreadsheet" >google spreadsheet</a>)</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_matrice.png" border="0" alt="" /></div><p>Les gagnants de ce &laquo;&nbsp;concours&nbsp;&raquo; sont :</p><ul><li>Spring MVC,</li><li>GWT,</li><li>Ruby on Rails <em>(non JVM mais non exclu car très présent sur le marché)</em>,</li><li>Grails,</li><li>Wicket.</li></ul><p>Vient ensuite une partie avantages / inconvénients pour chacun d&#8217;eux. Cette partie est à prendre avec des pincettes car les inconvénients relevés sont souvent surmontables <em>(certains sont même juste des comportements par défaut modifiable par configuration !)</em> mais encore une fois cela donne un overview de ce que font ou ne font pas ces Frameworks :</p><ul><li><strong>Spring MVC :</strong> configuration simple par conventions et annotations, intégration de plusieurs formats d&#8217;affichage <em>(JSP, JSTL, FreeMarker, JSON, PDF&#8230;)</em> et excellent support de REST <u>mais</u> pas de rechargement à chaud par défaut <em>(toutefois possible avec JRebel ou Spring Roo)</em>, projet non ouvert à la communauté pour contribution <em>(SpringSource mandatory)</em> et pas de librairie ajax en bundle <em>(ce qui peut aussi être vu comme un point positif car mise à jour des librairies Javascript non bloquée par le Framework)</em> ;</li><li><strong>GWT :</strong> code Java traduit en un Javascript extrêmement optimisé, apprentissage facile et rapide <em>(petit bémol car sur ce point les développeurs Web n&#8217;ont pas forcément cette compétence du code Swing-like)</em> et une communauté vibrante <u>mais</u> il faut connaître Java <em>(alors que l&#8217;on produit du Javascript)</em>, compilation très lente et code difficile à tester ;</li><li><strong>Ruby on Rails :</strong> apprentissage rapide pour tout développeur Web, documentation abondante et  communauté de passionnés <u>mais</u> moins performant que les autres langages, langage dynamique = plus de tests pour éviter les cast exceptions au runtime et  un manque d&#8217;outils de développement et de débugger comme dans le monde Java ;</li><li><strong>Grails :</strong> transition facile depuis le monde Java, utlise Groovy et nombreux plugins <u>mais</u> Groovy vise directement les développeurs Java <em>(ce qui peut bloquer d&#8217;autres développeurs)</em>, stack traces <em>affreuses</em> <em>(dans le slide</em> <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <em>)</em> et connaissances des sous-modules non nécessaires mais peut aider ;</li><li><strong>Wicket :</strong> parfait pour les développeurs Java, binding des pages et des vues et communauté active <u>mais</u> pas ou peu d&#8217;offres d&#8217;emploi, stateful par défaut et templates HTML juste à côté des classes Java <em>(ce qui ne va pas aider le graphiste)</em>.</li></ul><p>Pour finir, nous avons droit à quelques <em>jolis</em> graphiques qui nous montre à quelle point Ruby On Rails est très présent au niveau de la communauté mais ainsi en terme d&#8217;offres d&#8217;emploi.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_stack_overflow.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_stack_overflow-300x225.png" alt="devoxx_stack_overflow" title="devoxx_stack_overflow" width="300" height="225" class="alignnone size-medium wp-image-5941" /></a></div><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_charts.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_charts-300x225.png" alt="devoxx_charts" title="devoxx_charts" width="300" height="225" class="alignnone size-medium wp-image-5939" /></a></div><p>Matt a insisté sur deux points importants tout d&#8217;abord sur le fait que ce sont les développeurs qui devraient choisir leur framework web, plus les développeurs sont heureux, plus ils seront productifs. D&#8217;autre part, javascript n&#8217;est pas si difficile comme on l&#8217;entend souvent de la part des développeurs java, plus on le pratique, plus on l&#8217;apprécie, et c&#8217;est vital si l&#8217;on veut être sérieux pour le développement d&#8217;application web.</p><p>Cette méthode peut être appliqué dans votre entreprise pour choisir votre framework web :</p><ol><li>priorisez les fonctionnalités importantes de votre application</li><li>sélectionnez ensuite 3 ou 4 Frameworks pour prototyper une application <em>(1 semaine chacun)</em>, documentez</li><li>calculez votre <em>matrice</em> et choisissez !</li></ol> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/19/devoxx-comparaison-des-frameworks-web-sur-jvm/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Devoxx &#8211; Java Puzzlers par Joshua Bloch et William Pugh</title><link>http://blog.xebia.fr/2010/11/19/devoxx-java-puzzlers-par-joshua-bloch-et-william-pugh/</link> <comments>http://blog.xebia.fr/2010/11/19/devoxx-java-puzzlers-par-joshua-bloch-et-william-pugh/#comments</comments> <pubDate>Fri, 19 Nov 2010 09:05:03 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[java]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5912</guid> <description><![CDATA[Pour finir cette très bonne journée de jeudi, une session exceptionnelle nous attendait : Java Puzzlers par Joshua Bloch (faut-il encore le présenter ? Chief architect chez Google, Java Collections Framework, Effective Java&#8230;) et William Pugh (créateur de FindBugs) ! Ce dernier a d&#8217;ailleurs bien préparé le terrain avec la session Defective Java : Mistakes [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_joshua_bloch.png" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Pour finir cette très bonne journée de jeudi, une session exceptionnelle nous attendait : <a
href="http://www.devoxx.com/display/Devoxx2K10/Java+Puzzlers+-+Scraping+the+Bottom+of+the+Barrel" title="Java Puzzlers" >Java Puzzlers</a> par <a
href="http://www.devoxx.com/display/Devoxx2K10/Joshua+Bloch" title="Joshua Bloch" >Joshua Bloch</a> <em>(faut-il encore le présenter ? Chief architect chez Google, Java Collections Framework, Effective Java&#8230;)</em> et <a
href="http://www.devoxx.com/display/Devoxx2K10/William+Pugh" title="William Pugh" >William Pugh</a> <em>(créateur de FindBugs)</em> ! Ce dernier a d&#8217;ailleurs bien préparé le terrain avec la session <a
href="http://www.devoxx.com/display/Devoxx2K10/Defective+Java++Mistakes+that+matter" title="Defective Java  Mistakes that matter" >Defective Java : Mistakes that matter</a> qui précédait le Puzzlers.</p><p>C&#8217;est parti pour le show : les puzzlers en photo, et les remarques et solutions en commentaire !</p><p>&nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;<br
/> &nbsp;</p><h3><a
name="Puzzlern"></a>Puzzler n°1</h3><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_1.png" border="0" alt="" /></div><p><code>BigDecimal</code> permet un calcul de précision que l&#8217;on ne peut avoir avec des doubles donc vous pensez tout de suite à a) ou b). En même temps, ça sent le piège car nos doubles sont toujours utilisés directement donc plutôt la c). Et bien vous avez tout faux, réponse d) !</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_1_solution.png" border="0" alt="" /></div><p>En effet, le code passe par le constructeur <code>public BigDecimal(double val)</code> qui va donc représenter la valeur décimale exacte <em>(jusque là tout va bien)</em> d&#8217;un double à virgule flottante&#8230; donc incorrect. Et comme nous sommes en présence d&#8217;un double, nous avons la réponse d), la réponse c) étant la représentation pour un float. La solution est de passer par un String et d&#8217;utiliser ainsi le constructeur <code>public BigDecimal(String val)</code>.</p><h3><a
name="Puzzlern"></a>Puzzler n°2</h3><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_2.png" border="0" alt="" /></div><p>La bonne réponse est la réponse a). La solution de ce Puzzler mériterait un article complet car beaucoup de paramètres entrent en jeux. Et ça tombe bien puisque cet article existe ! Je vous laisse donc apprécier le détail chez <a
href="http://tech.puredanger.com/2009/06/11/collections-puzzler/" title="Alex Miller" >Alex Miller</a> pour ce Puzzler qui s&#8217;amuse avec la méthode <code>entrySet()</code> d&#8217;<code>EnumMap</code> <em>(même comportement pour <code>IdentityHashMap</code>, <code>ConcurrentHashMap</code> a été corrigé)</em> et le constructeur <code>addAll()</code> du <code>HashSet</code>.</p><h3><a
name="Puzzlern"></a>Puzzler n°3</h3><p>Les solutions possibles pour ce Puzzler sont : a) 99 b) 100 c) Throws an exception d) None of above.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_3.png" border="0" alt="" /></div><p>Et la réponse est d) avec un calcul qui va tourner très longtemps <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/11/devoxx_puzzler_3_solution.png" border="0" alt="" /></div><p>Nous sommes face à un <a
href="http://www.regular-expressions.info/catastrophic.html" title="catastrophic backtracking" >catastrophic backtracking</a> qui génère un calcul exponentiel pour trouver le résultat !</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_3_explication.png" border="0" alt="" /></div><p>La solution ? Retirer le <code>?</code>. Cette nouvelle RegExp <code>(aa|aab)</code> <u>fonctionne exactement comme</u> <code>(aa|aab?)</code> mais sans exposer ce <em>catastrophic backtracking</em>. Ce Puzzler n&#8217;est donc pas un bug Java mais une manière de mal écrire une RegExp.</p><p>Willian Pugh nous confirme donc que nous aurons le même problème en Ruby, Python, Perl&#8230; Joshua Bloch se demande alors <em>Even in Scala ?</em> Réponse de son partenaire : <em>Yes, even in Scala !</em> Ce qui a bien fait rire la salle <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><h3><a
name="Puzzlern"></a>Puzzler n°4</h3><p>Les solutions possibles pour ce Puzzler sont : a) <code>["null", null]</code> b) <code>[null]</code> c) <code>[null, null]</code> d) None of above.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_4.png" border="0" alt="" /></div><p>La solution est la réponse d) avec une superbe <code>ClassCastException</code> qui sort de nulle part ! Et bien, pas vraiment de nulle part quand on regarde de plus près. L&#8217;exception est levée dans la classe <code>StringSink</code>, mais il est difficile de voir quelle partie du code a pu générer une exception. En fait, ce sera même très difficile à diagnostiquer car le code qui provoque l&#8217;exception n&#8217;est pas visible ! Par contre, une fois la classe décompilée, on voit apparaître ce code non visible sous la forme d&#8217;une <em>bridge method</em> :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_4_explication.png" border="0" alt="" /></div><p>Utiliser un <code>Generic T</code> dans une méthode qui prend un <code>Varargs</code> <em>(donc un tableau de T)</em> a causé la création de cette méthode <code>void add(Object<a
href="" title="" ></a> a)</code> qui retourne notre objet casté en <code>String<a
href="" title="" ></a></code>. En effet, le compilateur ne connaissant pas le type T <em>(erasure mon amie&#8230;)</em> et devant aussi gérer ce tableau, il est obligé de créer une méthode avec <code>Object<a
href="" title="" ></a></code>. A noter que le compilateur nous a prévenu dans les logs de compilation. Donc comme le rappelle Joshua Bloch : &laquo;&nbsp;Don&#8217;t ignore warnings !&nbsp;&raquo;.</p><h3><a
name="Puzzlern"></a>Puzzler n°5</h3><p>Ce Puzzler est définitivement mon préféré :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_5.png" border="0" alt="" /></div><p>Et une fois de plus, on se retrouve face à une exception, toujours de type <code>ClassCastException</code>. Encore un problème de Generics ? Oui&#8230; Car la classe <code>Glommer()</code> a été instanciée sans préciser le type T. Donc la classe passe en <a
href="http://download.oracle.com/javase/tutorial/java/generics/erasure.html" title="Raw type" >Raw type</a>. Et ce qui se passe dans le cas présent, c&#8217;est que toutes les informations de Generics&#8230; sont supprimées de la classe !<br
/> Ainsi, les méthodes <code>glom</code> qui prenaient une <code>Collection&lt;?&gt;</code> et une <code>List&lt;Integer&gt;</code> se retrouvent désormais à recevoir une <code>Collection</code> et une <code>List</code> non typée. Comme la liste de <code>String</code> est instanciée avec <code>Arrays.asList("a","b","c")</code> qui retourne une <code>List</code>, la priorité va à la méthode qui prend en paramètre une <code>List</code>. Et devinez quoi : c&#8217;est la méthode qui initialement devait s&#8217;occuper des <code>Integer</code> ! D&#8217;où le <code>ClassCastException</code> dès la première valeur lors de la boucle <em>(qui essaie de caster un <code>String</code> en <code>int</code>)</em>.<br
/> Dans ce cas, la solution est d&#8217;enlever ce type T de la classe <em>(non utilisé dans le corps)</em>. La recommandation liée à ce Puzzler : n&#8217;utilisez pas les Raw Types et, une fois de plus, n&#8217;ignorez pas les warnings de compilation <em>(car il y en aurait eu un)</em> !</p><h3><a
name="Puzzlern"></a>Puzzler n°6</h3><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_puzzler_6.png" border="0" alt="" /></div><p>Autant le deuxième est trouvable, autant pour le premier, tout le monde dans la salle est tombé dans le panneau <em>(certains ont même crié &laquo;&nbsp;voleur, c&#8217;est pas un Puzzler ça !&nbsp;&raquo;)</em>. La bonne réponse est la réponse b) avec 17777 et 43878.</p><p>Le premier calcul et le sujet du vol : ce n&#8217;est pas écrit <code>12345+54321</code> mais <code>12345+5432l</code>.<br
/> Vous ne voyez toujours pas ? Je vous aide : <code>12345+5432L</code> ! Et là évidemment cela change tout ! Nous n&#8217;avons donc plus 54321 mais 5432 <em>(5432L en long)</em> qui donne bien 17777.</p><p>Le deuxième calcul : <code>01234+43210</code> correspond en fait à <code>668+43210</code> ! Que s&#8217;est-il encore passé sous nos yeux&#8230; et bien le premier 0 de 01234 convertit notre 1234 en base 8 ! Ce qui nous donne 668 et donne une somme de 43878.</p><p>La morale de ce Puzzler : mettez des majuscules à vos long <em>(5432L est un long et cela se voit)</em> et ne préfixez jamais vos entiers avec un 0 à moins que vous ne vouliez vraiment le convertir en base 8.</p><p>Si ces Puzzlers vous ont plu, un seul livre : <a
href="http://www.javapuzzlers.com/" title="Java Puzzlers" >Java Puzzlers</a> ! Un grand merci à Joshua Bloch et William Pugh pour cette excellente présentation !</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_joshua_bloch_william_pugh.png" border="0" alt="" /></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/19/devoxx-java-puzzlers-par-joshua-bloch-et-william-pugh/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Devoxx &#8211; Les nouveautés d&#8217;Hibernate, une perspective JPA 2</title><link>http://blog.xebia.fr/2010/11/17/devoxx-les-nouveautes-dhibernate-une-perspective-jpa-2/</link> <comments>http://blog.xebia.fr/2010/11/17/devoxx-les-nouveautes-dhibernate-une-perspective-jpa-2/#comments</comments> <pubDate>Wed, 17 Nov 2010 08:40:35 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[Hibernate Envers]]></category> <category><![CDATA[Hibernate Search]]></category> <category><![CDATA[Hibernate Spatial]]></category> <category><![CDATA[Hibernate Validator]]></category> <category><![CDATA[JPA 2]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5898</guid> <description><![CDATA[Nouvelle journée d&#8217;université et, comme dans toute conférence qui se respecte, nous avons droit à une session de mise au point sur les différentes nouveautés de l&#8217;écosystème d&#8217;Hibernate d&#8217;un point de vue JPA 2. La couverture est large : Hibernate Core, Search, Envers, Validator et Spatial. De nombreuses démos nous ont permis de nous familiariser [...]]]></description> <content:encoded><![CDATA[<p>Nouvelle journée d&#8217;université et, comme dans toute conférence qui se respecte, nous avons droit à une session de mise au point sur les différentes <a
href="http://www.devoxx.com/display/Devoxx2K10/What's+new+in+Hibernate++a+JPA+2+perspective" title="nouveauts de lcosystme dHibernate dun point de vue JPA 2" >nouveautés de l&#8217;écosystème d&#8217;Hibernate d&#8217;un point de vue JPA 2</a>.</p><p>La couverture est large : Hibernate Core, Search, Envers, Validator et Spatial. De nombreuses démos nous ont permis de nous familiariser avec ces nouveautés liées à JPA 2.<br
/> La session était animée, comme il se doit, par Emmanuel Bernard. Le code de la session est disponible sur <a
href="https://github.com/emmanuelbernard/hibernateuniversity-devoxx" title="GitHub" >GitHub</a> et ce pour encore une petite semaine.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_emmanuel_bernard_live_coding.png" border="0" alt="" /></div><h3><a
name="HibernateCoreORM"></a>Hibernate Core &#8211; ORM</h3><p>Après quelques nouveautés, dont le support de l&#8217;annotation <code>@MapsId</code> de JPA 2, le partial generator <em>(pour générer une clé selon un algorithme spécifique)</em> et le runtime fetch profile <em>(qui définit plusieurs stratégies de fetch)</em>, Emmanuel commence sa première démo et nous présente la nouvelle API Criteria :</p><ul><li>query building API orientée objet,</li><li>type-safe,</li><li>fortement typé,</li><li>avec la possibilité d&#8217;utiliser le méta-modèle statique <em>(par annotation processor)</em>.</li></ul><p>Et c&#8217;est sur ce dernier point qu&#8217;il insistera pendant toutes ses démos. En effet l&#8217;API est construite de telle manière que nous récupérerons des erreurs <em>compile-time</em> si un mauvais méta-modèle ou un mauvais attribut de méta-modèle est défini.</p><p>Concrètement, le méta-modèle est généré par annotation processor. Une fois celui-ci activé dans votre IDE, chaque compilation de fichier lancera le processus de génération des méta-modèles. Par exemple, une classe <code>User</code> aura un méta-modèle associé <code>User_</code> qui contiendra plusieurs attributs statiques reflétant les attributs de la classe. Ainsi, si un attribut change de nom, toutes les requêtes utilisant l&#8217;ancien nom seront en <em>compilation error</em>. Voici un exemple à partir d&#8217;une capture d&#8217;un bout de code lors de cette démo :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_hibernate_core.png" border="0" alt="" /></div><p>On remarque ainsi dans les contraintes l&#8217;utilisation de <code>User_.credits</code>, <code>credits</code> étant un attribut de la classe <code>User</code>. On voit dès lors l&#8217;intérêt d&#8217;un tel mécanisme qui justifie ainsi son appellation type-safe et fortement typé. En effet, sur le 3ème exemple, imaginons que  l&#8217;on donne un argument autre que <code>User_.gender</code> mais du même type que <code>gender</code> ; l&#8217;API nous donnera tout de même une erreur de compilation car ce qui est attendu est un <code>Path&lt;Gender&gt;</code> qui ne peut être obtenu qu&#8217;en ayant pris en paramètre un <code>gender</code>. Une fonctionnalité plutôt intéressante donc mais qu&#8217;il convient mieux de voir de ses propres yeux dans un IDE pour bien comprendre la puissance de la chose.</p><p>Cette nouvelle API criteria prend en compte toutes sortes de <code>Joins</code> et <code>Where</code>, les <code>Subquery</code> et les <code>Map</code> et <code>Like</code>. Cette API supporte ainsi tout le JP-QL : collections, maps, aggregation, order by, group by, having count, subselect, &#8230;</p><p>Le lock  mode, qui prévient entre autres des <em>dirty reads</em>,   supporte l&#8217;optimistic et le pessimistic read/write. Le cache de second niveau a été amélioré et Hibernate supporte aussi Infinispan. Enfin, CGLIB se retrouve déprécié et se voit remplacé par Javassist.</p><p>Côté packaging, Hibernate passe de plusieurs modules à un seul core module qui contient Hibernate Annotations, Entitymanager, Envers et l&#8217;ancien Core. De même, tous les modules auront le même numéro de version simplifiant ainsi la gestion des dépendances entre modules <em>(si un module est en 3.6.0, les autres devront l&#8217;être aussi)</em>.</p><h3><a
name="HibernateSearch"></a>Hibernate Search</h3><p>Le point important est une fois de plus l&#8217;API programmatique permettant de faire ses requêtes full text directement telles que :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_hibernate_search.png" border="0" alt="" /></div><p>Dans les petits plus : un error handling pour reporter dans un log ou dans une pile, des statistiques avancées, une indexation des valeurs <code>null</code>, des query timeout et bien d&#8217;autres.</p><h3><a
name="HibernateSpatial"></a>Hibernate Spatial</h3><p>Hibernate Spatial est une extension d&#8217;Hibernate permettant de gérer des données géographiques. Il s&#8217;appuie sur le package Java Topology Suite ou <a
href="http://www.vividsolutions.com/jts/jtshome.htm" title="JTS" >JTS</a> pour représenter les données géographiques dans le monde Java.</p><p>Voici ce que rajoute le projet à Hibernate :</p><ul><li>GeometryUserType.</li><li>SpatialRestrictions API.</li><li>HQL Spatial functions.</li><li>SpatialDialectProvider.</li></ul><p>Les bases de données supportées sont les suivantes :</p><ul><li>Oracle Spatial.</li><li>Postgresql/Postgis.</li><li>MySQL.</li><li>Microsoft SQL Server 2008.</li><li>H2 (GeoDB).</li><li>IBM Informatix IDS (en cours).</li><li>IBM DB2 (à planifier).</li></ul><p>Les spatial queries s&#8217;écrivent comme des requêtes criteria normales mais dans le monde spatial. Un exemple tiré du slide :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_hibernate_spatial.png" border="0" alt="" /></div><p>A noter que pour l&#8217;instant le projet est un module à part d&#8217;Hibernate 3 mais qu&#8217;il sera packagé dans Hibernate Core en version 4.</p><h3><a
name="HibernateEnvers"></a>Hibernate Envers</h3><p>Comme pour les autres modules, l&#8217;API programmatique est tout de suite mise en avant avec des requêtes Criteria par révision sur les objets :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx_hibernate_envers.png" border="0" alt="" /></div><h3><a
name="HibernateValidator"></a>Hibernate Validator</h3><p>Là encore, l&#8217;API a aussi été remaniée et l&#8217;on peut ainsi appeler directement des méthodes du type <code>.constraint(SizeDef.class).min(1)</code> dans notre requête Criteria <em>(équivalent de l&#8217;annotation @Min)</em>.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Un bon tour d&#8217;horizon des produits Hibernate mais surtout beaucoup de démos <em>les mains dedans</em> où l&#8217;on voit le tout fonctionner en @Inject et <a
href="http://seamframework.org/Weld" title="Weld" >Weld</a> sous IntelliJ IDEA. Une bonne session !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/17/devoxx-les-nouveautes-dhibernate-une-perspective-jpa-2/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Devoxx &#8211; Productive Programmer</title><link>http://blog.xebia.fr/2010/11/16/devoxx-productive-programmer/</link> <comments>http://blog.xebia.fr/2010/11/16/devoxx-productive-programmer/#comments</comments> <pubDate>Tue, 16 Nov 2010 10:00:19 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5891</guid> <description><![CDATA[Neal Ford nous présente pour cette première session des University, les bonnes pratiques issues de son livre Productive Programmer. Ce livre couvre les habitudes et les bonnes pratiques à adopter en tant que développeur. Accélération Taper au clavier est bien plus rapide que la navigation avec la souris. On perd beaucoup de temps à chercher [...]]]></description> <content:encoded><![CDATA[<p>Neal Ford nous présente pour cette première session des University, les bonnes pratiques issues de son livre Productive Programmer. Ce livre couvre les habitudes et les bonnes pratiques à adopter en tant que développeur.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx-ford-neal.png" border="0" alt="" /></div><h3><a
name="Acclration"></a>Accélération</h3><p><strong>Taper au clavier est bien plus rapide que la navigation avec la souris.</strong> On perd beaucoup de temps à chercher alors que les raccourcis clavier sont bien plus rapides. Chaque OS fournit ses raccourcis claviers pour ouvrir l&#8217;explorateur Windows ou le Finder. Pour naviguer sur internet, utilisez <a
href="https://addons.mozilla.org/en-US/firefox/addon/6420/" title="NumberFox" >NumberFox</a>, il numérote les liens sur les pages et permet en saisissant un numéro d&#8217;accéder à la page associée. <strong>Pour la gestion du presse papier</strong>, utilisez par exemple <a
href="http://jumpcut.sourceforge.net/" title="jumpcut" >jumpcut</a> sur MacOS X qui permet de visualiser ce que vous avez coupé ou copié avec un historique des données. Le changement de contexte prend du temps également, surtout en ligne de commande. Avec les commandes <a
href="http://www.colorconsole.de/console/fr/050.htm" title="pushdpopd" >pushd/popd</a>, vous pourrez mémoriser un répertoire avec pushd pour le réutiliser ensuite à tout moment avec popd.<br
/> <strong>Lignes de commande ou explorateur ?</strong> Les explorateurs sont intéressants dans certains cas, les lignes de commandes dans d&#8217;autres. Pour switcher facilement de l&#8217;un à l&#8217;autre, vous pouvez utiliser <a
href="http://www.codeproject.com/KB/cs/commandbar.aspx" title="cmd prompt explorer bar" >cmd prompt explorer bar</a> pour Windows et <a
href="http://www.cocoatech.com/" title="Path Finder" >Path Finder</a> pour Mac OS X. Ils proposent dans une même fenêtre la console et l&#8217;explorateur.<br
/> <strong>Quand vous codez, vous devriez toujours utiliser le clavier plutôt que la souris.</strong> Forcez vous à apprendre les raccourcis clavier. Un outil existe sur IntelliJ pour forcer les développeurs à utiliser un raccourci clavier, au bout de la troisième utilisation la fonctionnalité se grise dans le menu. Les conseils : se les répéter et se créer un aide mémoire. Accédez directement à la classe que vous cherchez par les raccourcis clavier et en utilisant les majuscules. <strong>Prenez l&#8217;habitude de créer les variables avec votre EDI.</strong> Bien que destiné au refactoring, vous pouvez aussi l&#8217;utiliser en ne déclarant que la partie gauche de la déclaration et générer le reste.</p><h3><a
name="Focus"></a>Focus</h3><p>Pour commencer, il y a des choses simples à mettre en place : une chaise confortable, un double écran, les droits admin sur son poste et un bon clavier. Ensuite la concentration doit être total. Pour être productif, il faut supprimer toutes distractions tels que les pop-ups Windows de mis à jour ou autres notifications. Il existe par exemple <a
href="http://www.downloadsquad.com/2006/10/04/jedi-concentrate/" title="Jedi Concentrate" >Jedi Concentrate</a> qui permet de mettre en noir toutes les fenêtres pour se concentrer sur une en particulier le plus longtemps possible. Désactivez toutes les notifications d&#8217;emails et de messageries instantanées, mettez des écouteurs et créez des &laquo;&nbsp;moments de silence&nbsp;&raquo; dans votre bureau.<br
/> L&#8217;idée n&#8217;est pas de s&#8217;isoler des autres mais de créer des conditions idéales à la concentration.</p><h3><a
name="Focustechnique"></a>Focus technique</h3><p>Utilisez un outil de recherche tel que <a
href="http://www.google.com/quicksearchbox/" title="Google Desktop Search" >Google Desktop Search</a> pour rechercher sur votre poste au lieu de naviguer dans votre explorateur. Utilisez un virtual desktop pour séparer votre espace de travail du reste. Cela permet d&#8217;éviter l&#8217;empilement de fenêtres sur un unique bureau.</p><h3><a
name="Canonicit"></a>Canonicité</h3><p>Faire les choses simples en évitant les répétitions. Neal Ford a un sigle de référence : DRY (Don&#8217;t Repeat Yourself).</p><ul><li>DRY o/r mapping : il s&#8217;agit d&#8217;une tâche assez répétitive dans le développement d&#8217;application. Optimisez la partie mapping avec la base de données en construisant celui-ci à partir des méta-données en base. Puis générez les POJOs correspondant.</li><li>DRY documentation : Neal Ford a utilisé SVN2Wiki un petit utilitaire de SVN qui relève tous les commentaires de commits des développeurs pour les aggréger dans un wiki.</li></ul><h3><a
name="Automatisation"></a>Automatisation</h3><p>Les aspects visiblement automatisables sont le build en une commande, l&#8217;intégration continue, le contrôle de version et la documentation. Il recommande Selenium pour les tests automatisés. Ce dernier permet au développeurs de tester plus rapidement les applications suite à une modification.<br
/> Sa philosophie est : &laquo;&nbsp;Ne perdez plus de temps à faire à la main ce que vous pouvez faire automatiquement&nbsp;&raquo;.<br
/> Pour déterminer si une tâche est automatisable ou pas, il faut mesurer le temps qu&#8217;elle prend et analyser le retour sur investissement. Il faut éviter également d&#8217;en faire trop.</p><h3><a
name="Pratique"></a>Pratique</h3><p>Neal Ford nous propose ensuite 10 bonnes pratiques pour améliorer notre productivité et notre qualité de code.</p><h4><a
name="PatternComposedMethods"></a>1. Pattern <em>Composed Methods</em></h4><p>Celui-ci est directement tiré du livre <a
href="http://www.amazon.com/Smalltalk-Best-Practice-Patterns-Kent/dp/013476904X" title="Smalltalk Best Practice Patterns" >Smalltalk Best Practice Patterns</a> de Kent Beck. L&#8217;idée est de diviser son programme en plusieurs méthodes, chacune ayant un et un seul rôle bien défini. De même, chaque opération dans la méthode devra avoir le même niveau d&#8217;abstraction. Le résultat : des méthodes avec un rôle précis écrites en très peu de lignes de code. Cela a pour avantage de favoriser et simplifier les tests unitaires. Cela permettra aussi de vraiment mettre en avant la <em>vraie</em> réutilisabilité du code.</p><h4><a
name="TDD"></a>2. TDD</h4><p>Couplé avec le pattern <em>Composed Methods</em>, TDD nous oblige à réfléchir à notre design objet, à définir de quels objets dépend mon objet et ainsi à <em>mocker</em> ces objets dépendants. Un premier constat est que l&#8217;on obtient très souvent de meilleurs métriques de manière globale.</p><h4><a
name="Analysedecode"></a>3. Analyse de code</h4><p>Les outils d&#8217;analyse de code, ce n&#8217;est pas <a
href="http://blog.xebia.fr/2008/03/26/ajouter-un-detecteur-personnalise-a-findbugs/" title="quelque" >quelque</a> <a
href="http://blog.xebia.fr/2007/07/23/revue-de-presse-xebia-15/#PMD" title="chose de" >chose de</a> <a
href="http://blog.xebia.fr/2008/10/29/controles-de-qualite-avec-sonar/" title="nouveau" >nouveau</a>. Mais un petit rappel ne fait jamais de mal <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Passer par ce type d&#8217;outils va nous permettre de détecter des bugs de type mauvaise pratique, code mort ou bien encore du code violemment copier-coller. 2 types d&#8217;analyse :</p><ul><li>byte code : à l&#8217;aide de FindBugs qui nous range nos bugs par catégorie comme la mauvaise pratique, le problème de performance ou du code douteux ;</li><li>source code : par PMD qui lui nous détectera le code mort ou bien encore le fameux algorithme CPD pour Copy/Paste Detector.</li></ul><h4><a
name="Bonnecitoyennet"></a>4. Bonne citoyenneté</h4><p>Avec une formule : <code>getters + setters != encapsulation</code> ! Le speaker insiste alors : ne générez pas automatiquement sans réfléchir ces fameux getters et setters. Et si vous en avez réellement besoin, il faudra peut-être les tester.<br
/> Et un exemple d&#8217;API <em>worst citizenship in the java world</em> selon lui : <code>java.util.Calendar</code> ! Et un exemple très saisissant : que donne une instance de <code>Calendar</code> avec 31 février ? Et bien une instance de <code>Calendar</code> au 1er mars ! Alors que l&#8217;on ne serait pas surprit de se prendre une petite exception à la figure&#8230; Avec un constructeur sans paramètre, un autre avec tout, encore un autre avec seulement la moitié des paramètres demandés&#8230; En bref : prenez JodaTime <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><h4><a
name="YAGNI"></a>5. YAGNI</h4><p>L&#8217;idée est simple : si vous n&#8217;en avez pas besoin tout de suite, pourquoi le faire ? Et oui, <em>You Ain&#8217;t Gonna Need It</em> !</p><h4><a
name="Remettreencauselautorit"></a>6. Remettre en cause l&#8217;autorité</h4><p>J&#8217;ai beaucoup aimé l&#8217;exemple cité : le nom des méthodes en Java. La norme est en effet d&#8217;utiliser le <a
href="http://fr.wikipedia.org/wiki/CamelCase" title="CamelCase" >CamelCase</a> pour le nom de nos méthodes. Mais prenons par exemple les test unitaires et par exemple ce test :<br
/> <code>testUserCannotAccessThisPageWithHisActualGrantedAuthorities</code><br
/> Pourquoi, pour une question de lisibilité, ne pas le nommer :<br
/> <code>test_user_cannot_access_this_page_with_his_actual_granted_authorities</code><br
/> Le nom de la méthode devient alors plus lisible et on obtient plus facilement l&#8217;information de ce que fait le test.<br
/> Autre cas : le chainage de méthode. Là où l&#8217;on écrirait des appels successifs de méthodes <code>setXXX</code> avec un retour de type <code>void</code>, pourquoi ne pas revoir l&#8217;API et utiliser le <em>Chaining Pattern</em> pour avoir quelque chose du type : <code>Car.describedAs().box().length(12).includes(Equipment.LADDER);</code>. Neal Ford insiste sur cet exemple car celui-ci remet directement en cause  la spécification Java Beans.<br
/> Il ne faut donc pas forcément s&#8217;arrêter sur des phrases telle que <em>c&#8217;est comme ça qu&#8217;il faut faire, un point c&#8217;est tout</em> !</p><h4><a
name="Slap"></a>7. Slap</h4><p>Slap pour <em>Single Level of Abstraction Principle</em>, ce principe rejoint fortement le <em>Composed Pattern</em> puisque le concept est d&#8217;avoir plusieurs lignes de code dans une méthode ayant le même niveau d&#8217;abstraction.</p><h4><a
name="Polyglotte"></a>8. Polyglotte</h4><p>Java n&#8217;est pas le seul et, pour certaines problématiques ou certains environnements, il est peut-être préférable de partir sur d&#8217;autres langages. Exemple : JRuby pour faire de l&#8217;interface graphique ou <a
href="http://jaskell.codehaus.org/" title="Jaskell" >Jaskell</a> pour écrire du code fonctionnelle. En bref, ne pas se limiter à Java.</p><h4><a
name="ChaqueNuance"></a>9. Chaque Nuance</h4><p>Java traîne avec lui des idées reçues bien fausse comme par exemple que l&#8217;API <code>reflection</code> est lente, certes vrai en fin des années 90 mais plus aujourd&#8217;hui. Il faut donc nuancer les propos, ne garder que ce qui est vrai et ne pas hésiter à faire passer le message pour que toutes ces choses ne soit plus dites !</p><h4><a
name="Antiobjets"></a>10. Anti-objets</h4><p>Neal Ford nous explique qu&#8217;un anti-objet peut-être vu comme un objet qui fait exactement l&#8217;opposé de ce pourquoi il a été créé. L&#8217;exemple du <a
href="http://www.google.fr/images?q=vase+ou+visage&#038;um=1&#038;ie=UTF-8&#038;source=og&#038;sa=N&#038;hl=fr&#038;tab=wi" title="vase ou visage" >vase ou visage</a> nous permet ainsi de voir qu&#8217;un objet vase peut voir sa réelle existence complètement détournée.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Une session extrêmement riche et un <a
href="http://www.amazon.fr/Productive-Programmer-Neal-Ford/dp/0596519788" title="livre  lire de toute urgence" >livre à lire de toute urgence</a> !</p><p><em>NB : Les slides de Neal Ford sont disponibles sur son site : <a
href="http://nealford.com/mypastconferences.htm" title="Devoxx 2010  Neal Ford  The Productive Programmer" >Devoxx 2010 &#8211; Neal Ford &#8211; The Productive Programmer</a>.</em></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/16/devoxx-productive-programmer/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Devoxx &#8211; Augmenter votre productivité avec Mylyn</title><link>http://blog.xebia.fr/2010/11/16/devoxx-augmenter-votre-productivite-avec-mylyn/</link> <comments>http://blog.xebia.fr/2010/11/16/devoxx-augmenter-votre-productivite-avec-mylyn/#comments</comments> <pubDate>Tue, 16 Nov 2010 06:35:01 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Mylyn]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5883</guid> <description><![CDATA[Et c&#8217;est parti pour les Tools in action avec pour ma part la session Augmenter votre productivité avec Mylyn de Oliver Gierke, SpringSource. Mylyn, c&#8217;est le framework ALM (Application Lifecycle Management) d&#8217;Eclipse. Il réorganise tout l&#8217;IDE autour de tâches. Celles-ci seront ensuite traduites par Mylyn pour nos différents outils comme notre gestionnaire de sources, notre [...]]]></description> <content:encoded><![CDATA[<p>Et c&#8217;est parti pour les <a
href="http://www.devoxx.com/display/Devoxx2K10/Tools+in+Action" title="Tools in action" >Tools in action</a> avec pour ma part la session <a
href="http://www.devoxx.com/display/Devoxx2K10/Increasing+developer+productivity+with+Mylyn" title="Augmenter votre productivité avec Mylyn" >Augmenter votre productivité avec Mylyn</a> de <a
href="http://www.devoxx.com/display/Devoxx2K10/Oliver+Gierke" title="Oliver Gierke" >Oliver Gierke</a>, SpringSource.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx-oliver-gierke.png" border="0" alt="" /></div><p>Mylyn, c&#8217;est le framework ALM (Application Lifecycle Management) d&#8217;Eclipse. Il réorganise tout l&#8217;IDE autour de tâches. Celles-ci seront ensuite traduites par Mylyn pour nos différents outils comme notre gestionnaire de sources, notre intégration continue ou bien encore notre bugtracker. Le développeur pourra ainsi ne se préoccuper que de ses tâches, Mylyn s&#8217;occupant du reste.</p><p>Oliver Gierke nous oriente vers 3 grands domaines concernant cette fameuse productivité recherchée du développeur : <em>focus</em>, <em>productivity</em> et <em>traceability</em>.</p><h3><a
name="Focus"></a>Focus</h3><p>Tout se passe dans l&#8217;onglet <em>Task List</em> d&#8217;Eclipse avec une liste de tâches à effectuer. A noter qu&#8217;on ne peut activer qu&#8217;une seule tâche à la fois.</p><p>Le concept : chaque tâche aura son propre contexte de travail.</p><p>Ainsi, dès lors que l&#8217;on a activé une tâche, l&#8217;onglet <em>Task List</em> se vide et laisse apparaître tous les fichiers sur lesquels nous sommes en train de travailler. L&#8217;intérêt est que si l&#8217;on change en cours de route de tâche, la nouvelle tâche repartira d&#8217;un contexte vide et, en revenant sur notre première tâche, on récupérera notre contexte avec tous nos fichiers modifiés.</p><h3><a
name="Productivity"></a>Productivity</h3><p>L&#8217;idée ici est de gagner du temps en ayant tout de suite à sa disposition les bons outils intégrés dans son environnement de travail. En effet, avoir plus d&#8217;une dizaine d&#8217;outils répartis sur son IDE, dans son navigateur, sur son desktop&#8230; cela donne des alertes un peu n&#8217;importe où <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Il faut donc passer d&#8217;un <em>patchwork</em> à un <em>integrated toolset</em>.</p><p>Par défaut, Mylyn gère un nombre assez important de bugtrackers et d&#8217;outils en tout genre avec dans le désordre : Bugzilla, Jira, Bamboo, Crucible, Trac, Mantis, Hudson, Egit, CVS&#8230;</p><p>Pour la récupération des informations de l&#8217;outil, prenons par exemple Jira, il est possible de définir ses propres requêtes afin de ne récupérer qu&#8217;une certaine partie des bugs. Pour la saisie d&#8217;un bug, on dispose d&#8217;un éditeur <em>Rich Task Editor</em> pour la saisie des informations liées au bug <em>(OS, version&#8230;)</em> et pour la partie commentaire on dispose de l&#8217;éditeur <em>WikiText</em> qui nous permet d&#8217;écrire de la syntaxe Wiki.</p><p>Toujours en terme de productivité, il est possible d&#8217;organiser ses requêtes ou ses outils en <em>Working Sets</em>. On pourra aussi exporter ses contextes avec de les partager avec toute l&#8217;équipe.</p><h3><a
name="Traceability"></a>Traceability</h3><p>Ce concept découle du point précédent. On peut ainsi pour une tâche donnée récupérer toute les informations utiles du type <em>qui</em>, <em>quoi</em> et <em>pourquoi</em>, tout étant regroupé en un seul point.</p><h3><a
name="Dmo"></a>Démo</h3><p>Vient ensuite une petite démo avec un projet directement connecté sur le bugtracker de SpringSource :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx-demo-mylin.png" border="0" alt="" /></div><h3><a
name="CodeCloud"></a>Code2Cloud</h3><p>Pour terminer, Oliver nous parle de <a
href="http://tasktop.com/connectors/code2cloud.php" title="Code2Cloud" >Code2Cloud</a>, la solution complète de SpringSource pour simplifier la vie du développeur <em>(<a
href="http://blog.xebia.fr/2010/11/02/revue-de-presse-xebia-183/#SpringOneGXLesannoncesdeSpring" title="annonce faite au SpringOne2GX 2010" >annonce faite au SpringOne2GX 2010</a>)</em>.</p><p>Pourquoi parler de Code2Cloud ? Bugzilla, Git, Hudson, STS mais surtout&#8230;. Mylyn ! Olivier propose l&#8217;exemple de son intégration avec <a
href="http://blog.springsource.com/2010/05/26/spring-insight-1-0-0-m3-released/" title="Spring Insight" >Spring Insight</a>. On pourra ainsi configurer Spring Insight pour créer automatiquement un bug dans le bugtracker pour toute exception levée par l&#8217;application. Le bug sera bien sûr rempli avec la <em>stack trace</em> dans le bon champ, les classes impactées, OS/versions&#8230; Tout ceci toujours prévu pour le premier trimestre 2011.</p><h3><a
name="Pourconclure"></a>Pour conclure</h3><p>A noter enfin que <a
href="http://www.eclipse.org/mylyn/" title="Mylyn" >Mylyn</a> sous-projet de l&#8217;IDE <a
href="http://www.eclipse.org/" title="Eclipse" >Eclipse</a> est devenu <a
href="http://tasktop.com/blog/eclipse/mylyn-top-level-eclipse-project" title="top level Eclipse project" >top level Eclipse project</a> depuis mi-Septembre. Il rejoint entres autres WTP et EMF dans cette <em>short list</em> de projets qui représentent les secteurs clés d&#8217;Eclipse.</p><p>L&#8217;outil est bon mais pour ma part un point très gênant réside toujours : Un changement de contexte ne met pas de côté les changements effectués à la manière d&#8217;un <code>git stash</code> que l&#8217;on pourrait récupérer plus tard avec un <code>pop</code>. Si vous connaissez un plugin ou une petite commande qui fait ça, n&#8217;hésitez pas à commenter !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/16/devoxx-augmenter-votre-productivite-avec-mylyn/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Scala on Tours, venez nombreux !</title><link>http://blog.xebia.fr/2010/11/01/scala-on-tours-venez-nombreux/</link> <comments>http://blog.xebia.fr/2010/11/01/scala-on-tours-venez-nombreux/#comments</comments> <pubDate>Mon, 01 Nov 2010 09:08:45 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5806</guid> <description><![CDATA[Scala continue sa tournée des JUG ! Après Paris et Rennes, c&#8217;est la ville de Tours qui proposera ce mercredi 3 novembre une soirée dédiée à ce langage alternatif pour la JVM. A cette occasion, je présenterai : Les origines de Scala. Des exemples de code (live). Les différents outils et frameworks disponibles sur le [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/toursJuggyh150.gif" alt="NoSQL au tour Jug Xebia" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Scala continue sa tournée des JUG ! Après <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100413" title="Paris" >Paris</a> et <a
href="http://blog.xebia.fr/2010/10/25/merci-au-breizh-jug/" title="Rennes" >Rennes</a>, c&#8217;est la ville de <a
href="http://toursjug.org/xwiki/bin/view/Main/" title="Tours" >Tours</a> qui proposera ce mercredi 3 novembre une <a
href="http://www.toursjug.org/xwiki/bin/view/Meetings/20101103" title="soire" >soirée</a> dédiée à ce langage alternatif pour la JVM.</p><p>A cette occasion, je présenterai :</p><ul><li>Les origines de Scala.</li><li>Des exemples de code (live).</li><li>Les différents outils et frameworks disponibles sur le marché.</li><li>Les difficultés et les freins à son adoption.</li><li>Ce qui nous attend dans les prochaines versions.</li><li>Les entreprises qui l&#8217;utilisent.</li></ul><p>Les inscriptions de passent par <a
href="http://jugevents.org/jugevents/event/30953" title="ici" >ici</a>. Venez nombreux !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/01/scala-on-tours-venez-nombreux/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Merci au Breizh JUG !</title><link>http://blog.xebia.fr/2010/10/25/merci-au-breizh-jug/</link> <comments>http://blog.xebia.fr/2010/10/25/merci-au-breizh-jug/#comments</comments> <pubDate>Mon, 25 Oct 2010 14:45:46 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Breizh JUG]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5718</guid> <description><![CDATA[Au même titre que le Paris JUG, le Breizh JUG organise des soirées afin de présenter les technologies / plateformes qui nous entourent. A ce titre, Nicolas De Loof nous a proposé de venir parler du langage Scala. Après notre passage au Paris JUG au mois d&#8217;Avril, c&#8217;est avec un grand plaisir que nous avons [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/10/breizh_jug.gif" alt="" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Au même titre que le Paris JUG, le <a
href="http://www.breizhjug.org/" title="Breizh JUG" >Breizh JUG</a> organise des soirées afin de présenter les technologies / plateformes qui nous entourent. A ce titre, <a
href="http://blog.loof.fr/" title="Nicolas De Loof" >Nicolas De Loof</a> nous a proposé de venir parler du langage Scala. Après notre passage au <a
href="http://blog.xebia.fr/2010/04/20/merci-paris-jug/" title="Paris JUG au mois d'Avril" >Paris JUG au mois d&#8217;Avril</a>, c&#8217;est avec un grand plaisir que nous avons accepté de faire la présentation <em>(mise à jour pour l&#8217;occasion)</em>.  Cette dernière a été l&#8217;occasion de présenter les principales notions du langage, ainsi que quelques nouveautés de la <a
href="http://www.scala-lang.org/node/43" title="version 28" >version 2.8</a> et notamment les Collections.</p><p>La deuxième partie de soirée a suscité quelques questions. Ce fut très constructif. De nombreux sujets ont été abordés tels que l&#8217;intégration de modules Scala dans une application Java, les performances&#8230; Mention spéciale troll à Nicolas pour sa question sur les pointeurs de fonction de Microsoft en 2001 !</p><p>Cette soirée s&#8217;est poursuivie dans un bon petit restaurant rue St Georges, où, entre autres, nous avons discuté des méthodes agiles, de diagrammes de classes ayant des formes de Dalaï Lama ou bien encore de Mammouth (pour de plus amples informations, demandez à Nicolas, il est expert dans ce domaine !).</p><p>Enfin pour ceux qui hésiteraient à se rendre au Breizh JUG, nous vous y encourageons fortement. Vous y rencontrerez des personnes avec lesquelles les échanges sont enrichissants et il y règne une très bonne ambiance.</p><p>Vous trouverez les slides de notre présentation à <a
href="http://www.slideshare.net/yoh82/20101018scalabreizhjugromainmatonnicolasjozwiak" title="cette adresse" >cette adresse</a>, ainsi que la vidéo sur Parleys à <a
href="http://beta.parleys.com/#st=5&#038;id=2041" title="cette adresse" >cette adresse</a>.</p><p>Merci encore au Breizh JUG !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/10/25/merci-au-breizh-jug/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Deuxième soirée Paris Scala User Group chez Xebia</title><link>http://blog.xebia.fr/2010/06/22/deuxieme-soiree-paris-scala-user-group-chez-xebia/</link> <comments>http://blog.xebia.fr/2010/06/22/deuxieme-soiree-paris-scala-user-group-chez-xebia/#comments</comments> <pubDate>Tue, 22 Jun 2010 08:13:39 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Paris Scala User Group]]></category> <category><![CDATA[PSUG]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4949</guid> <description><![CDATA[Après une première soirée très réussie, le Paris Scala User Group remet le couvert pour une deuxième session le mercredi 30 juin à 19h30 (inscription ici) ! Et, comme la dernière fois, cela se passera chez Xebia dans nos locaux d&#8217;Haussmann. Voici le menu de la soirée avec une présentation d&#8217;Alexis Agahi et une autre [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/scala-logo.png" border="0" alt="" style="margin: 1em 1em 1em 2em; float: right;" /><br
/> Après une <a
href="http://groups.google.com/group/paris-scala-user-group/browse_thread/thread/a5b085446972d34e" title="première soirée" >première soirée</a> <a
href="http://jduchess.org/duchess-france/blog/psug1-la-premiere-du-scala-user-group/" title="très réussie" >très réussie</a>, le <a
href="http://groups.google.com/group/paris-scala-user-group" title="Paris Scala User Group" >Paris Scala User Group</a> remet le couvert pour une <a
href="http://groups.google.com/group/paris-scala-user-group/browse_thread/thread/da5eb7882fac8da9" title="deuxième session" >deuxième session</a> le mercredi 30 juin à 19h30 <em>(inscription <a
href="http://doodle.com/zds5ka5qqa3ndnp5" title="ici" >ici</a>)</em> !</p><p>Et, comme la <a
href="http://blog.xebia.fr/2010/05/18/xebia-accueille-le-paris-scala-user-group/" title="dernire fois" >dernière fois</a>, cela se passera chez Xebia dans nos locaux d&#8217;Haussmann.</p><p>Voici le menu de la soirée avec une présentation d&#8217;Alexis Agahi et une autre de François Armand <em>(annonce disponible <a
href="http://groups.google.com/group/paris-scala-user-group/browse_thread/thread/da5eb7882fac8da9" title="ici" >ici</a>)</em> :</p><p>&#8212;</p><p>La seconde session aura lieu chez Xebia à 19h30 le mercredi 30 juin (et non plus le 17 ou le 24 comme prévu initialement, désolé pour la confusion).</p><p>Nous avons prévu deux présentations:</p><ul><li>La 1ère présentation sera &laquo;&nbsp;De Java à Scala : premier retour d&#8217;expérience&nbsp;&raquo; présentée par <a
href="http://twitter.com/aagahi" title="Alexis Agahi" >Alexis Agahi</a>. La présentation <em>(entre 40min et 1h)</em> sera orientée developpeur Java et sera donc abordable pour tous.</li><li>La seconde présentation, par <a
href="http://fanf42.blogspot.com/" title="Franois Armand" >François Armand</a>, abordera les collections de Scala 2.8. Ce sera une présentation assez générale, avec les différentes classes et tout le bonheur qu&#8217;elles apportent.</li></ul><p>Notez bien l&#8217;adresse :<br
/> Xebia<br
/> 156 boulevard haussmann à Paris<br
/> Immeuble A<br
/> 7e étage</p><p>Les places étant limitées, veuillez vous inscrire à l&#8217;adresse suivante : <a
href="http://doodle.com/zds5ka5qqa3ndnp5">http://doodle.com/zds5ka5qqa3ndnp5</a>.</p><p>&#8212;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/22/deuxieme-soiree-paris-scala-user-group-chez-xebia/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Xebia accueille le Paris Scala User Group</title><link>http://blog.xebia.fr/2010/05/18/xebia-accueille-le-paris-scala-user-group/</link> <comments>http://blog.xebia.fr/2010/05/18/xebia-accueille-le-paris-scala-user-group/#comments</comments> <pubDate>Tue, 18 May 2010 11:19:39 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Paris Scala User Group]]></category> <category><![CDATA[PSUG]]></category> <category><![CDATA[SBT]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4693</guid> <description><![CDATA[Xebia est très heureux d&#8217;accueillir la première soirée du Paris Scala User Group. Elle se déroulera ce soir à partir de 19h30. Le programme de cette soirée live coding par Alexandre Bertails est le suivant (disponible ici) : &#8212; Il s&#8217;agit d&#8217;une présentation que j&#8217;ai déjà faite au Boston Area User Group il y a [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/scala-logo.png" border="0" alt="" style="margin: 1em 1em 1em 2em; float: right;" /><br
/> Xebia est très heureux d&#8217;accueillir la première soirée du <a
href="http://groups.google.com/group/paris-scala-user-group" title="Paris Scala User Group" >Paris Scala User Group</a>.<br
/> Elle se déroulera <a
href="http://groups.google.com/group/paris-scala-user-group/browse_thread/thread/a5b085446972d34e" title="ce soir  partir de 19h30" >ce soir à partir de 19h30</a>.<br
/> Le programme de cette soirée <em>live coding</em> par <a
href="http://www.parisjug.org/xwiki/bin/view/Speaker/BertailsAlexandre" title="Alexandre Bertails" >Alexandre Bertails</a> est le suivant <em>(disponible <a
href="http://groups.google.com/group/paris-scala-user-group/msg/8fedc112850efb03" title="ici" >ici</a>)</em> :</p><p>&#8212;</p><p>Il s&#8217;agit d&#8217;une présentation que j&#8217;ai déjà faite au Boston Area User Group il y a quelques temps (et amélioré depuis). Pour le PSUG, j&#8217;aurai deux heures au lieu d&#8217;une. Je prévois donc de rendre cette présentation accessible à des purs java-istes ou des débutants Scala. J&#8217;utiliserai tout de même à la fin des fonctionnalités avancées de Scala, mais que je prétends faciles à l&#8217;utilisation.</p><p>Je ne ferai que du live-coding et je n&#8217;utiliserai aucun slide. Ce sera l&#8217;occasion de revenir sur des outils qui n&#8217;ont pas été vraiment explorés pendant la soirée Scala au ParisJUG (en particulier sbt).</p><p>Voici le plan de la présentation :</p><ul><li>je reviendrai d&#8217;abord sur le concept d&#8217;injection de dépendances et comment on fait ça à l&#8217;ancienne (ou plutôt, comment on ferait en Java). Je parlerai rapidement d&#8217;immutabilité et de typage statique ici.</li><li>ensuite, je montrerai que les frameworks classiques venant du monde Java fonctionnent très bien avec Scala. Je laisse aux participants le choix du framework sur ce lien [1]. Je reviendrai notamment sur leurs limites dans le contexte de Scala.</li><li>enfin, retour à du Scala pur (et pas forcément dur). Nous reviendrons entre autres sur le Cake Pattern. Mais surtout, nous jouerons ensemble avec le cocktail détonnant suivant : traits, mixins, structural typing et closures.</li></ul><p>&#8212;</p><p>A noter toutefois que nous n&#8217;avions pas couvert <a
href="http://code.google.com/p/simple-build-tool/" title="sbt" >sbt</a> lors de la soirée <a
href="http://blog.xebia.fr/2010/04/20/merci-paris-jug/" title="Scala du Paris JUG" >Scala du Paris JUG</a> mais que cet oubli <em>(volontaire <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</em> a été rattrapé par 2 fois avec une <a
href="http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/" title="présentation générale du produit" >présentation générale du produit</a> ainsi qu&#8217;un exemple de <a
href="http://blog.xebia.fr/2010/05/11/configurer-vos-projets-sbt-pour-eclipse-ou-intellij-idea/" title="configuration pour Eclipse et IDEA" >configuration pour Eclipse et IDEA</a>.</p><p>Malheureusement pour les retardataires, la soirée affiche <strong>complet</strong> depuis plusieurs jours&#8230; Donc, pour ne pas rester sur la touche la prochaine fois, n&#8217;oubliez pas de vous abonner à <a
href="http://groups.google.com/group/paris-scala-user-group" title="la mailinglist du PSUG" >la mailing-list du PSUG</a> !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/18/xebia-accueille-le-paris-scala-user-group/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Configurer vos projets SBT pour Eclipse ou IntelliJ IDEA</title><link>http://blog.xebia.fr/2010/05/11/configurer-vos-projets-sbt-pour-eclipse-ou-intellij-idea/</link> <comments>http://blog.xebia.fr/2010/05/11/configurer-vos-projets-sbt-pour-eclipse-ou-intellij-idea/#comments</comments> <pubDate>Tue, 11 May 2010 12:40:09 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[git]]></category> <category><![CDATA[IDEA]]></category> <category><![CDATA[SBT]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4621</guid> <description><![CDATA[Dans la lignée du premier article consacré à la présentation de l&#8217;outil sbt pour Scala, ce second article s&#8217;intéressera à la configuration de nos projets sbt. Objectif : pouvoir les importer dans nos IDEs Scala préférés (surtout les miens ) à savoir IntelliJ IDEA (Community ou Ultimate Edition) et Eclipse. Git et sbt sont les [...]]]></description> <content:encoded><![CDATA[<p>Dans la lignée du <a
href="http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/" title="premier article" >premier article</a> consacré à la présentation de l&#8217;outil sbt pour Scala, ce second article s&#8217;intéressera à la configuration de nos projets sbt.<br
/> Objectif : pouvoir les importer dans nos IDEs Scala préférés <em>(surtout les miens <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</em> à savoir IntelliJ IDEA <em>(Community ou Ultimate Edition)</em> et Eclipse. <a
href="http://progit.org/book/ch1-4.html" title="Git" >Git</a> et <a
href="http://code.google.com/p/simple-build-tool/wiki/Setup" title="sbt" >sbt</a> sont les seuls composants pré-requis pour ce tutoriel.</p><p>Nous allons ainsi entrevoir le mécanisme de plugin de sbt ainsi que l&#8217;application de plugins sur un projet sbt. Pour celles et ceux qui connaissent un minimum ces deux environnements de développement, rien de bien sorcier : ajouter une facet Scala au projet, définir certains répertoires en tant que répertoires sources, d&#8217;autres en tant que répertoires de tests, définir _lib_managed_ en tant que dossier de librairies&#8230; Il est donc tout à fait possible de faire tout ceci à la main en quelques minutes. L&#8217;idée ici est vraiment de jouer avec quelques plugins sbt et les intégrer à un projet existant.</p><p>Si vous êtes plutôt Emacs ou Vim, je vous renvoie sur le <a
href="http://code.google.com/p/simple-build-tool/wiki/IntegrationSupport" title="site de sbt" >site de sbt</a> pour la configuration à adopter.</p><h3><a
name="Eclipse"></a>Eclipse</h3><p>Nous allons importer notre projet à l&#8217;aide du plugin <a
href="http://github.com/musk/SbtEclipsify" title="SbtEclipsify" >SbtEclipsify</a>. Ce plugin prend en charge la création de tous les fichiers nécessaires à Eclipse <em>.project,.classpath&#8230;)</em> afin que le projet soit importable et intégralement configuré. Il n&#8217;est actuellement disponible sur aucun repository, il va donc falloir soit télécharger le Jar et le déposer dans son repository local, soit récupérer le projet et utiliser sbt pour le compiler et le publier en local. Nous partirons sur ce deuxième choix <em>(pour utiliser quelques petites commandes sbt)</em>.</p><p>Tout d&#8217;abord, nous allons récupérer le projet à l&#8217;aide de la commande <code>git clone</code> :</p><pre class="brush: java; title: ; notranslate">
$ git clone http://github.com/musk/SbtEclipsify.git
</pre><p>Ensuite, nous allons démarrer sbt et faire un <code>update</code> pour mettre à jour toutes les dépendances du projet :</p><pre class="brush: java; title: ; notranslate">
$ sbt
$ update
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/1-git-clone-sbt-update.png" border="0" alt="" /></div><p>Nos dépendances étant à jour, nous allons pouvoir compiler et publier le projet à l&#8217;aide de la commande <code>publish-local</code> <em>(image tronquée)</em> :</p><pre class="brush: java; title: ; notranslate">
$ publish-local
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/2-publish-local.png" border="0" alt="" width="650" /></div><p>Maintenant que le Jar est disponible dans notre repository, nous allons pouvoir configurer notre projet avec cette nouvelle dépendance. Pour cela, créons le fichier <code>project/plugins/Plugins.scala</code> et ajoutons le plugin sbt-eclispsify :</p><pre class="brush: java; title: ; notranslate">
import sbt._
 class MySbtProjectPlugins(info: ProjectInfo) extends PluginDefinition(info) {
       lazy val eclipse = &quot;de.element34&quot; % &quot;sbt-eclipsify&quot; % &quot;0.5.2-SNAPSHOT&quot;
 }
</pre><p>Dernière étape avant de tout builder : modifier notre fichier projet, dans la classe <code>project/build/MyProject.scala</code>, pour marquer notre projet en tant que projet <em>eclipsifiable</em> à l&#8217;aide du trait <code>Eclipsify</code> :</p><pre class="brush: java; title: ; notranslate">
import sbt._
import de.element34.sbteclipsify._
class MyProject(info: ProjectInfo) extends DefaultProject(info) with Eclipsify {
   // ...
}
</pre><p>Voilà, tout est prêt, démarrons sbt et lançons la commande <code>eclipse</code> après avoir mis à jour nos dépendances pour notre projet <em>(à l&#8217;aide de la commande <code>update</code>)</em> :</p><pre class="brush: java; title: ; notranslate">
$ sbt
$ update
$ eclipse
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/3-update-eclipse.png" border="0" alt="" /></div><p>That&#8217;s all ! Il n&#8217;y a plus qu&#8217;à faire un import dans Eclipse de votre projet. A partir de maintenant, la commande <code>eclipse</code> ne devrait plus vous servir. Il faudra dès lors passer par <code>reload</code> lors de modifications concernant vos plugins ou vos dépendances pour mettre à jour votre contexte sbt et bien sûr <code>update</code> pour la mise à jour de vos dépendances.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/4-eclipse-import.png" border="0" alt="" /></div><p>A noter que d&#8217;autres plugins existent :</p><ul><li><a
href="http://github.com/frank06/sbt-eclipse-plugin/" title="sbteclipseplugin" >sbt-eclipse-plugin</a> : ce plugin n&#8217;est ni plus ni moins qu&#8217;un container de type classpath qui pointe vers le dossier <code>lib_managed</code>. L&#8217;outil fonctionne très bien mais les manipulations sont à effectuer à la main et aucune opération en ligne de commande <em>(pour automatisation)</em> n&#8217;est disponible pour l&#8217;instant. A surveiller donc ;</li><li><a
href="http://ant.apache.org/ivy/ivyde/screenshots.html" title="IvyIDE" >IvyIDE</a> <em>(avec la procédure d&#8217;installation <a
href="http://code.google.com/p/simple-build-tool/wiki/IntegrationSupport#Eclipse" title="ici" >ici</a>)</em>.</li></ul><h3><a
name="IntelliJIDEA"></a>IntelliJ IDEA</h3><p>Plusieurs plugins existent et, pour ma part, j&#8217;ai choisi le plugin <a
href="http://github.com/mpeltonen/sbt-idea-plugin" title="sbtideaplugin" >sbt-idea-plugin</a>. A noter que celui-ci fournit son propre repository maven donc pas de <code>git clone</code> sur le projet avec un <code>publish-local</code> comme pour SbtEclipsify. Tout se fait cette fois-ci très simplement !</p><p>Comme pour SbtEclipsify, le plugin fournit un trait qu&#8217;il faudra ajouter à sa classe projet qui lui permettra d&#8217;avoir la commande <code>idea</code> disponible dans le shell.</p><p>Il faut donc tout d&#8217;abord se rendre dans la classe <code>project/plugins/Plugins.scala</code> et ajouter ces quelques lignes. Elles ajouteront un repository distant et la dépendance du plugin :</p><pre class="brush: java; title: ; notranslate">
val repo = &quot;GH-pages repo&quot; at &quot;http://mpeltonen.github.com/maven/&quot;
val idea = &quot;com.github.mpeltonen&quot; % &quot;sbt-idea-plugin&quot; % &quot;0.1-SNAPSHOT&quot;
</pre><p>Maintenant que notre plugin est prêt à l&#8217;emploi, nous allons l&#8217;ajouter dans la configuration de notre projet <em>(toujours au niveau de <code>project/build/MyProject.scala</code>)</em>. Cela nous donne :</p><pre class="brush: java; title: ; notranslate">
import sbt._
import de.element34.sbteclipsify._
class MainProject(info: ProjectInfo) extends ParentProject(info) with IdeaPlugin {
  lazy val myProject = project(&quot;myproject&quot;, &quot;My Project&quot;, new DefaultProject(_) with IdeaPlugin)
   // ...
}
</pre><p>Grosse différence avec Eclipse : le plugin fonctionne par défaut, même si l&#8217;on a qu&#8217;un seul project, comme une arborescence de projets. Ainsi, nous aurons un projet parent composé de sous-projet(s). Pour utiliser ce plugin, nous allons donc <em>(cf. code ci-dessus)</em> créer un projet <code>MainProject</code> en tant que conteneur de projet en étendant <code>ParentProject</code>. Ensuite, nous créerons dans ce projet sbt un projet de type <code>DefaultProject</code> qui contiendra notre code <em>({{src/main/scala}}&#8230;)</em>.<br
/> Notez que les deux projets utilisent le trait <code>IdeaPlugin</code>. En effet, IntelliJ IDEA gère parfaitement l&#8217;arborescence de projets. Nous aurons donc les deux projets importés dans l&#8217;IDE avec la vue projets qui nous affichera le projet parent et notre projet.</p><p>A ce niveau, comme pour Eclipse, tout est prêt ! Donc un <code>update</code> et cette fois-ci un <code>idea</code> pour lancer le plugin :</p><pre class="brush: java; title: ; notranslate">
$ sbt
$ update
$ idea
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/5-update-idea.png" border="0" alt=""  width="650" /></div><p>Et le résultat avec notre projet parent contenant notre sous-projet une fois importé dans IntelliJ IDEA <em>(par le fichier <code>.ipr</code>)</em> :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/6-intellij-idea.png" border="0" alt=""  width="650" /></div><h3><a
name="Lesdeux"></a>Les deux ?</h3><p>Et si tout comme moi, cela vous arrive de <em>switcher</em> de l&#8217;un à l&#8217;autre selon votre humeur <em>(tiens aujourd&#8217;hui j&#8217;ai envie de faire du Eclipse <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )</em>, vous pourrez bien évidemment configurer votre projet pour qu&#8217;il accueille ces deux environnements de développement. La configuration finale sera un mix de ce que l&#8217;on a vu précédemment. En ne prenant pas le projet parent en tant que projet Eclipse <em>(car il ne les gère pas très bien)</em>, cela nous donne tout simplement :</p><pre class="brush: java; title: ; notranslate">
class MainProject(info: ProjectInfo) extends ParentProject(info) with IdeaPlugin {
   lazy val myProject = project(&quot;myproject&quot;, &quot;My Project&quot;, new MyProject(_) with IdeaPlugin with Eclipsify)
   class MyProject(info: ProjectInfo) extends DefaultProject(info) {
      // Put here MyProject dependencies
   }
}
</pre><p>Cette configuration fonctionne <em>out-of-the-box</em> pour IntelliJ IDEA, par contre pour Eclipse un problème de build path subsiste. Il est directement lié à cette arborescence de projets <em>(module / sous-module)</em> qui n&#8217;est actuellement pas géré par le plugin  :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/7-erreur-eclipse.png" border="0" alt=""  width="650" /></div><p>Il faudra donc modifier à la main le build path de notre projet. Une fois celui-ci modifié, le projet sera opérationnel pour Eclipse et vous n&#8217;aurez plus qu&#8217;à faire des <code>sbt update</code> pour mettre à jour vos dépendances :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/8-configuration-eclipse.png" border="0" alt=""  width="650" /></div><p>Dernière chose, entre la configuration pour avoir les deux plugins et celle d&#8217;IntelliJ IDEA standalone : notez  la  différence concernant le sous-projet <code>MyProject</code> avec non plus l&#8217;utilisation directe d&#8217;une nouvelle instance de <code>DefaultProject</code> mais la création et l&#8217;instanciation d&#8217;une nouvelle classe <code>MyProject</code> qui étend <code>DefaultProject</code>. Cela va nous permettre de définir des dépendances uniquement au niveau du sous-projet et ainsi ne pas tout mettre au niveau du projet parent. Il est dès lors possible d&#8217;ajouter plusieurs sous-projets à <code>MainProject</code> et ainsi se retrouver avec le même type d&#8217;arborescence de modules que l&#8217;on retrouve dans nos projets maven.</p><p>Vous pouvez toujours récupérer le petit projet <a
href="http://github.com/rmat0n/scala-samples" title="scalasamples" >scala-samples</a> qui possède cette double configuration idea/eclipse.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/11/configurer-vos-projets-sbt-pour-eclipse-ou-intellij-idea/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>SBT (simple-build-tool) pour Scala</title><link>http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/</link> <comments>http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/#comments</comments> <pubDate>Thu, 06 May 2010 07:53:40 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Ivy]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[SBT]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4568</guid> <description><![CDATA[Maintenant que vous êtes tous convaincus par Scala, nous allons regarder durant les prochaines semaines quelques outils et frameworks indispensables pour démarrer nos projets d&#8217;entreprise. En effet, tout comme dans nos projets Java, il n&#8217;est plus envisageable au jour d&#8217;aujourd&#8217;hui de commencer un projet sans un environnement minimum : un bon IDE, un outil de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/scala-logo.png" border="0" alt="" style="margin: 1em 1em 1em 2em; float: right;" /><br
/> Maintenant que vous êtes tous <a
href="http://blog.xebia.fr/2010/04/20/merci-paris-jug/" title="convaincus par Scala" >convaincus par Scala</a>, nous allons regarder durant les prochaines semaines quelques outils et frameworks indispensables pour démarrer nos projets d&#8217;entreprise. En effet, tout comme dans nos projets Java, il n&#8217;est plus envisageable au jour d&#8217;aujourd&#8217;hui de commencer un projet sans un environnement minimum : un bon IDE, un outil de build, de l&#8217;intégration continue, un outil de couverture de tests et bien d&#8217;autres. Leurs buts : nous faciliter le développement et nous avertir d&#8217;éventuels problèmes dans notre code <em>(manque de tests, trop de warnings&#8230;)</em>.</p><p>Le sujet de cet article n&#8217;est autre que le framework Scala qui monte <em>(très vite)</em> en ce moment à savoir <a
href="http://code.google.com/p/simple-build-tool/" title="sbt (pour simple-build-tool)" >sbt (pour simple-build-tool)</a>. Nous verrons dans cet article ce qu&#8217;est sbt, ses différentes fonctionnalités et en quoi cet outil va nous être très utile dans nos développements quotidiens.</p><h3><a
name="YetAnotherBuildTool"></a>Yet Another Build Tool ?</h3><p>sbt est un outil de build qui se veut simple d&#8217;utilisation. Son objectif est de fournir des fonctionnalités basiques et avancées très simples à implémenter sur un projet Scala ou Java.<br
/> On pourra dès lors n&#8217;utiliser notre IDE qu&#8217;en tant qu&#8217;éditeur de texte et laisser à sbt les tâches de compilation, de tests unitaires sur une ou plusieurs versions de Scala <em>(très utile pour les concepteurs d&#8217;API)</em>, changer de version de Scala en cours de développement&#8230;</p><p>La configuration de se fait en Scala à l&#8217;aide d&#8217;un DSL qui vous permettra de spécifier ses dépendances de projet, ses plugins et beaucoup d&#8217;autres paramètres. Le gestionnaire de dépendances utilisé est ivy. Il est possible pour son projet de spécifier un repository maven ou autre et ainsi n&#8217;avoir qu&#8217;un seul repository centralisé sur sa machine.</p><p>A notez que sbt tourne au minimum sur Java 5.</p><h3><a
name="Fonctionnalits"></a>Fonctionnalités</h3><h4><a
name="Gnrales"></a>Générales</h4><p>L&#8217;outil propose plusieurs fonctionnalités en standard dont :</p><ul><li>Configuration du projet en Scala,</li><li>Compilations et tests en continu,</li><li>Support de projets Java et Scala,</li><li>Génération de la <code>scaladoc</code>,</li><li>Frameworks ScalaCheck, Specs et ScalaTest supportés par défaut,</li><li>Démarrage du REPL avec projet et dépendances dans le classpath,</li><li>Exécution de tâches en parallèle <em>(dont les tests)</em>,</li><li>Gestion de dépendances inline, ivy ou maven.</li></ul><p>Nous allons regarder plus en détail les actions possibles dans sbt, la configuration d&#8217;un projet sbt ainsi que les quelques cas d&#8217;utilisation.</p><h4><a
name="Actions"></a>Actions</h4><p>Il y a plusieurs manières d&#8217;utiliser sbt. Soit en lançant la console sbt pour effectuer nos actions unitairement dans l&#8217;environnement sbt, soit en mode batch avec certaines commandes prédéfinies dans l&#8217;appel à sbt. Il est aussi possible <em>(nous le détaillerons plus tard dans l&#8217;article)</em> de mettre une action en attente de modification de fichiers pour ensuite être lancée.</p><pre class="brush: java; title: ; notranslate">
// Console
$ sbt
&gt; compile
&gt; test
&gt; ...
// Batch
$ sbt clean compile &quot;get sbt.version&quot;
// Wait
$ sbt
&gt; ~ test
</pre><p>Il est possible de lancer une action sur une version de Scala spécifique. Ainsi, si l&#8217;on souhaite par exemple compiler notre projet en Scala 2.8.0 alors que notre projet est actuellement en Scala 2.7.7, nous ferons :</p><pre class="brush: java; title: ; notranslate">
// 2.7.7 by default
&gt; compile
// Force 2.8.0.Beta1 version
&gt; ++2.8.0.Beta1 compile
</pre><p>Les actions possibles sont assez <a
href="http://code.google.com/p/simple-build-tool/wiki/RunningSbt#Actions" title="nombreuses" >nombreuses</a> sachant que vous connaissez déjà bon nombre d&#8217;entre elles :</p><ul><li><code>clean</code>, <code>compile</code>, <code>exec</code>, <code>jetty-run</code>, <code>package</code>, <code>test</code>&#8230; qui font ce que vous savez <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ,</li><li><code>update</code> pour mettre à jour vos dépendances,</li><li><code>sh</code> qui invoque le shell unix pour par exemple exécuter un find,</li><li>nombreuses actions sur <code>test-*</code> et <code>package-*</code> avec plusieurs déclinaisons <em>(<code>all, docs, project, failed, quick...</code>)</em>,</li><li><code>console</code> et <code>console-quick</code> pour démarrer l&#8217;interpréteur Scala <em>(REPL)</em>, la différence entre les deux se faisant sur le classpath chargé au démarrage,</li></ul><p>Concernant les actions qui touchent à l&#8217;environnement sbt, nous avons :</p><ul><li><code>exit</code>, <code>quit</code>, <code>help</code>, <code>info</code>, <code>debug</code>, <code>trace</code>, <code>warn</code>, <code>error</code>&#8230;,</li><li><code>reload</code> qui permet de recharger les modifications effectuées sur la configuration de notre projet,</li><li><code>current</code> qui nous donne le nom du projet ainsi que le niveau de log actuel,</li><li><code>projects</code> qui liste tous les projets disponibles en cas d&#8217;arborescence de projets,</li><li><code>; A ; B</code> qui exécute une action A et qui, si elle réussie, exécute une action B.</li></ul><p>Il est bien sûr possible de créer ses propres actions en construisant une tâche <code>Task</code> de la manière suivante :</p><pre class="brush: java; title: ; notranslate">
lazy val foo = task { log.info(&quot;Foo !&quot;); None }
</pre><p>La tâche <code>foo</code> sera alors créée et disponible dans la console sbt. A noter qu&#8217;une syntaxe minuscule et une séparation par tiret est respectée pour les noms de tâche, ainsi une variable nommée <code>fooBar</code> donnera comme tâche <code>foo-bar</code>.</p><p>Il est possible de définir sur quelle phase du build la tâche doit être lancée et de fournir une description de la tâche :</p><pre class="brush: java; title: ; notranslate">
lazy val jars = task { ... } dependsOn(compile, doc) describedAs(&quot;Package classes and API docs.&quot;)
</pre><p>Il est aussi possible de modifier des actions existantes comme <code>clean</code>, <code>test</code> ou bien encore <code>package</code> mais aussi de modifier la dépendance de ces tâches par rapport à d&#8217;autres tâches. Vous pouvez aussi faire de l&#8217;exécution conditionnelle pour des tâches générant des fichiers. Différentes stratégies existent, on pourra ainsi définir qu&#8217;une tâche ne doit être exécutée que si les fichiers cibles qu&#8217;elle génère sont périmés ou bien constamment générer ces fichiers cibles.</p><h4><a
name="Configuration"></a>Configuration</h4><p>L&#8217;arborescence d&#8217;un projet sbt est la suivante :</p><pre class="brush: java; title: ; notranslate">
lib/
lib_managed/
project/
   boot/
   build/
      MyProjectConf.scala
   plugins/
      Plugins.scala
   build.properties
src/
   main/
      scala/
      resources/
   test/
      scala/
      resources/
target/
</pre><p>On remarque la même arborescence de dossier que pour un projet maven à savoir <code>src/main/scala</code> et <code>src/main/resources</code> pour les sources et <code>src/test/scala</code> et <code>src/test/resources</code> pour les tests. Concernant les autres dossiers, <code>lib</code> vous permettra de déposer vos librairies, <code>lib_managed</code> contiendra vos dépendances <em>(si aucun repository n&#8217;est spécifié)</em>, <code>project/build</code> votre configuration projet tandis que <code>project/plugins</code> vous permettra de définir les plugins que votre projet utilisera.</p><p>La définition des dépendances et la gestion des plugins se fait en Scala. Voici quelques exemples de définition de dépendances :</p><pre class="brush: java; title: ; notranslate">
lazy val jetty = &quot;org.mortbay.jetty&quot; % &quot;jetty&quot; % &quot;6.1.22&quot;
lazy val h2 = &quot;com.h2database&quot; % &quot;h2&quot; % &quot;1.2.121&quot;
lazy val junit = &quot;junit&quot; % &quot;junit&quot; % &quot;4.5&quot; % &quot;test&quot;
lazy val slf4 = &quot;org.slf4j&quot; % &quot;slf4j-log4j12&quot; % &quot;1.4.1&quot;
</pre><p>Il est possible de définir un projet de type parent qui contiendra plusieurs projets <em>(modules)</em>. La configuration pour ce type de projet est la suivante :</p><pre class="brush: java; title: ; notranslate">
import sbt._
class ParentProject(info: ProjectInfo) extends ParentProject(info) {
   lazy val core = project(&quot;core&quot;, &quot;Core project&quot;)
   lazy val client = project(&quot;client&quot;, &quot;Client project&quot;, core) // Project based on core
   lazy val dao = project(&quot;dao&quot;, &quot;DAO project&quot;, new DAOProject(_))
   class DAOProject(info: ProjectInfo) extends DefaultProject(info) {
      // Define here custom dependencies
   }
}
</pre><p>Il est aussi possible de définir sa configuration projet à partir d&#8217;un fichier maven <code>pom.xml</code> ou d&#8217;un fichier ivy <code>ivy.xml</code>. Pour cela, il suffit de les ajouter à la racine de votre projet. Ainsi, sur une commande <code>update</code>, sbt utilisera le fichier maven ou ivy pour gérer les dépendances du projet.</p><p>Les configurations possibles sont nombreuses. Pour une configuration plus avancée, je vous renvoie vers <a
href="http://code.google.com/p/simple-build-tool/wiki/BuildConfiguration" title="cette page" >cette page</a> qui détaille exhaustivement tout ce que l&#8217;on peut faire en terme de configuration dans un projet sbt, du changement de l&#8217;arborescence des dossiers aux options de compilation, package et test.</p><h3><a
name="Casdutilisation"></a>Cas d&#8217;utilisation</h3><h4><a
name="Triggeredexecution"></a>Triggered execution</h4><p>En effet, sbt ne se résume pas qu&#8217;à un simple outil de configuration projet. Nous avons vu au début de cet article les actions possibles dans sbt, comme par exemple <code>compile</code> ou <code>test</code>. Ce sont des actions <em>one shot</em> qu&#8217;il faudra relancer autant de fois que l&#8217;on voudra pour, dans ce cas, compiler ou tester.</p><p>Mais, en préfixant ces actions par le caractère <code>~</code>, sbt se mettra en attente de modification dans le <em>scope</em> de l&#8217;action et dès qu&#8217;une modification sera effectuée, l&#8217;action sera <em>déclenchée</em>, d&#8217;où leur nom : <em>triggered execution</em>. Ainsi, si une modification se produit par exemple dans <code>src/main/scala</code>, <code>compile</code> et <code>test</code> seront appelés car ils sont en attente de modifications sur les fichiers sources du projet.</p><p>Actuellement, trois types d&#8217;actions sont de type <em>triggered  execution</em> :</p><ul><li> compilation : avec la compilation continue par <code>~ test-compile</code> ou uniquement la compilation des sources dans <code>main</code> avec <code>~ compile</code> ;</li><li>test : avec <code>~ test-quick</code> pour lancer les tests qui n&#8217;ont pas encore réussi <em>(nouveau ou failed du tests précédent)</em> ou qui ont été recompilés, <code>~ test-failed</code> pour lancer uniquement les tests qui n&#8217;ont pas encore réussi <em>(mais ne relance pas les tests recompilés comme <code>~ test-quick</code>)</em> et <code>~ test-only mytestpackage.MyTest</code> pour lancer les tests de la classe spécifiée ;</li><li>web-app : si vous utilisez jetty et une fois jetty lancé <em>(<code>jetty-run</code>)</em>, la commande <code>~ prepare-webapp</code> recompilera la webapp pour prendre en compte les modifications. Pour avoir une compilation continue <em>totale</em>, je vous renvoie à la section <a
href="http://code.google.com/p/simple-build-tool/wiki/WebApplications#JRebel" title="JRebel" >JRebel</a> qui explique comment prendre en compte JRebel pour scanner certains dossiers à recharger dynamiquement et ainsi éviter les reloads de Jetty.</li></ul><h4><a
name="Crossbuilding"></a>Cross building</h4><p>L&#8217;autre cas d&#8217;utilisation qu&#8217;offre sbt est le <em>cross building</em>. Cette fonctionnalité est un véritable atout pour toute API ayant comme cible de nombreuses versions de Scala, surtout si elles ne sont pas binairement compatibles entre elles, comme par exemple Scala 2.7.7 et la prochaine version 2.8.0 <em>(mais c&#8217;est aussi le cas entre 2.7.2 et 2.7.4)</em>.</p><p>Voyons d&#8217;abord comment utiliser une librairie <em>packagée</em> différemment pour cette version de Scala. L&#8217;exemple ci-dessous montre en premier le fait d&#8217;imposer la version de Scala. Le problème est que si l&#8217;on change temporairement de version de Scala dans notre projet, il risque de ne pas builder. Le second exemple nous montre que sbt peut récupérer la bonne version de la librairie en fonction de la version de Scala courante de notre projet à l&#8217;aide de la dépendance spéciale <code>%%</code> :</p><pre class="brush: java; title: ; notranslate">
val dispatch = &quot;net.databinder.dispatch&quot; % &quot;dispatch_2.7.7&quot; % &quot;0.7.2&quot;
val dispatch = &quot;net.databinder.dispatch&quot; %% &quot;dispatch&quot; % &quot;0.7.2&quot;
</pre><p>Maintenant, nous allons pouvoir construire notre projet dans différentes versions de Scala en très peu de configuration et surtout en un caractère ! La définition se fait directement dans la console sbt de la manière suivante :</p><pre class="brush: java; title: ; notranslate">
$ sbt
&gt; set build.scala.versions 2.7.7 2.8.0.Beta1 2.7.5 2.7.3 2.7.2
&gt; reload
</pre><p>Par défaut, sbt utilisera la première version définie comme version par défaut. Vous pouvez bien sûr changer de version à tout moment à l&#8217;aide de la commande <code>++version</code>.</p><p>Et pour le <em>cross building</em>, il suffit de préfixer notre action par <code>+</code> pour qu&#8217;elle soit exécutée sur toutes les versions ciblées par notre projet :</p><pre class="brush: java; title: ; notranslate">
&gt; +package
&gt; +publish
</pre><p>Point important : certaines dépendances de votre projet ne seront peut-être pas les mêmes selon les versions de Scala que vous ciblez. Il est donc important de faire un pattern matching sur les API qui pourraient poser problème :</p><pre class="brush: java; title: ; notranslate">
val scalatest = buildScalaVersion match {
   case &quot;2.7.5&quot; =&gt; &quot;org.scala-tools.testing&quot; % &quot;scalatest&quot; % &quot;0.9.5&quot;
   case &quot;2.7.2&quot; =&gt; &quot;org.scalatest&quot; % &quot;scalatest&quot; % &quot;0.9.3&quot;
   case x =&gt; error(&quot;Unsupported Scala version &quot; + x)
}
</pre><h4><a
name="Projectconsole"></a>Project console</h4><p>Dernier cas d&#8217;utilisation que nous verrons dans cet article, le lancement de la console avec tout le contexte de projet intégralement chargé. Ainsi, <code>console-project</code> démarre l&#8217;interpréteur Scala avec le projet courant chargé. On peut dès lors utiliser tous nos objets et faire quelques tests directement dans la console.<br
/> Mais ce mode permet bien plus que l&#8217;appel de nos objets, il permet aussi, entre autres, de :</p><ul><li>voir les options de compilation : <code>compileOptions.foreach(println)</code> ;</li><li>voir tous les repository : <code>repositories.foreach(println)</code> et <code>ivyRepositories.foreach(println)</code> ;</li><li>voir le classpath de compilation et celui des test : <code>compileClasspath</code> et <code>testClasspath</code> ;</li><li>ou bien encore voir les dépendances de projet : <code>mainDependencies.external</code>, <code>mainDependencies.libraries</code> et <code>mainDependencies.scalaJars</code>.</li></ul><h3><a
name="Installation"></a>Installation</h3><p>Maintenant que vous en savez plus sur sbt, j&#8217;espère que vous avez l&#8217;eau à la bouche et que avez envie de jouer avec l&#8217;outil <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Nous allons donc voir comment installer la bête. Tout d&#8217;abord, rendez-vous sur <a
href="http://code.google.com/p/simple-build-tool/downloads/list" title="cette page" >cette page</a> pour télécharger la dernière version de sbt.</p><p>Pour l&#8217;installation sous Mac, il suffit d&#8217;ajouter un fichier dont le nom sera <code>sbt</code> au même niveau que votre Jar sbt avec le contenu suivant :</p><pre class="brush: java; title: ; notranslate">
java -Xmx512M -jar `dirname $0`/sbt-launch.jar &quot;$@&quot;
</pre><p>Il faudra ensuite ajouter dans votre <em>path</em> le répertoire contenant ce fichier et le Jar sbt. Exemple dans <code>.bash_profile</code> :</p><pre class="brush: java; title: ; notranslate">
export SBT_HOME=$HOME/dev/scala/sbt
export PATH=$SBT_HOME:$PATH
</pre><p>Voilà, c&#8217;est installé ! Pour les accros de la ligne de commande, voici un mode d&#8217;installation fait pour eux <em>(unix)</em> qui est d&#8217;ailleurs expliqué sur le <a
href="http://code.google.com/p/simple-build-tool/wiki/Setup#Unix" title="site de sbt" >site de sbt</a> qui installe sbt dans <code>/usr/local/bin/</code> :</p><pre class="brush: java; title: ; notranslate">
$ cd ~
$ wget http://simple-build-tool.googlecode.com/files/sbt-launcher-0.7.3.jar
$ sudo mv sbt-launcher-0.5.6.jar /usr/local/bin/sbt-launcher.jar
$ echo &quot;java -Xmx512M -jar /usr/local/bin/sbt-launcher.jar &quot;$@&quot;&quot; | sudo tee /usr/local/bin/sbt
$ sudo chmod +x /usr/local/bin/sbt
</pre><p>En ce qui concerne l&#8217;installation Windows, cela se passe <a
href="http://code.google.com/p/simple-build-tool/wiki/Setup#Windows" title="ici" >ici</a>.</p><p>Nous allons maintenant tester l&#8217;installation. Commençons par créer un dossier, déplaçons nous dedans et lançons la commande sbt en répondant <code>s</code> à la question de création de projet <em>(pour <code>scratch</code> qui fera une configuration rapide du projet)</em>. Faisons ensuite un <code>compile</code> même si aucune source n&#8217;existe actuellement :</p><pre class="brush: java; title: ; notranslate">
$ mkdir foobar-project
$ cd foobar-project
$ sbt
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/1-sbt-installation.png" border="0" alt="" /></div><p>Build successful ! Ajoutons maintenant un fichier <code>PrintMessage.scala</code> dans <code>src/main/scala</code> qui affichera un message dans la console sur la tâche <code>run</code> :</p><pre class="brush: java; title: ; notranslate">
object PrintMessage {
  def main(args: Array[String]) = println(&quot;Foobar Scala !&quot;)
}
</pre><p>Et maintenant lançons notre message à l&#8217;aide de l&#8217;action <code>run</code> :</p><pre class="brush: java; title: ; notranslate">
$ sbt run
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/2-sbt-installation-run.png" border="0" alt="" /></div><p>Vous voilà prêt pour utiliser sbt !</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Cet outil est déjà très utilisé par plusieurs projets Scala open-source <em>(dont par exemple <a
href="http://akkasource.org/" title="akka" >akka</a>)</em>. Les possibilités sont très nombreuses et n&#8217;ont pas toutes été énumérées dans le présent article. Je vous renvoie vers le <a
href="http://code.google.com/p/simple-build-tool/wiki/BuildConfiguration" title="wiki" >wiki</a> de sbt pour un détail complet des fonctionnalités de l&#8217;outil.</p><p>Ce qui ressort après quelques heures d&#8217;utilisation c&#8217;est l&#8217;extrême simplicité d&#8217;utilisation de l&#8217;outil, la simplicité de configuration d&#8217;un projet et la puissance d&#8217;avoir en tâche de fond les tests en continu. <a
href="http://macstrac.blogspot.com/2010/01/using-sbt-on-your-scala-maven-project.html" title="Certaines" >Certaines</a> <a
href="http://twitter.com/hseeberger/status/13121125642" title="personnes" >personnes</a> vont même jusqu&#8217;à se désynchroniser totalement de leur IDE qui ne devient dès lors qu&#8217;un simple éditeur de texte laissant à sbt la compilation, les tests et l&#8217;exécution. <a
href=" http://zikaprog.wordpress.com/2010/04/19/scala-eclipse-sbt-and-debugging/" title="Dautres" >D&#8217;autres</a> nous expliquent comment configurer Eclipse pour faire du debug sur des tests lancés depuis la console sbt.</p><p>Un petit exemple de projet sbt est d&#8217;ailleurs disponible sur mon <a
href="http://github.com/rmat0n/scala-samples" title="GitHub" >GitHub</a>. A vous de jouer !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/06/sbt-simple-build-tool-pour-scala/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Merci Paris Jug !</title><link>http://blog.xebia.fr/2010/04/20/merci-paris-jug/</link> <comments>http://blog.xebia.fr/2010/04/20/merci-paris-jug/#comments</comments> <pubDate>Tue, 20 Apr 2010 08:00:18 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Paris JUG]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4444</guid> <description><![CDATA[La soirée Scala du Paris JUG a eu lieu ce Mardi 13 Avril, et à ce titre nous tenions à remercier les organisateurs de cet événement ainsi que les personnes présentes dans la salle. Merci aussi pour la troisième mi-temps qui a été l&#8217;occasion de retours positifs sur les présentations de la soirée et qui [...]]]></description> <content:encoded><![CDATA[<p>La soirée Scala du Paris JUG a eu lieu ce Mardi 13 Avril, et à ce titre nous tenions à remercier les organisateurs de cet événement ainsi que les personnes présentes dans la salle.</p><p>Merci aussi pour la troisième mi-temps qui a été l&#8217;occasion de retours positifs sur les présentations de la soirée et qui nous a permis de constater que ces dernières ont donné envie à beaucoup de personnes de s&#8217;essayer à Scala. En effet, comme l&#8217;explique Nicolas Martignole dans <a
href="http://www.touilleur-express.fr/2010/04/18/soiree-scala-au-paris-jug/" title="son article" >son article</a>, cette troisième mi-temps permet de poursuivre les discussions et les débats que les présentations engendrent mais aussi de rencontrer des personnes passionnées comme nous le sommes.</p><p>Vous trouverez les slides de notre présentation à <a
href="http://www.slideshare.net/guest2df4a547/13042010-scala-paris-jug-nicolas-jozwiak-romain-maton" title="cette adresse" >cette adresse</a>.</p><p>Merci encore et à bientôt !</p><div
align="center"><div
style="width:425px" id="__ss_3766936"><strong
style="display:block;margin:12px 0 4px"><a
href="http://www.slideshare.net/guest2df4a547/13042010-scala-paris-jug-nicolas-jozwiak-romain-maton" title="13042010 Scala Paris JUG (Nicolas Jozwiak, Romain Maton)">13042010 Scala Paris JUG (Nicolas Jozwiak, Romain Maton)</a></strong><object
width="425" height="355"><param
name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=13042010scalajug-100418112955-phpapp01&#038;rel=0&#038;stripped_title=13042010-scala-paris-jug-nicolas-jozwiak-romain-maton" /><param
name="allowFullScreen" value="true"/><param
name="allowScriptAccess" value="always"/><embed
src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=13042010scalajug-100418112955-phpapp01&#038;rel=0&#038;stripped_title=13042010-scala-paris-jug-nicolas-jozwiak-romain-maton" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/04/20/merci-paris-jug/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Jour 5 &#8211; Projet Lombok</title><link>http://blog.xebia.fr/2009/11/27/devoxx-jour-5-projet-lombok/</link> <comments>http://blog.xebia.fr/2009/11/27/devoxx-jour-5-projet-lombok/#comments</comments> <pubDate>Fri, 27 Nov 2009 16:58:25 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Lombok]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3389</guid> <description><![CDATA[Parce que toutes les bonnes choses ont une fin, voici venir pour moi la dernière session de ce Devoxx 2009 avec le Projet Lombok présenté par les développeurs de l&#8217;outil (Roel Spilker et Reinier Zwitserloot). &#160; L&#8217;objectif de ce produit est de nous faire gagner du temps et d&#8217;améliorer la lisibilité de nos classes. Comment [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/speakers.jpg" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Parce que toutes les bonnes choses ont une fin, voici venir pour moi la <a
href="http://www.devoxx.com/display/DV09/Project+Lombok" title="dernière session de ce Devoxx 2009" >dernière session de ce Devoxx 2009</a> avec le <a
href="http://www.projectlombok.org/" title="Projet Lombok" >Projet Lombok</a> présenté par les développeurs de l&#8217;outil <em>(<a
href="http://www.devoxx.com/display/DV09/Roel+Spilker" title="Roel Spilker" >Roel Spilker</a> et <a
href="http://www.devoxx.com/display/DV09/Reinier+Zwitserloot" title="Reinier Zwitserloot" >Reinier Zwitserloot</a>)</em>.</p><p>&nbsp;</p><p>L&#8217;objectif de ce produit est de nous faire gagner du temps et d&#8217;améliorer la lisibilité de nos classes. Comment ? Et bien, moyennant quelques annotations, l&#8217;outil va par exemple générer pour nous les méthodes <code>toString</code>, <code>equals</code> et <code>hashcode</code> mais aussi les <em>getters</em> et <em>setters</em> de notre POJO. Certes, nos IDEs nous proposent déjà ce travail mais il subsiste 2 différences de taille :</p><ul><li>ce n&#8217;est plus au développeur d&#8217;appeler les <em>Generate xxx</em> d&#8217;eclipse, la génération de ces méthodes se fera à l&#8217;import des annotations ou à la sauvegarde du fichier ;</li><li>mais surtout, la génération de ces méthodes ne se fait pas dans le code source Java mais directement dans le Bytecode, nos POJOs restent donc <em>clean</em>.</li></ul><h3><a
name="CtIDE"></a>Côté IDE</h3><p>Prenons par exemple une classe standard avec une propriété <code>firstname</code> et une propriété <code>lastname</code>. En y ajoutant simplement l&#8217;annotation @Data (décrite ci-après dans l&#8217;article), nous pouvons constater que la vue Outline d&#8217;eclipse s&#8217;est bien mise à jour avec les méthodes <code>getFirstName</code>, <code>setFirstName</code>, <code>toString</code> etc&#8230; . Bien que non implémentées, ces méthodes existent et sont totalement fonctionnelles au sein du projet dans eclipse :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/outline.png" border="0" alt="" /></div><h3><a
name="Ctcode"></a>Côté code</h3><p>Plusieurs annotations nous sont proposées. Chacune possède sa spécificité / spécialité :</p><ul><li><code>@Getter</code> et <code>@Setter</code> avec prochainement <code>@Property</code> qui fera les 2 ;</li><li><code>@ToString</code> ;</li><li><code>@EqualsAndHashCode</code> ;</li><li><code>@Data</code> qui regroupe les 4 annotations précédentes ;</li><li><code>@Synchronized</code> qui nous permet de simplifier l&#8217;écriture de bloc <code>synchronized</code> ;</li><li><code>@SneakyThrows</code> qui nous permet de ne pas écrire de <code>try catch</code> ou de <code>throws</code> dans/sur notre méthode. L&#8217;exemple décrit ci-après est l&#8217;<code>UnsupportedEncodingException</code> du constructeur <code>String</code> avec par exemple <em>UTF-8</em> comme Charset : cette exception ne pourra jamais être levée car la JVM doit fournir UTF-8 ;</li><li><code>@Cleanup</code> qui nous enlève le lourd poids de devoir appeler la méthode <code>close</code> sur des <code>Stream</code> dans différents <code>try finally</code>.</li></ul><p>Toutes ces annotations sont bien sûr paramétrables (<em>AccessLevel</em>, <em>exclude</em>, <em>of</em>, <em>staticConstructor</em>&#8230;) ce qui nous permet entre autres d&#8217;inclure ou d&#8217;exclure certains champs du processus de génération (idéal pour un <code>equals</code> ou un <code>toString</code>).</p><p>Ces annotations paramétrables (voir <em>AccessLevel</em>, <em>exclude</em>, <em>of</em>, <em>staticConstructor</em> etc&#8230;) influent directement sur le code généré. Ainsi on peut régler à sa guise, portée, visibilité, ou utilisation des attributs de la classe. Cela peut être très pratique pour des méthodes telles que <code>equals</code> ou <code>hashcode</code>.</p><p>Voici un exemple de code d&#8217;une classe Java <em>lombok-ifée</em> :</p><pre class="brush: java; title: ; notranslate">
// @Data does @Getter, @Setter, @ToString and @EqualsAndHashCode
@ToString
@EqualsAndHashCode
public class MyPojo {
	private @Getter @Setter(AccessLevel.PUBLIC) String firstname;
	private @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PRIVATE) String lastname;
	@Synchronized
	@SneakyThrows({UnsupportedEncodingException.class, IOException.class})
	public void init() {
		setFirstname(&quot;foobar&quot;);
		@Cleanup InputStream in = new FileInputStream(&quot;c:/input.txt&quot;);
		@Cleanup OutputStream out = new FileOutputStream(&quot;c:/output.txt&quot;);
	    	byte[] bytes = new byte[10000];
	    	while (true) {
	       		int r = in.read(bytes);
	       		if (r == -1) break;
	       		out.write(bytes, 0, r);
	    	}
		setLastname(new String(&quot;abc&quot;.getBytes(), &quot;UTF-8&quot;));
	}
	public static void main(String[] args) {
		MyPojo myPojo = new MyPojo();
		myPojo.init();
		System.out.println(myPojo.toString());
		System.out.println(myPojo.equals(new MyPojo()));
	}
}
</pre><h3><a
name="Incubation"></a>Incubation</h3><p>L&#8217;équipe travaille actuellement sur d&#8217;autres annotations et plus globalement sur des améliorations de syntaxe Java :</p><ul><li><code>@Delegate</code> sur une propriété d&#8217;une classe faisant que cette classe hériterait des méthodes de cette propriété. On pourrait donc avoir une classe qui implémente l&#8217;interface <code>Iterable&lt;Something&gt;</code> et qui aurait une propriété <code>@Delegate Iterable&lt;Something&gt; listDelegate = new ArrayList&lt;Something&gt;()</code> : la classe récupère ainsi toutes les méthodes de l&#8217;objet <code>listDelegate</code> et n&#8217;a ainsi absolument plus besoin de définir toutes les méthodes de l&#8217;interface <code>Iterable&lt;Something&gt;</code> côté Java <em>(par contre côté Bytecode tout est là !)</em> ;</li><li><code>@Mixin(MyClass.class)</code> qui permet de rajouter dynamiquement du comportement à une classe, en l&#8217;occurrence les méthodes de <code>MyClass</code> dans la classe qui aurait définit cette annotation ;</li><li>Le <code>String</code> multi-lignes avec les 3 guillemets d&#8217;ouverture et les 3 autres de fermeture avec au milieu autant de retours à la ligne que vous le souhaitez ;</li><li>La création de liste simplifiée à partir d&#8217;une autre liste avec une syntaxe très particulière : <code>Mountain m : mountainList where (m.getAltitude() > 1000) select (m.getName())</code> qui ferait qu&#8217;en une ligne on passe d&#8217;une liste de montagne à une liste de nom de montagne.</li></ul><h3><a
name="Limitations"></a>Limitations</h3><p>Malgré les avancées notables de cette solution, des difficultés subsistent. L&#8217;intégration avec les IDEs, notamment pour les fonctions de refactoring, est à compléter. Car dans ce cas, le code n&#8217;existant pas (dans le fichier java), il est ardu de faire du refactoring.</p><p>Pour l&#8217;instant, seul Eclipse est supporté par Lombok. Cependant l&#8217;équipe travaille au support pour Netbeans et depuis peu pour IntelliJ IDEA Community Edition.</p><p>Les fonctionnalités sont charmantes, mais on peut constater que la route est encore longue. D&#8217;ailleurs, les speakers le reconnaissent volontiers quand ils annoncent avec humour que : <em>&laquo;&nbsp;la montagne est haute mais pas insurmontable&nbsp;&raquo;</em> <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/2009/11/montagne.jpg" border="0" alt="" /></div><h3><a
name="Conclusion"></a>Conclusion</h3><p>Un outil à surveiller donc, et qui pourrait bien finir dans notre <em>classpath</em> une fois stabilisé, compatible avec les IDEs du marché et <em>production-ready</em>.</p><p>En attendant, vous pouvez jouer avec en le récupérant à cette <a
href="http://projectlombok.org/" title="url" >url</a>. Et n&#8217;oubliez pas d&#8217;exécuter le JAR afin de patcher votre eclipse.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/27/devoxx-jour-5-projet-lombok/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Jour 3 &#8211; JEE6</title><link>http://blog.xebia.fr/2009/11/25/devoxx-jour-3-jee6/</link> <comments>http://blog.xebia.fr/2009/11/25/devoxx-jour-3-jee6/#comments</comments> <pubDate>Wed, 25 Nov 2009 07:46:47 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[JEE 6]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3338</guid> <description><![CDATA[Comme énoncé dans notre résumé de la keynote du mercredi, la star de ce Devoxx 2009 est clairement JEE6. Et, au premier rang avec mon superbe t-shirt &#171;&#160;I Love Spring&#160;&#187;, j&#8217;ai pu profiter d&#8217;une présentation générale de cette nouvelle version de JEE par Antonio Goncalves et la petite caricature de Rod Johnson . &#160; Introduction [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/jee6-speaker.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jee6-speaker-150x150.jpg" border="0" alt="" style="margin: 0em 5em 1em 5em; float: right;" /></a></p><p>Comme énoncé dans notre résumé de la <a
href="http://blog.xebia.fr/2009/11/24/devoxx-jour-3-la-keynote/" title="keynote du mercredi" >keynote du mercredi</a>, la <em>star</em> de ce Devoxx 2009  est clairement JEE6. Et, au premier rang avec mon superbe t-shirt <em>&laquo;&nbsp;I Love Spring&nbsp;&raquo;</em>, j&#8217;ai pu profiter d&#8217;une <a
href="http://www.devoxx.com/display/DV09/The+Java+EE+6++Platform" title="présentation générale de cette nouvelle version de JEE" >présentation générale de cette nouvelle version de JEE</a> par <a
href="http://www.devoxx.com/display/DV09/Antonio+Goncalves" title="Antonio Goncalves" >Antonio Goncalves</a> et la petite caricature de Rod Johnson <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p><p>&nbsp;</p><h3><a
name="Introduction"></a>Introduction</h3><p>Tout d&#8217;abord quelques chiffres autour de JEE6 :</p><ul><li>une sortie prévue le 10 décembre 2009</li><li>11 ans de JEE (JPE / J2EE / JEE)</li><li>le plus grand intervalle entre 2 versions (3 ans et demi avec JEE5)</li><li>28 spécifications</li></ul><p>Un récapitulatif nous montre les différentes spécifications utilisées (ainsi que quelques technos Java SE 6) avec en jaune les nouvelles spécifications et en noir les montées de version majeures :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/jee6_summary.jpg" border="0" alt="" /></div><p>Il y en a pour tous les goûts : de l&#8217;injection, du back-end et du web et cela a de quoi séduire.</p><p>Certaines spécifications sont marquées comme <em>pruned</em> par JEE6 et pourraient éventuellement disparaître dans JEE7. Nous parlons ici des Entity CMP 2.x, de JAX-RPC, JAX-R et de JSR-88 (Java EE Application Deployment).</p><p>Antonio nous fait ensuite un rapide tour d&#8217;horizon des spécifications marquantes de ce JEE6.</p><h3><a
name="WebProfile"></a>Web Profile</h3><p>Web Profile est un sous-ensemble de la plateforme JEE orienté Web. On compte parmi les spécifications retenues JSF, Servlet, JSP, JPA, JTA, JCDI, @Inject ou bien encore EJB Lite. La liste complète en image :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/web_profile.jpg" border="0" alt="" /></div><h3><a
name="EJBLite"></a>EJB Lite</h3><p>De même que pour Web Profile, EJB Lite est un sous-ensemble d&#8217;EJB 3.1, le tout packagé dans un fichier War. Retenues dans EJB Lite :</p><ul><li>Local Session Bean</li><li>Injection</li><li>CMT / BMT</li><li>Interceptors</li><li>Security</li></ul><p><em>Out</em> donc les Messages Driven Beans, les Remote Interfaces ou bien encore les Timer Services.</p><h3><a
name="ManagedBeans"></a>Managed Beans</h3><p>Les Managed Beans sont de simples POJOs gérés par le container <em>(lightweight model)</em>. Ces beans supportent un ensemble de services basiques <em>(par annotations)</em> dont :</p><ul><li>Injection (<code>@Resource</code> &#8230;)</li><li>Life-Cycle (<code>@PostConstruct</code>, <code>@PreDestroy</code>)</li><li>Interceptor (<code>@Interceptor</code>, <code>@AroundInvoke</code>)</li></ul><pre class="brush: java; title: ; notranslate">
@javax.annotation.ManagedBean
public class MyPojo {
   @Resource
   private DataSource dataSource ;
   @PostConstruct
   private void init() {
      // ...
   }
   @Interceptor(LoggingInterceptor.class)
   public void perform() {
       // ...
   }
}
</pre><h3><a
name="BeanValidation"></a>Bean Validation</h3><p>Antonio nous parle ensuite de Bean Validation, spécification qui va nous permettre de définir des contraintes directement sur nos POJOs par annotations. L&#8217;accroche : <em>constrain once, validate anywhere</em> ! Nous pouvons donc ajouter des validations de type <code>@NotNull</code>, <code>@Size</code> ou autres sur nos propriétés de bean. Il est aussi possible de définir nos propres validateurs.</p><p>Cette spécification définit ainsi un standard de validation pour Java, Bean Validation étant déjà supportée par JPA 2.0 et JSF 2.0. On a ainsi une validation qui part de la base de données et va jusqu&#8217;à la couche cliente.</p><h3><a
name="JAXRS"></a>JAX-RS</h3><p>Un peu de RESTful dans JEE avec JAX-RS qui passe au passage en version 1.1 pour supporter les EJBs. L&#8217;API reste bien sûr orientée POJO et annotations. Voici un exemple d&#8217;intégration de JAX-RS avec un EJB :</p><pre class="brush: java; title: ; notranslate">
@Path(&quot;/users/{userId}&quot;)
@Stateless
public class UserResource {
   @GET @Produces(&quot;image/jpeg&quot;)
   public byte[] getPhoto() {
      // ...
   }
   @GET @Produces(&quot;text/xml&quot;)
   public String getUser(@PathParam(&quot;userId&quot;) String id) {
      // ...
   }
}
</pre><h3><a
name="InjectetCDIContextandDependenc"></a>@Inject et CDI (Context and Dependency Injection)</h3><p>Nous vous avons déjà beaucoup parlé de ces JSRs (<a
href="http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/" title="ici" >ici</a>, <a
href=" http://blog.xebia.fr/2009/01/26/revue-de-presse-xebia-93/#JSRexWebBeansUneJSRDependencyI" title="ici" >ici</a>, <a
href="http://blog.xebia.fr/2009/08/10/revue-de-presse-xebia-121/#FinofficielledelaguerredesJSRd" title="ici" >ici</a> mais aussi <a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#Inject" title="l" >là</a> et encore <a
href="http://blog.xebia.fr/2009/10/05/revue-de-presse-xebia-128/#WebBeansestmortLonguevieaWeld" title="l" >là</a>).<br
/> <code>@Inject</code>, <code>@Named</code>, <code>@Qualifier</code>, <code>@Scope</code> ou bien encore <code>@Singleton</code>, voici les annotations de JSR-330 que nous allons pouvoir utiliser.<br
/> Quant à CDI (JSR-299), qui utilise @Inject, elle nous propose un set de services utilisables par nos composants EE (servlets, beans&#8230;). Elle nous permet aussi d&#8217;utiliser nos EJBs directement dans JSF en tant que <em>backing beans</em>.<br
/> Évidemment, le contenu de ces spécifications est beaucoup plus large et nous n&#8217;avons ici qu&#8217;un rapide résumé.</p><h3><a
name="Maisaussi"></a>Mais aussi&#8230;</h3><p>Parmi les autres nouveautés, on peut citer en vrac :</p><ul><li>Appels asynchrones avec <code>@Asynchronous</code> avec un retour <code>void</code> ou <code>Future&lt;T&gt;</code> ;</li><li>Annotation <code>@Singleton</code> ;</li><li>Annotation <code>@Cacheable</code> avec toute l&#8217;API de cache <em>(contain, evict ou evictAll)</em> qui permet le support d&#8217;un cache de second niveau ;</li><li><em>Embeddable Container</em>, API qui permet d&#8217;initialiser le container, de récupérer les contextes&#8230; faisant qu&#8217;il est possible de le faire tourner dans un environnement Java SE (par exemple une application Swing), ce ne sera qu&#8217;un JAR dans votre classpath ;</li><li><em>Timer Service</em> pour gérer la planification de tâche avec l&#8217;annotation <code>@Schedule</code> ;</li><li>Fichier <code>web.xml</code> optionnel grâce entre autres aux annotations <code>@WebServlet</code>, <code>@WebFilter</code>,<code>@WebListener</code> ou bien encore <code>@WebInitParam</code> ;</li></ul><h3><a
name="Conclusion"></a>Conclusion</h3><p>L&#8217;opération séduction fonctionne plutôt bien pour JEE6 si l&#8217;on écoute les différents commentaires des conférenciers en sortie de session. La simplicité et facilité d&#8217;utilisation des EJBs, le profile web ou encore les injections ont vraiment convaincus et nombreux sont ceux qui attendent désormais avec impatience ce 10 décembre 2009. En effet, il n&#8217;y a plus qu&#8217;à tester et à voir si JEE6 tient vraiment toutes ses promesses&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/25/devoxx-jour-3-jee6/feed/</wfw:commentRss> <slash:comments>15</slash:comments> </item> <item><title>Devoxx &#8211; Jour 3 &#8211; ScalaTest</title><link>http://blog.xebia.fr/2009/11/24/devoxx-jour-3-scalatest/</link> <comments>http://blog.xebia.fr/2009/11/24/devoxx-jour-3-scalatest/#comments</comments> <pubDate>Tue, 24 Nov 2009 12:15:43 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[ScalaTest]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3314</guid> <description><![CDATA[Deuxième partie de nos billets Devoxx consacrés à Scala. Après les acteurs, c&#8217;est au tour de la librairie ScalaTest de faire son show. Au cours de cette présentation, nous verrons les fonctionnalités de cette librairie, son intégration avec les outils actuels du marché (comme JUnit ou TestNG) mais aussi l&#8217;intérieur de la bête. Cela nous [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/scalatest_speaker.jpg" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Deuxième partie de nos billets Devoxx consacrés à <a
href="http://www.scala-lang.org/" title="Scala" >Scala</a>. Après les <a
href="http://blog.xebia.fr/2009/11/23/devoxx-jour-2-scala-actors/" title="acteurs" >acteurs</a>, c&#8217;est au tour de  la librairie <a
href="http://www.scalatest.org/ " title="ScalaTest" >ScalaTest</a> de faire son <a
href="http://www.devoxx.com/display/DV09/Get+Higher+with+ScalaTest" title="show" >show</a>.</p><p>Au cours de cette présentation, nous verrons les fonctionnalités de cette librairie, son intégration avec les outils actuels du marché <em>(comme JUnit ou TestNG)</em> mais aussi <em>l&#8217;intérieur de la bête</em>. Cela nous permettra de mettre les mains dans ScalaTest ! Le mot d&#8217;ordre de la session : productivité !</p><p>&nbsp;<br
/> <br
/>&nbsp;<br
/> <br
/>&nbsp;</p><h3><a
name="Prsentation"></a>Présentation</h3><p>ScalaTest est un framework open-source de tests unitaires pour la plateforme Java. Il est possible de tester à la fois des classes Java mais aussi des classes Scala. L&#8217;objectif est d&#8217;augmenter la productivité du développeur qui écrira moins de lignes de test; Ces lignes étant plus claires que si elles avaient été écrites en Java. Moins de lignes, plus claires que du Java ? Je veux des exemples&#8230;</p><p>Le Trait principal de l&#8217;API est <code>Suite</code> qui fournit une multitude de méthodes tests et utilitaires comme <code>run</code>, <code>runNestedSuites</code> ou bien encore <code>withFixtures</code> <em>(les détails des méthodes et de ce qu&#8217;elles font se trouvent sur la <a
href="http://www.scalatest.org/scaladoc/doc-1.0/" title="scaladoc du projet" >scaladoc du projet</a>)</em>. De là découlent des classes concrètes comme <code>JUnitSuite</code>, <code>JUnit3Suite</code>, <code>JUnitWrapperSuite</code>, <code>TestNGSuite</code> ou <code>TestNGWrapperSuite</code>. Plusieurs <code>Matchers</code> nous permettrons d&#8217;écrire nos tests avec des facilités d&#8217;écriture (DSLs). On retiendra <code>AssertionsForJUnit</code>, <code>ShouldMatchersForJUnit</code> <em>(qui donne vraiment l&#8217;impression que l&#8217;on écrit notre test comme on écrirait des phrases en anglais)</em> mais aussi <code>MustMatchersForJUnit</code>.</p><h3><a
name="Petitecomparaison"></a>Petite comparaison</h3><p>Le premier exemple nous montre les nuances entre différentes APIs de tests unitaires dont JUnit 3 et JUnit 4 et avec ScalaTest :</p><pre class="brush: java; title: ; notranslate">
String s = &quot;hi&quot; ;
// JUnit 3
try {
   s.charAt(-1);
   fail();
} catch (StringIndexOutOfBoundException e) {
   // Expected, so continue
}
// JUnit 4
@Test(expected= StringIndexOutOfBoundException.class)
public void testPassingANegativeToCharAt() {
   s.charAt(-1);
}
// ScalaTest
intercept[StringIndexOutOfBoundException] {
   s.charAt(-1)
}</pre><p>Les non-habitués auront l&#8217;impression de manipuler une syntaxe du langage comme le <code>synchronized</code> Java (qui a la même écriture), alors qu&#8217;en fait il ne s&#8217;agit que d&#8217;un appel à une méthode qui prend en entrée une fonction à exécuter. La méthode <code>intercept</code> exécute tout de suite la fonction en paramètre et <code>catch</code> une éventuelle exception. Celle-ci sera comparée au type d&#8217;exception attendu (ici <code>StringIndexOutOfBoundException</code>). Le plus gros du travail aura été de récupérer le type de <code>(T<:Any)</code> de <code>intercept</code> afin de comparer la classe de l'exception levée à celle attendue (<code>T</code>). Pour cela, les développeurs ont utilisé la classe Scala <code><a
href="http://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_7_3_final/src/library/scala/reflect/Manifest.scala?view=markup" title="scalareflectManifest" >scala.reflect.Manifest</a></code> qui permet d'accéder à l'<em>erasure</em> du type <code>T</code>.</p><p>Le ton est donné, nous sommes dans cette salle pour apprendre à utiliser la librairie mais aussi pour mettre les mains dans ScalaTest et voir l'implémentation de quelques fonctionnalités de l'outil <em>(intercept, mock...)</em>. En gros, des conférenciers les yeux rivés sur les slides et heureux d'être là !</p><h3><a
name="Lesmocks"></a>Les mocks</h3><p>Dans ScalaTest, les mocks ne sont pas en reste. Pour les utilisateurs d'<a
href="http://easymock.org/" title="EasyMock" >EasyMock</a>, ScalaTest propose une autre manière d'écrire ces mocks avec un <em>wrapping</em> des appels à <code>replay</code> et <code>verify</code>. Encore une fois, cela passe par une méthode qui prendra en entrée une fonction et fera l'appel à <code>replay</code> ou <code>verify</code> à la fin de l'exécution de la fonction :</p><pre class="brush: java; title: ; notranslate">
// Wrap replay
expecting {
   mockCollaborator.documentAdded(&quot;document&quot;)
}
// Wrap verify
whenExecuting(mockCollaborator) {
   classUnderTest.addDocument(&quot;document&quot;, new Array[Byte](0))
}
</pre><h3><a
name="Youshoulddothat"></a>You should do that !</h3><p>Bill enchaîne ensuite avec le matcher <em>should</em> et l'exemple nous montrant que ce n'est pas de la magie mais juste une bonne utilisation des sucres syntaxiques de Scala :</p><pre class="brush: java; title: ; notranslate">
map should contain key 'a'
// Equivalent to
map.should(contain).key('a')
</pre><p>Ainsi, en écrivant l'API d'une certaine manière, on obtient des méthodes qui peuvent être appelées sans <em>point</em> ni <em>parenthèses</em>. D'autres exemples nous sont donnés :</p><pre class="brush: java; title: ; notranslate">
&quot;A Stack (when empty)&quot; should &quot;be empty&quot; in {
   emptyStack should not be &quot;empty&quot; // This should fail
}
it should &quot;complain on peek&quot; in {
   evaluating( emptyStack.peek ) should produce [IllegalStateException]
}
ignore should &quot;complain on pop&quot; in {
   evaluating( emptyStack.pop ) should produce [IllegalStateException]
}
myInt should be &gt; 0
myOtherInt should be === 0
</pre><h3><a
name="GivenWithThen"></a>GivenWithThen</h3><p>Dernière subtilité concernant ScalaTest avec le Trait <code>GivenWithThen</code>. Celui-ci permet de documenter les tests mais, à la différence d'un commentaire dans le code, ceux-ci apparaîtront dans le rapport d'exécution. Exemple avec le résultat à l'exécution en image <em>live</em> <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> :</p><pre class="brush: java; title: ; notranslate">
when(&quot;pop is invoked on the stack&quot;)
var result = stack.pop()
then(&quot;the most recently pushed element should be returned&quot;)
assert(result === 2)
and(&quot;the stack should have one less item than before&quot;)
assert(stack.getSize === oldSize - 1)
</pre><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/rapport.jpg" border="0" alt="" /></div><h3><a
name="Conclusion"></a>Conclusion</h3><p>Avec cette version 1.0, nous retiendrons :</p><ul><li>Une meilleure intégration avec <code>JUnit</code>,</li><li>Une meilleure intégration avec <code>JMock</code>, <code>EasyMock</code> et <code>Mockito</code>,</li><li>Le trait <code>GivenWithThen</code>,</li><li>Plusieurs nouvelles <code>FixtureSuite</code> qui facilitent la programmation fonctionnelle et l'injection de <em>fixtures</em> directement dans les tests.</li></ul><p>ScalaTest 1.0 se télécharge sur cette <a
href="http://www.scalatest.org/download" title="page" >page</a>, soit directement le  fichier ZIP soit la dépendance Maven.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/24/devoxx-jour-3-scalatest/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Jour 2 &#8211; Scala Actors</title><link>http://blog.xebia.fr/2009/11/23/devoxx-jour-2-scala-actors/</link> <comments>http://blog.xebia.fr/2009/11/23/devoxx-jour-2-scala-actors/#comments</comments> <pubDate>Mon, 23 Nov 2009 14:38:47 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[scala]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3277</guid> <description><![CDATA[Le langage Scala était très représenté cette année à Devoxx avec une session sur les acteurs par Franck Sommers, une autre sur ScalaTest par Bill Venners ou encore celle sur le framework web Lift par Timothy Perrett. Cette dernière n&#8217;a malheureusement pas tenu toutes ses promesses : la moitié de la présentation s&#8217;est focalisée sur [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/actor_speaker.jpg" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;"/></p><p>Le langage Scala était très représenté cette année à Devoxx avec une session sur les <a
href="http://www.devoxx.com/display/DV09/Scala+Actors" title="acteurs par Franck Sommers" >acteurs par Franck Sommers</a>, une autre sur <a
href=" http://www.devoxx.com/display/DV09/Get+Higher+with+ScalaTest" title="ScalaTest par Bill Venners" >ScalaTest par Bill Venners</a> ou encore celle sur le framework web <a
href="http://www.devoxx.com/display/DV09/The+Lift+(Scala)+Web+Framework" title="Lift par Timothy Perrett" >Lift par Timothy Perrett</a>. Cette dernière n&#8217;a malheureusement pas tenu toutes ses promesses : la moitié de la présentation s&#8217;est focalisée sur les spécificités du langage et une autre partie sur la <em>déjà vue</em> application <a
href="http://www.channels.com/episodes/show/3966032/Lift-Simple-Comet-Screencast" title="ChatDemo en comet" >ChatDemo en comet</a> de David Pollack sans réelle explication de code, ne laissant ainsi que très peu de place pour Lift lui même.</p><p>Nous consacrerons donc un retour à Scala en deux parties : la première sur les acteurs (présent billet) et la seconde sur ScalaTest.</p><p>&nbsp;<br
/> <br
/>&nbsp;<br
/> <br
/>&nbsp;<br
/> <br
/>&nbsp;</p><p>La présentation démarre tambour battant avec un schéma sur <em>The evil of global state</em> et, dans le cas du partage de variables entre plusieurs threads, l&#8217;incontournable :</p><pre class="brush: java; title: ; notranslate">
int currentSpeed  = 0;
synchronized (currentSpeed) {...}
</pre><p>Tous les threads peuvent accéder à cette variable, il faut donc la synchroniser.</p><p>Le passage de messages est tout de suite introduit avec le même exemple : une vitesse et 2 threads/acteurs qui souhaitent accéder à cette variable. Mais cette fois-ci, pas de variable synchronisée mais un acteur <em>SpeedSensor</em> qui porte la valeur, un acteur <em>CruiseControl</em> qui récupère le message et exécute les actions adéquates, en l&#8217;occurrence appeler un autre acteur qui fera un ajustement de la vitesse. On se retrouve avec un exemple où tous les threads partagent la même donnée <em>currentSpeed</em> mais grâce à la programmation par message, il n&#8217;y a plus besoin synchroniser cette variable.</p><p>Les idées véhiculées par les acteurs peuvent alors se résumer par :</p><ul><li>Favoriser l&#8217;immutabilité des messages.</li><li>Gérer une pile de messages <em>(Mailbox)</em>.</li><li>Gérer différentes actions selon le message entrant.</li></ul><p>Tous ces points énumérés nous font rapidement <em>tilt</em> dans la tête et l&#8217;on pense évidemment au langage Scala qui porte tout à fait ces valeurs. Pour rappel, Scala est un langage qui :</p><ul><li>Favorise l&#8217;immutabilité des objets.</li><li>Est orienté objet + orienté fonction.</li><li>Promeut le pattern matching (un <em>switch sous stéroïdes</em> selon le speaker <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> qui permet différentes actions selon le type de pattern correspondant).</li><li>Permet le DSL (écriture plus lisible d&#8217;API).</li><li>Tourne sur une JVM donc intégralement compatible Java.</li></ul><p>Il ne faut pas oublier qu&#8217;en outre les acteurs ne sont pas intégrés au langage Scala, ce n&#8217;est qu&#8217;une API qui est fournie avec Scala. L&#8217;écriture des appels fait croire à de la syntaxe propre au langage mais ce n&#8217;est qu&#8217;un DSL qui invoque de simples méthodes. ScalaTest vous montrera (d&#8217;ici quelques jours) la puissance de ces DSLs et de ce qu&#8217;il est possible de faire avec. D&#8217;ailleurs, si l&#8217;implémentation des acteurs ne vous plaît pas, vous pouvez tout à fait les refaire à votre façon (et à vos risques et périls <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p><p>La déclaration d&#8217;un acteur en Scala se fait en étendant le trait <code>Actor</code> et en redéfinissant la méthode <code>def act()</code> . La définition des messages peut se faire par <code>case class</code> ce qui permet de voir rapidement tous les types de messages disponibles pour nos acteurs et ainsi effectuer un pattern matching lisible :</p><pre class="brush: java; title: ; notranslate">
case class Subscribe(user : User)
case class Unsubscribe(user: User)
...
msg match {
   case Subscribe(user) =&gt; println(user + &quot;subscribed&quot;)
   case Unsubscribe(user) =&gt; println(user + &quot;unsubscribed&quot;)
}
</pre><p>L&#8217;envoi de message se fait de différentes manières :</p><ul><li>Asynchrone : <code>chatRoom ! Subscribe(User("Foo"))</code>, non bloquant, retour immédiat.</li><li>Synchrone : <code>var result = chatRoom !? Subscribe(User("Bar"))</code>, bloquant, en attente du retour de la méthode.</li><li>Future : <code>var future = chatRoom !! Subscribe(User("Baz"))</code>, non bloquant, en attente du retour de la méthode.</li></ul><p>Vient ensuite la partie <em>haute performance</em> des acteurs. Franck nous présente ainsi les <em>Remote actors</em> ou acteurs distribués. Ces acteurs ont la particularité de dialoguer entre eux même s&#8217;ils sont sur différentes machines physiques. La création d&#8217;un acteur <em>remote</em> se fait grâce à l&#8217;appel à <code>alive</code> (qui crée une socket et la <em>bind</em> sur le port spécifié) et à <code>register</code> :</p><pre class="brush: java; title: ; notranslate">
alive(9090)
register('chatRoom', self)
</pre><p>L&#8217;envoi de message se fait en récupérant un proxy sur le nœud courant, l&#8217;appel à <code>select</code> permettra de récupérer l&#8217;acteur dont l&#8217;alias a été enregistré par le <code>register</code> (voir ci-dessus). L&#8217;acteur <em>remote</em> aura la bonne référence au niveau du <em>sender</em> (référence à celui qui a envoyé le message) :</p><pre class="brush: java; title: ; notranslate">
val remoteActor = select(Node(&lt;address&gt;, 9090), 'chatRoom')
remote ! Post(&quot;Foo=Bar&quot;)
</pre><p>La partie scalabilité approche à grand pas et le speaker évoque à présent les deux manières de démarrer nos acteurs :</p><ul><li>Soit un thread par acteur : grosse consommation mémoire et très vite limité par la JVM (plusieurs milliers).</li><li>soit <em>event-driven</em> : découplage des acteurs et des threads jvm, exécuté sur un thread pool, attente du message sans consommer de thread ! On parle ici en millions d&#8217;acteurs !</li></ul><p>Vous trouverez un exemple d&#8217;<em>actors in action</em> fourni par le speaker à cette <a
href="http://www.artima.com/downloads/actors.zip" title="url" >url</a> ainsi qu&#8217;un très bon article sur les <a
href="http://youshottheinvisibleswordsman.co.uk/2009/04/01/remoteactor-in-scala/" title="acteurs remote" >acteurs remote</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/23/devoxx-jour-2-scala-actors/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Jour 2 &#8211; Hibernate Search</title><link>http://blog.xebia.fr/2009/11/23/devoxx-jour-2-hibernate-search/</link> <comments>http://blog.xebia.fr/2009/11/23/devoxx-jour-2-hibernate-search/#comments</comments> <pubDate>Mon, 23 Nov 2009 10:03:39 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[Hibernate Search]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3248</guid> <description><![CDATA[Pour le deuxième jour d&#8217;université, Emmanuel Bernard nous propose une présentation d&#8217;Hibernate Search avec une approche globale du produit : qu&#8217;est-ce qu&#8217;une recherche Full Text, le fonctionnement d&#8217;une recherche, les annotations sur nos objets métiers et les différentes recherches possible. L&#8217;application JBoss DVD Store utilisée tout au long de la session permettra de mettre en [...]]]></description> <content:encoded><![CDATA[<p>Pour le deuxième jour d&#8217;université, Emmanuel Bernard nous propose une <a
href="http://www.devoxx.com/display/DV09/Hibernate+Search+university" title="prsentation dHibernate Search" >présentation d&#8217;Hibernate Search</a> avec une approche globale du produit : qu&#8217;est-ce qu&#8217;une recherche <em>Full Text</em>, le fonctionnement d&#8217;une recherche, les annotations sur nos objets métiers et les différentes recherches possible. L&#8217;application <em>JBoss DVD Store</em> utilisée tout au long de la session permettra de mettre en avant la recherche <em>Full Text</em> et les différentes requêtes possibles (<em>batmen</em> au lieu de <em>batman</em>).</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/hs_speaker.jpg" border="0" alt="" /></div><p>Nous avons déjà publié plusieurs articles sur Hibernate Search : de l&#8217;<a
href="http://blog.xebia.fr/2008/03/06/introduction-a-hibernate-search-googling-your-persistent-domain-model/" title="introduction" >introduction</a> qui se focalisera sur l&#8217;architecture de l&#8217;outil au <a
href="http://blog.xebia.fr/2008/03/28/hands-on-hibernate-search-recherche-full-text/" title="Hands On" >Hands On</a> qui vous permettra de mettre les mains dedans. Les différentes recherches <em>Full Text</em> disponibles (appoximation, phonétique&#8230;) ont aussi été résumées dans le compte-rendu de la <a
href="http://blog.xebia.fr/2009/06/28/jazoon-jour-3-hibernate-search/" title="prsentation de loutil  Jazoon" >présentation de l&#8217;outil à Jazoon</a>.</p><p>Le speaker insistera surtout sur la <em>convention over configuration</em> une approche programmatique du produit. Après l&#8217;énumération des annotations possibles (<code>@Indexed</code>, <code>@Field</code>, <code>@FieldBridge</code>, <code>@IndexedEmbededd</code>, <code>@Boost</code> et <code>@Analyzer</code>), les premières questions sur la configuration par XML tombent et la réponse est assez direct : <em>Because we hate XML</em> <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Il enchaîne ensuite avec quelques slides d&#8217;architecture. On retiendra ainsi que Hibernate Search est construit sur Hibernate Core, que le produit est <em>Event Based</em> et que l&#8217;indexation manuelle massive est optimisée. Un slide nous montrera les différentes étapes d&#8217;une recherche avec Hibernate Search, tout d&#8217;abord un appel à <a
href="http://lucene.apache.org/java/docs/" title="Lucne" >Lucène</a> pour récupérer nos documents et, si besoin, un appel au cache ou à la base de données pour récupérer les entités souhaitées.</p><p>Emmanuel terminera avec une Road Map plutôt chargée dont :</p><ul><li>Amélioration des performances de l&#8217;API programmatique.</li><li>Indexation massive multi-threadée.</li><li>Clustering (travail en collaboration avec Infinispan).</li><li>Meilleure intégration avec <a
href="http://lucene.apache.org/solr/" title="Solr" >Solr</a>.</li><li>Amélioration des <code>Query</code> (construction simplifiée&#8230;).</li><li>Statistiques.</li></ul><p>Pas de date de sortie prévue pour cette nouvelle version mais il est toujours possible de jouer avec <a
href="https://www.hibernate.org/410.html" title="Hibernate Search 311 GA" >Hibernate Search 3.1.1 GA</a> (version actuelle du produit qui date de 6 mois) et de mettre en œuvre quelques recherches <em>Full Text</em> !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/23/devoxx-jour-2-hibernate-search/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Jour 2 &#8211; Google App Engine</title><link>http://blog.xebia.fr/2009/11/19/devoxx-jour-2-google-app-engine/</link> <comments>http://blog.xebia.fr/2009/11/19/devoxx-jour-2-google-app-engine/#comments</comments> <pubDate>Thu, 19 Nov 2009 08:58:30 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[GAE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3213</guid> <description><![CDATA[Toujours sur le sulfureux sujet du Cloud Computing mais cette fois-ci côté PaaS (Platform as a Service), une session spéciale Google App Engine nous est proposée avec l&#8217;idée de développer une vraie application de gestion sur le cloud et de voir les difficultés rencontrées pendant le développement. Et pour corser le tout, 3 technos front-end [...]]]></description> <content:encoded><![CDATA[<p>Toujours sur le sulfureux sujet du <em>Cloud Computing</em> mais cette fois-ci côté PaaS (Platform as a Service), une session spéciale <a
href="http://www.devoxx.com/display/DV09/Google+App+Engine+for+Java+-+a+real+live+voyage+to+The+Cloud" title="Google App Engine" >Google App Engine</a> nous est proposée avec l&#8217;idée de développer une <em>vraie</em> application de gestion sur le cloud et de voir les difficultés rencontrées pendant le développement. Et pour corser le tout, 3 technos front-end seront en concurrence : Spring MVC, JSF 2.0 (très <em>early adopter</em> pour le coup) et GWT 1.7.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/gae_speakers.jpg" border="0" alt="" /></div><h3><a
name="Leprojet"></a>Le projet</h3><p>Tout d&#8217;abord, la home page du projet <em>Swag Swap</em> se trouve à cette <a
href="http://swagswap.appspot.com" title="url" >url</a>. Elle regroupe toutes les informations utiles, les liens vers les différents projets par technos, un espace google-moderator pour poser des questions aux speakers (et réponses en live).</p><p>Fonctionnellement, le projet est un espace de vente d&#8217;objets divers et variés avec notation de ces objets, commentaires associés, etc. Côté administration, on pourra gérer les objets <em>(ajouter, modifier ou supprimer)</em> et avoir accès à d&#8217;autres fonctionnalités. On illustre ainsi GAE par un projet plus concret que le basique <em>Helloworld</em>. A gauche l&#8217;apparence de l&#8217;application GWT (single page interface) et à droite celle des applications Spring MVC et JSF 2.0 :</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/gae_swagswap.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/gae_swagswap-300x112.jpg" alt="gae_swagswap" title="gae_swagswap" width="300" height="112" class="alignnone size-medium wp-image-3215" /></a></div><h3><a
name="Fondamentaux"></a>Fondamentaux</h3><p>Avant de rentrer dans le vif du sujet, quelques rappels sur l&#8217;architecture de GAE nous sont faits. Ainsi, GAE est de type PaaS : aucune installation hardware ni d&#8217;infrastructure mainframe, tout est géré par Google qui hébergera notre application sur ses serveurs et la dimensionnera à l&#8217;infini si besoin (attention aux quotas <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). La base de données utilisée est BigTable, base de données non relationnelle distribuée, scalable, transactionnelle et schema-less ; le tout accessible par les APIs JDO et JPA.</p><p>Les détails techniques sont tout de suite évoqués avec entre autres :</p><ul><li>des requêtes limitées à 30 secondes,</li><li>pas de serveur push,</li><li>pas de threads,</li><li>un système de fichiers en lecture seule,</li><li>des <em>whitelisted</em> classes (plusieurs classes du JDK non disponibles sous GAE),</li><li>impossibilité de créer/mettre à jour plus d&#8217;une entité au sein d&#8217;une transaction.</li></ul><p>Ces quelques lignes peuvent évidemment faire reculer violemment un développeur Java et c&#8217;est bien là l&#8217;idée de cette conférence : n&#8217;ayez pas peur ! La preuve : leurs applications fonctionnant sous GAE et sous 3 frameworks web différents ! Quelques adaptations sont néanmoins nécessaires.</p><p>Pour ceux qui souhaitent approfondir la persistance dans GAE,je vous renvois vers un <a
href="http://blog.xebia.fr/2009/07/16/la-persistance-dans-google-app-engine-partie-une-le-datastore/" title="prcdent article" >précédent article</a> qui traite parfaitement le sujet.</p><h3><a
name="Implmentations"></a>Implémentations</h3><p>Côté architecture, on retrouve globalement ce que l&#8217;on connait déjà dans notre écosystème JEE à savoir :</p><ul><li>Spring 3.0,</li><li>JDO,</li><li>Une couche service partagée par toutes les applications,</li><li>RESTful,</li><li>Spring MVC / JSF 2.0 / GWT 1.7,</li><li>Build, tests et déploiement avec Ant,</li><li>Pour le debug, l&#8217;appengine development server pour SMVC et JSF et le Hosted Mode pour GWT,</li><li>Gestion des projets avec google-code (issues, version control, release management).</li></ul><p>Nous sommes donc en face d&#8217;une application 3-tiers standard. Les POJOs sont de simples POJO Spring. La couche DAO utilise un <code>JdoTransactionManager</code> mappé avec un <code>PersistentManagerFactory</code> connecté sur le datastore d&#8217;appengine (<code>org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory</code>).</p><p>La première chose qui saute aux yeux est bien sûr l&#8217;utilisation de JDO. Pourquoi ce choix (question du modérateur) ? Parce que la majorité des tutoriels s&#8217;appuie sur JDO. Il est tout à fait possible d&#8217;en trouver avec JPA mais ils sont globalement moins nombreux. D&#8217;où le choix de JDO. Avec toutes ces présentations Devoxx autour de JPA 2, cela surprend&#8230;</p><p>Nous nous retrouvons ensuite rapidement dans Eclipse avec de nombreux exemples de codes, d&#8217;injections, de configuration&#8230; La conférence prend rapidement un air de présentation de Spring MVC avec la configuration par annotations et entre autres les URI Templates de RESTful Spring MVC 3. Pour les habitués de <a
href="https://jersey.dev.java.net/" title="Jersey" >Jersey</a>, l&#8217;idée est la même (paramètres dans le path de l&#8217;URL) mais le nom des annotations change un peu. Voici un exemple d&#8217;utilisation :</p><pre class="brush: java; title: ; notranslate">
@RequestMapping(value=&quot;/edit/{id}&quot;, method=RequestMethod.GET)
public String editHandler(@PathVariable(&quot;key&quot;) Long key, Model model) {
  SwagItem swagItem = itemService.get(key, true);
}
</pre><p>Suivront ensuite quelques screenshots de l&#8217;utilisation de MemCache et d&#8217;envoi de mails avec Task Queue, la gestion de transactions, la gestion d&#8217;Entity Groups&#8230; Le tout est bien sûr testé unitairement. Nous passerons sur ces points, de nombreuses documentations existent un peu partout sur la toile.</p><p>Le tour complet est fait, mais maintenant on veut savoir&#8230;</p><h3><a
name="Problmesrencontrs"></a>Problèmes rencontrés</h3><p><em>Bon alors, quels sont les problèmes que vous avez rencontrés ?</em></p><p>Et bien il y en aura eu, du simple à résoudre au plus complexe qui demande de bien écrire ses APIs ou de paramétrer légèrement sa configuration.</p><p>Côté back-end, la mise à jour d&#8217;une seule entité au sein d&#8217;une transaction peut évidemment poser de gros problèmes concernant l&#8217;insertion de nombreuses entités mais aussi concernant un rollback de transaction. Pas de réelle solution, à part programmer à la main un rollback sur des objets déjà commités.<br
/> Concernant l&#8217;impossibilité d&#8217;écrire sur le disque, la base de données contient un champs BLOB qui contiendra les images des articles à vendre.</p><p>Spring MVC a posé des soucis concernant quelques requêtes Ajax et surtout celles de <em>rating</em> qui requièrent un utilisateur logué. Dans ce cas, la page de connexion spéciale Google (au passage non configurable) apparaît et, une fois logué, la redirection se fait sans les paramètres d&#8217;URL. On perd donc le fait que l&#8217;on venait de voter pour un article ; nous avons donc cliqué dans le vide juste pour nous connecter.</p><p>Les gros problèmes concernant le frontend se sont plus focalisés sur JSF 2.0 (le pauvre&#8230;) avec quelques hacks autour de la classe <code>WebConfiguration</code>. Un problème s&#8217;est aussi posé concernant le state saving de JSF 2.0 côté serveur. Les scopes doivent être réduits à <code>request</code> et à <code>view</code>, le state doit être sérialisé dans le view scope et (enfin et non des moindre) RichFaces et ICEFaces ne peuvent pas être utilisés (<em>whitelisted</em> classes). Beaucoup de ralentisseurs donc mais qui n&#8217;ont pas empêché l&#8217;application d&#8217;être disponible et fonctionnelle à Devoxx.</p><p>Pour GWT, beaucoup de temps a aussi été investi pour brancher les services remotes sur Spring <em>convenablement</em> (avec P.G Taboada&#8217;s <code>AutoinjectingRemoteServiceServlet</code>). Les problèmes majeurs rencontrés dans le développement de l&#8217;application GWT se situent au niveau de son protocole GWT-RPC et de l&#8217;impossibilité de sérialiser des types <code>Text</code> et <code>Blob</code> de BigTable. Gilead (anciennement <a
href="http://blog.xebia.fr/2008/12/17/integrer-hibernate-avec-gwt-sans-douleur/" title="Hibernate4GWT" >Hibernate4GWT</a>) aurait pu aider dans la gestion de ce mapping mais cela n&#8217;a pas fonctionné. La solution de contournement a donc été de créer des DTOs pour tous les spring beans ! De plus, ces DTOs, spécifiques à l&#8217;application ne sont pas compatible avec les tableaux SmartGWT. Il a donc fallu les copier dans les records SmartGWT&#8230; Tout fonctionne mais avec beaucoup de beans passe-plats, le tout n&#8217;étant pas très automatique.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Au final, l&#8217;application Spring MVC, couche service incluse, n&#8217;aura pris que 3 jours à être codée. Alors que pour JSF 2.0 et GWT 1.7, on est plutôt sur 2 semaines chacun et uniquement pour la partie frontend (couche service partagée). La rapidité d&#8217;écriture est donc clairement à l&#8217;avantage de Spring MVC (pour cette application). JSF 2.0 a été très retardé par ses incompatibilités avec GAE alors que GWT aura péché par sa difficulté d&#8217;intégration avec Spring, les problèmes liés aux échanges RPC et Gilead qui n&#8217;a pas fonctionné.</p><p>Que peut-on réellement en tirer ? Premièrement les 3 frameworks, même si ce fût dur, fonctionnement correctement sur GAE, si on fait abstraction des quelques <em>Errors</em> qui apparaissaient de temps à autre sur le grand écran. On pourra mettre ça sur le dos du wifi de Devoxx qui ne monte pas très bien en charge <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p><p>Parmi les liens utiles, on notera la recherche sur google de &laquo;&nbsp;Will it work on app engine&nbsp;&raquo; qui donne en premier résultat un site listant de manière assez complète les librairies et leur compatibilité sur GAE : <a
href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine">http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine</a> mais aussi le GAE Bar <a
href="http://aralbalkan.com/1784">http://aralbalkan.com/1784</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/19/devoxx-jour-2-google-app-engine/feed/</wfw:commentRss> <slash:comments>9</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>Devoxx &#8211; Jour 1 &#8211; Kanban in action</title><link>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-kanban-in-action/</link> <comments>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-kanban-in-action/#comments</comments> <pubDate>Wed, 18 Nov 2009 07:33:17 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Kanban]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3197</guid> <description><![CDATA[Après un petit café revigorant, voici déjà venir les premières sessions de l&#8217;édition 2009 de Devoxx et, le sujet de cet article, Kanban in action par Olav Maassen. Après un petit rappel sur les origines du mot (qui en kanji signifie kan=visuel et ban=tableau, carte, fiche), le deuxième slide donne le ton de cette conférence [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/speaker.jpg" border="0" alt=""  style="margin: 1em 1em 1em 2em; float: right;" /></p><p>Après un petit café revigorant, voici déjà venir les premières sessions de l&#8217;édition 2009 de <a
href="http://www.devoxx.com/display/DV09/Home" title="Devoxx" >Devoxx</a> et, le sujet de cet article, <a
href="http://www.devoxx.com/display/DV09/Kanban+in+Action" title="Kanban in action" >Kanban in action</a> par <a
href="http://www.devoxx.com/display/DV09/Olav+Maassen" title="Olav Maassen" >Olav Maassen</a>.</p><p>Après un petit rappel sur les origines du mot (qui en kanji signifie <em>kan=visuel</em> et <em>ban=tableau, carte, fiche</em>), le deuxième slide donne le ton de cette conférence qui sera interactive (plusieurs travaux pratiques sur les 3h) avec une première question : <em>donnez quelques exemples quotidiens de système Kanban</em>. Plusieurs réponses affluent dont :</p><ul><li>le parking avec un flux de voitures entrantes bloqué si toutes places du parking sont pleines ;</li><li>la toilette des enfants avec une baignoire qui ne contient qu&#8217;un enfant à la fois (dès qu&#8217;un enfant a terminé, l&#8217;autre prend sa place) ;</li><li>le speaker retiendra Mac Donalds (et oui) avec la gestion du stock de burger disponible : une pancarte métallique qui, une fois déplacée au dessus des rails de burgers vides, signifie qu&#8217;un burger n&#8217;est plus disponible, il faut alors en produire.</li></ul><p>Ces exemples tournent autour de 2 principes : la <em>capacity constraint</em> (par exemple une autoroute, toujours disponible mais dépendante du flux) et la <em>non-instant availability</em> (par exemple un ferry qui une fois en mer n&#8217;est plus disponible). Un des principes du Kanban est de rendre certaines choses <em>visuelles</em> : voir l&#8217;indisponibilité de hamburgers <em>marqués</em> par un token en est un bon exemple.</p><h3><a
name="Lesfreins"></a>Les freins</h3><p>La présentation se focalise ensuite sur les mauvaises pratiques de nos projets d&#8217;entreprise faisant que Kanban sera difficile à mettre en place.</p><p>Les projets avec deadline <em>(surtout quand celle-ci se rapproche)</em> ont fait débat dans la salle. Pour les conférenciers, les mauvais choix qui peuvent être faits par l&#8217;entreprise sont : le report du projet, engager plus de personnes ou faire beaucoup d&#8217;<em>overtime</em> <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Et quel que soit le cas, des choix malheureux risquent d&#8217;être faits : ne plus rédiger les spécifications, réduire voire supprimer les tests unitaires, privilégier la vitesse de production à la qualité du code <em>(tout ceci dans un but de gain de temps)</em> ! Vous l&#8217;aurez compris, et ce n&#8217;est pas forcément spécifique à Kanban, nous sommes ici en présence de mauvaises pratiques reconnues et difficilement récupérables par la suite.</p><p>Pour rester dans les mauvaises pratiques, Olav nous propose un TP, <em>comment construire ou détruire la confiance dans une équipe</em>. Cacher de l&#8217;information, manquer de confiance en l&#8217;équipe, ne pas donner de responsabilité à l&#8217;équipe&#8230; La destruction est assez facile à illustrer, la construction ressortira surtout de l&#8217;implication de l&#8217;équipe dans le projet et les décisions.</p><p>Une petite comparaison orale (pas de trace !) avec Scrum ou Lean nous permet de constater qu&#8217;il n&#8217;y a pas de planning poker ou de session d&#8217;estimation. En effet, cela ne représente pas une valeur fonctionnelle métier pour le client (&lt;troll&gt;c&#8217;est du temps perdu !&lt;/troll&gt;). Au niveau des réunions, et plus particulièrement le stand-up meeting, les 3 questions habituelles de Scrum sont remplacées par un bref regard global sur le tableau afin de voir si <em>tout se passe bien</em>. En général, voir s&#8217;accumuler des post-it dans une colonne n&#8217;est pas bon signe et c&#8217;est ici que l&#8217;équipe intervient et que le stand-up devient plus animé.</p><h3><a
name="Kanbanlarescousse"></a>Kanban à la rescousse !</h3><p>Le décor est planté, la salle a les idées claires sur ce qui va, ne va pas ou peut encore être amélioré sur nos projets, il est grand temps de présenter formellement le sauveur Kanban (avec au passage un <a
href="http://www.infoq.com/articles/hiranabe-lean-agile-kanban" title="bon article de prsentation sur InfoQ" >bon article de présentation sur InfoQ</a>). Kanban insiste sur plusieurs points :</p><ul><li>la qualité,</li><li>réduire le <em>work in progress</em>, livrer le plus possible,</li><li>équilibrer demande / livraison,</li><li>prioriser,</li><li>réduire les variables et améliorer les processus.</li></ul><p>Les étapes de mise en place sont résumées ainsi :</p><ul><li>s&#8217;accorder sur les objectifs,</li><li>définir la value stream mapping (analyse des flux de besoins),</li><li>définir des inputs de contrôle,</li><li>définir le <em>done</em>,</li><li>définir un set de tâches de travail,</li><li>rencontrer les parties prenantes du projet (amont et aval),</li><li>créer votre tableau Kanban <em>(Kanban board)</em> qu&#8217;il soit physique ou électronique (idéal pour les équipes distribuées).</li></ul><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/kanban_board.jpg" border="0" alt="" /></div><p>A cela, il est possible d&#8217;ajouter différentes métriques telles que le <em>Work In Progress</em>, la qualité de code, la durée moyenne des tâches, le temps perdu (obstacles, bugs, manque d&#8217;information&#8230;).</p><p>Tout comme Scrum, Kanban <em>arrive</em> avec plusieurs bonnes pratiques mais ne pourra pas résoudre certaines lacunes comme un manque total de communication dans l&#8217;équipe, ou une organisation qui freine les changements&#8230; Dans un souci d&#8217;amélioration continue, Kanban propose plusieurs étapes afin de résoudre les fameux <em>bottleneck</em> du Lean (trouver la contrainte, définir une résolution possible, appliquer, trouver la contrainte suivante).</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Tout ceci (qui ressortira plusieurs fois durant la présentation) a pour but d&#8217;obtenir les effets positifs suivants : confiance (Trust), travail d&#8217;équipe (Teamplay), transparence (Transparency).</p><p>Plusieurs questions sur la difficulté de mise en place de Kanban sont posées lors du Q&#038;A de fin de session. Le speaker insiste sur le fait qu&#8217;en effet cela n&#8217;est pas trivial, mais les gains sur le long terme sont plus qu&#8217;avantageux.</p><p>Quelques liens pour approfondir ce sujet:</p><ul><li><a
href="http://www.agilemanagement.net" title="httpwwwagilemanagementnet" >http://www.agilemanagement.net</a></li><li><a
href="http://www.channelkanban.com" title="httpwwwchannelkanbancom" >http://www.channelkanban.com</a></li><li><a
href="http://www.limitedwipsociety.org" title="httpwwwlimitedwipsocietyorg" >http://www.limitedwipsociety.org</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-kanban-in-action/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Maven, jetty plugin et section mappée</title><link>http://blog.xebia.fr/2009/06/10/maven-jetty-plugin-et-section-mappee/</link> <comments>http://blog.xebia.fr/2009/06/10/maven-jetty-plugin-et-section-mappee/#comments</comments> <pubDate>Wed, 10 Jun 2009 08:28:05 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[file locking]]></category> <category><![CDATA[Jetty]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[nio / io]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2179</guid> <description><![CDATA[Comme de nombreux projets web, nous utilisons pour le développement le plugin Jetty pour maven afin de lancer rapidement l&#8217;application. Tout s&#8217;est toujours bien passé jusqu&#8217;au moment où nous avons attaqué concrètement la partie cliente (avec ses feuilles de style, fichiers Javascript&#8230;). En effet, le problème survient lors de la modification à la volée de [...]]]></description> <content:encoded><![CDATA[<p>Comme de nombreux projets web, nous utilisons pour le développement le plugin Jetty pour maven afin de lancer rapidement l&#8217;application.</p><p>Tout s&#8217;est toujours bien passé jusqu&#8217;au moment où nous avons attaqué concrètement la partie cliente (avec ses feuilles de style, fichiers Javascript&#8230;). En effet, le problème survient lors de la modification <em>à la volée</em> de ces fichiers pour n&#8217;avoir qu&#8217;un rafraîchissement à effectuer dans notre navigateur (et pas un arrêt/relance du serveur).</p><p>Ainsi, à la sauvegarde, on obtient l&#8217;erreur suivante :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/06/erreur_box.png" border="0" alt="" /></div><p>Il nous est alors impossible de sauvegarder le fichier, l&#8217;erreur <em>fichier ayant une section mappée utilisateur ouverte</em> apparaît.</p><p>En effet, le <a
href="http://en.wikipedia.org/wiki/File_locking#File_locking_in_Microsoft_Windows" title="file locking" >file locking</a>, mécanisme de restriction d&#8217;accès aux fichiers par les utilisateurs / processus, pose problème sous Windows si l&#8217;on veut modifier ces fichiers.</p><p>Jetty monte en mémoire tous les fichiers statiques <em>(html, css, js, &#8230;)</em> et utilise pour cela une section mappée (<a
href="http://en.wikipedia.org/wiki/Memory-mapped_file" title="memory mapped file" >memory mapped file</a>) dans le cas d&#8217;un connecteur NIO (celui par défaut). Or, sous Windows, l&#8217;utilisation de ce segment de mémoire virtuelle provoque immédiatement un <em>lock</em> du fichier. Il devient donc impossible de modifier dynamiquement ces fichiers et nous sommes obligés de redémarrer notre Jetty pour prendre en compte toute modification.</p><p>Pour contourner ce problème, plusieurs solutions existent.</p><h3><a
name="ChangementdeconnecteurNIOversI"></a>Changement de connecteur (NIO vers IO)</h3><p>La plus simple et rapide est de modifier le connecteur par défaut (<code>SelectChannelConnector</code>) qui est de type NIO(contournement du problème mais après tout nous sommes en <em>dev</em>, pas besoin d&#8217;en faire des tonnes <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p><p>Donc, dans notre <code>pom.xml</code>, nous allons modifier la configuration de notre <code>maven-jetty-plugin</code> en ajouter les quelques lignes suivantes :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
   &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
   &lt;configuration&gt;
      ...
      &lt;connectors&gt;
         &lt;connector implementation=&quot;org.mortbay.jetty.bio.SocketConnector&quot;&gt;
            ...
         &lt;/connector&gt;
      &lt;connectors&gt;
      ...
   &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Le contournement se situe au niveau de la balise <code>connectors</code>. Ainsi, on force Jetty à utiliser le <code>SocketConnector</code> au lieu du <code>SelectChannelConnector</code> par défaut. Ce connecteur non NIO  n&#8217;utilisera pas de section mappée pour charger les fichiers statiques et pourra dès lors les modifier à notre guise sans redémarrer Jetty.</p><h3><a
name="Webdefaultxml"></a>Webdefault.xml</h3><p>L&#8217;autre solution, que l&#8217;on pourrait qualifier de plus <em>officielle</em> (car directement sur le <a
href="http://docs.codehaus.org/display/JETTY/Files+locked+on+Windows" title="site de codehaus" >site de codehaus</a>) nous plonge dans le Jar pour modifier la configuration du fichier <code>webdefault.xml</code> (fichier chargé par Jetty avant le <code>web.xml</code>).</p><p>Ce fichier se trouve dans le Jar de Jetty (<code>%M2_REPO%/org/mortbay/jetty/jetty/6.1.x/jetty-6.1.x.jar</code>), au niveau du package <code>org.mortbay.jetty.webapp</code>. Il faut alors trouver la balise servlet où l&#8217;on peut lire</p><pre class="brush: xml; title: ; notranslate">
&lt;!—
...
useFileMappedBuffer : If set to true (the default), a  memory mappedfile buffer
will be used to serve static content when using an NIO connector.
Setting this value to false means that a direct buffer will be used instead.
If you are having trouble with Windows file locking, set this to false.
...
--&gt;
</pre><p>Cela tombe très bien, c&#8217;est exactement notre problème <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .  Nous pouvons donc passer cette valeur à false dans le fichier <code>webdefault.xml</code> pour ne pas utiliser cette fonctionnalité :</p><pre class="brush: xml; title: ; notranslate">
&lt;servlet&gt;
   ...
   &lt;init-param&gt;
      &lt;param-name&gt;useFileMappedBuffer&lt;/param-name&gt;
      &lt;param-value&gt;false&lt;/param-value&gt;
   &lt;/init-param&gt;
   ...
&lt;/servlet&gt;
</pre><p>Il ne reste plus qu&#8217;une dernière manipulation : dire au maven-jetty-plugin d&#8217;utiliser notre fichier de configuration <code>webdefault.xml</code>. Ces quelques lignes feront ce travail (avec votre fichier au niveau de <code>src/main/etc</code>) :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
   &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
   &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
   &lt;configuration&gt;
      ...
      &lt;webDefaultXml&gt;src/main/etc/webdefault.xml&lt;/webDefaultXml&gt;
      ...
   &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Voilà donc un gain de productivité qui ne se refuse pas !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/06/10/maven-jetty-plugin-et-section-mappee/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>GWT Galaxy</title><link>http://blog.xebia.fr/2009/01/23/gwt-galaxy/</link> <comments>http://blog.xebia.fr/2009/01/23/gwt-galaxy/#comments</comments> <pubDate>Fri, 23 Jan 2009 16:36:32 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[RIA]]></category> <category><![CDATA[GWT]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1384</guid> <description><![CDATA[Vous avez peut-être assisté au Paris JUG sur GWT et vous vous êtes forcément dit en sortant de la conférence qu&#8217;il fallait absolument vous mettre à GWT. En plus, le pas à franchir n&#8217;est pas énorme : c&#8217;est du Java (ça devrait aller), agrémenté de nombreuses librairies comme dans le monde J2EE, des libraires graphiques [...]]]></description> <content:encoded><![CDATA[<p>Vous avez peut-être assisté au <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20081104" title="Paris JUG" >Paris JUG</a> sur GWT et vous vous êtes forcément dit en sortant de la conférence qu&#8217;il fallait absolument vous mettre à GWT. En plus, le pas à franchir n&#8217;est pas énorme : c&#8217;est du Java (ça devrait aller), agrémenté de nombreuses librairies comme dans le monde J2EE, des libraires graphiques qui en jettent sont disponibles&#8230; Que d&#8217;avantages ! Mais par où commencer ?<br
/> Nous allons donc faire un tour d&#8217;horizon non exhaustif, mais balayant une grande partie de ce qui est utilisé dans la galaxie GWT : les plugins, les frameworks et les APIs générales et graphiques.</p><h3><a
name="volutionsdulangage"></a>Évolutions du langage</h3><p>Petit rappel : la toute première version de GWT (1.0) est sortie le 17 mai 2006. Oui, il y a seulement 2 ans et demi ! De nombreuses versions se sont suivies pour arriver à une version 1.4 (fin août 2007) stable et très complète, permettant de démarrer sereinement nos projets.<br
/> Mais voilà, fin août 2008 (1 an plus tard, la plus longue période entre 2 releases), la communauté GWT était en ébullition : en effet, l&#8217;importante version 1.5 pointa son nez apportant un lot de nouveautés assez importantes.<br
/> De nombreux articles nous exposent parfaitement ces nouveautés du langage ; on pourra se diriger sur le <a
href=" http://googlewebtoolkit.blogspot.com/2008/08/gwt-15-now-available.html" title="Blog de GWT" >Blog de GWT</a>, sur <a
href="http://www.infoq.com/news/2008/08/gwt-15" title="InfoQ" >InfoQ</a> ou chez <a
href=" http://blog.octo.com/index.php/2008/09/15/142-gwt-15-est-sorti" title="Octo" >Octo</a>.<br
/> Un rapide résumé donnerait :</p><ol><li>Enfin du Java en version 5 : annotations, generics, enhanced loop, autoboxing, import static&#8230;</li><li>Generics ? Donc nos <code>@gwt.typeArgs</code> sont terminés !</li><li>JRE Emulation beaucoup plus large avec entre autres les très attendues <code>TreeMap</code>, <code>LinkedHashMap</code> et autres <code>StringBuilder</code></li><li>Compilateur beaucoup plus rapide</li><li>Widgets plus complets et plus rapides</li></ol><p>En bref : que du bon !</p><h3><a
name="Plugins"></a>Plug-ins</h3><h4><a
name="ahrefhttpwwwinstantiationscomg"></a><a
href="http://www.instantiations.com/gwtdesigner/download.html" title="GWT Designer" >GWT Designer</a></h4><p>Plugin de type WYSIWYG. Il permet entre autres :</p><ul><li>la création de projet GWT, de module, de service et de librairie,</li><li>génération du service Async <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ,</li><li>la palette de widgets (intégrée dans une vue multi-onglets Design et Source),</li><li>ajout d&#8217;événements et modification des propriétés d&#8217;un composant dans les onglets Event et Properties,</li><li>Compilateur et Hosted Mode intégrés au projet (Builder Eclipse, menu « Run As&#8230; »),</li><li>drag and drop côté Design qui met automatiquement le « Source » à jour.</li></ul><p>À noter qu&#8217;il faudra, au-delà de la période d&#8217;essai, une <a
href="http://www.instantiations.com/gwtdesigner/purchase.html" title="licence annuelle ou perptuelle" >licence annuelle ou perpétuelle</a> pour continuer à l&#8217;utiliser.</p><h4><a
name="ahrefhttpwwwwirelexsoftcomVist"></a><a
href="http://www.wirelexsoft.com/VistaFei.html" title="VistaFei" >VistaFei</a></h4><p>Environnement de développement (qui s&#8217;appuie sur Eclipse 3.2) intégrant toute sorte de plugins spécialement conçus pour GWT. Il propose :</p><ul><li>la création de projet, de module (GWTView) et de service,</li><li>un WYSIWYG (très similaire à celui de GWT Designer) séparant l&#8217;onglet « Properties » de la vue « Design »,</li><li>la génération de code depuis la « GWTView »,</li><li>l&#8217;internationalisation aussi générée.</li></ul><p>Son utilisation est gratuite avec la licence « Community Edition ».</p><h4><a
name="ahrefhttpwwwjetbrainscomideafe"></a><a
href="http://www.jetbrains.com/idea/features/gwt.html" title="IntelliJ IDEA" >IntelliJ IDEA</a></h4><p>Un plugin GWT intégré à l&#8217;IDE très abouti :</p><ul><li>création de projet, de module et de service,</li><li>compilateur de projet,</li><li>complétion Javascript dans une méthode native (non, vous ne rêvez pas !!!),</li><li>quick-fix spécifiques GWT (votre code Java est correct mais il ne compilera pas, oubli de l&#8217;interface « IsSerializable », utilisation d&#8217;une librairie non émulée&#8230;), remplacement des @gwt.typeArgs&#8230;,</li><li>navigation rapide entre les méthodes synchrones et asynchrones.</li></ul><p>Le plugin est intégré à l&#8217;IDE de JetBrains, il faudra donc mettre la main à la poche pour <a
href="http://www.jetbrains.com/idea/buy/index.jsp" title="obtenir une licence" >obtenir une licence</a> à moins de vous lancer dans un projet Open Source.</p><h4><a
name="ahrefhttpwwwcypalinstudiotitle"></a><a
href="http://www.cypal.in/studio" title="Cypal Studio" >Cypal Studio</a></h4><p>Le plugin que tout développeur GWT anti-WYSIWYG a dans son IDE !</p><ul><li>création de module, de service et d&#8217;exemple (sample),</li><li>compilateur intégré au projet (« builder » Eclipse),</li><li>lancement du Hosted Mode.</li></ul><p>Simple mais efficace, ce produit est disponible gratuitement.</p><h3><a
name="Frameworks"></a>Frameworks</h3><h4><a
name="ahrefhttpcodegooglecompgwtmave"></a><a
href="http://code.google.com/p/gwt-maven/" title="GWTMaven" >GWT-Maven</a></h4><p>De nombreuses commandes maven adaptées à GWT sont disponibles, on notera parmi les plus intéressantes :</p><ul><li>Lancement du Hosted Mode (Tomcat, noserver, debug&#8230;),</li><li>Compilation GWT,</li><li>Lancement des tests unitaires GWT,</li><li>Génération des interfaces pour l&#8217;internationalisation,</li><li>Création de WAR GWT,</li><li>Création de JAR GWT.</li></ul><h4><a
name="ahrefhttpnoongileadfreefrgilea"></a><a
href="http://noon.gilead.free.fr/gilead/" title="Gilead" >Gilead</a> (anciennement <a
href="http://hibernate4gwt.sourceforge.net/" title="Hibernate4GWT" >Hibernate4GWT</a>)</h4><p>L&#8217;un des gros problèmes rencontrés au démarrage de GWT est l&#8217;utilisation des POJOs Hibernate côté client.<br
/> Je vous renvoie vers le très bon <a
href="http://blog.xebia.fr/2008/12/17/integrer-hibernate-avec-gwt-sans-douleur/" title="article d'Amin Fathallah (Xebia)" >article d&#8217;Amin Fathallah (Xebia)</a> qui détaille très bien les problèmes rencontrés.<br
/> Ainsi, Gilead nous permet d&#8217;utiliser nos POJOs Hibernate directement côté client sans aucun mapping Dozer !</p><h4><a
name="ahrefhttpgwtwidgetsourceforgen"></a><a
href="http://gwt-widget.sourceforge.net/" title="Spring" >Spring</a></h4><p>Accessible par les librairies <a
href=" http://gwt-widget.sourceforge.net/?q=node/51#GWTSpringController" title="GWTSL et  GWTWL" >GWT-SL et  GWT-WL</a>, il est tout à fait possible d&#8217;utiliser Spring dans un projet GWT.<br
/> Le principal changement est que les services ne sont plus définis en tant que servlets dans le <em>web.xml</em>. Ils sont remplacés par la classe <em> DispatcherServlet</em> de Spring qui pilotera l&#8217;application.<br
/> On notera aussi les classes GWTController et GWTHandler, cœur de GWT-SL, permettant de wrapper intégralement nos actions et nos services.</p><h4><a
name="ahrefhttpsajaxjsfdevjavanetnon"></a><a
href="https://ajax4jsf.dev.java.net/nonav/ajax/gwt/gwt-cdk.html" title="G4JSF" >G4JSF</a></h4><p>L&#8217;adaptation de JSF dans le monde GWT. Même mécanisme que pour le SpringController i.e. que l&#8217;on aura des interfaces/classes à implémenter/étendre au lieu des classes GWT standard, les principales étant ComponentEntryPoint et GwtFacesServiceAsync.<br
/> Le tutoriel de référence pour l&#8217;intégration de JSF avec GWT se trouve sur <a
href="http://www.theserverside.com/tt/articles/article.tss?l=GWTandJSF" title="The Server Side" >The Server Side</a>.</p><h3><a
name="APIsgraphiques"></a>APIs graphiques</h3><p>Le tour d&#8217;horizon continue avec les APIs graphiques.<br
/> Chaque composant ne sera pas détaillé à outrance, seuls certains seront cités pour donner un aperçu général de ce qui est proposé (détail complet sur les sites officiels respectifs de chaque librairie).</p><h4><a
name="ahrefhttpgwtgooglecomsamplesSh"></a><a
href="http://gwt.google.com/samples/Showcase/Showcase.html" title="Widgets Core (démo)" >Widgets Core (démo)</a></h4><p>Premier réflexe avec tout ce que l&#8217;on entend sur GWT : foncer sur la première librairie de composants graphiques à la mode !<br
/> Mais n&#8217;oublions pas toutefois que GWT propose en standard des widgets haut niveau très complets :</p><ul><li>Boutons : basique, checkbox, radio, custom&#8230;,</li><li>Listes : basique, suggest, arbre, menu&#8230;,</li><li>Text : basique et riche (à la <em>word</em>),</li><li>Popups,</li><li>Panels : décorateur, horizontal, vertical, dock, disclosure, onglet&#8230;,</li><li>Tables : tableau standard et flex.</li></ul><h4><a
name="ahrefhttpcodegooglecompgwtextt"></a><a
href="http://code.google.com/p/gwt-ext/" title="GWT-Ext" >GWT-Ext</a> (<a
href=" http://www.gwt-ext.com/demo/" title="dmo" >démo</a>)</h4><p>Certainement la librairie graphique la plus répandue.<br
/> Wrapping complet de l&#8217;API <a
href="http://extjs.com/" title="ExtJS" >ExtJS</a> dans sa version 2.0.2.<br
/> L&#8217;API ne contient donc quasiment que des classes dont les méthodes font une redirection native vers le code Javascript d&#8217;ExtJS.<br
/> On retrouvera donc tout ce qui se fait dans ExtJS avec des composants très puissants comme :</p><ul><li>Arbres : éditable, drag &#038; drop (arbre vers arbre ou tableau), tri, checkbox&#8230;,</li><li>Layouts : horizontal, vertical, accordéon&#8230;,</li><li>Liste : basique, listes liées, live (suggest), paginé&#8230;,</li><li>Tableau : éditable, tableaux groupés, JSON ou XML, chargement local ou distant, checkbox&#8230;,</li><li>Formulaire : à onglets, fieldset, multi-colonnes, binding avec un tableau&#8230;,</li><li>Éléments redimensionnables, déplaçables&#8230;</li><li>Widgets bien stylés et des thèmes out-of-the-box</li></ul><p>Le point noir reste toutefois la Javadoc, même si celle-ci s&#8217;étoffe au fur et à mesure des sorties de GWT-Ext (gros efforts fournis entre les versions 2.0.2 et 2.0.5). Elle reste cependant insuffisante. On pourra tout de même se retourner sur la doc d&#8217;ExtJS (puisque ce n&#8217;est que du pur wrapping) mais dès que l&#8217;on souhaitera aller un peu plus loin avec les composants, il faudra mettre les mains dans le <strike>cambouis</strike> Javascript.</p><h4><a
name="ahrefhttpextjscomproductsgxtti"></a><a
href="http://extjs.com/products/gxt/" title="Ext-GWT" >Ext-GWT</a> (<a
href="http://extjs.com/explorer/" title="dmo" >démo</a>)</h4><p>Le produit de la compagnie <a
href=" http://extjs.com/products/gxt/" title="ExtJS" >ExtJS</a> adapté à GWT.<br
/> Ext-GWT prend le parti de tout réécrire en pur GWT i.e. il n&#8217;y a aucun Javascript externe, tout est en Java.<br
/> Autre atout, l&#8217;API utilise les mécanismes internes de GWT permettant une intégration standard des fonctionnalités comme le remote service en Callback, retour JSON, XML&#8230; mais aussi du Java 5 (generics, enums et varargs).<br
/> On retrouve, sans surprise, les mêmes composants que pour GWT-Ext.<br
/> A noter enfin <a
href="http://extjs.com/products/license.php" title="3 licences" >3 licences</a> disponibles pour le produit (commercial, open source ou revendeur).</p><h4><a
name="ahrefhttpcodegooglecompsmartgw"></a><a
href="http://code.google.com/p/smartgwt/" title="Smart-GWT" >Smart-GWT</a> (<a
href="http://www.smartclient.com/smartgwt/showcase/" title="dmo" >démo</a>)</h4><p><a
href="http://www.jroller.com/sjivan/entry/smartgwt_1_0_released" title="Sanjiv Jivan" >Sanjiv Jivan</a> a encore frappé !<br
/> Après son wrapping complet d&#8217;ExtJS avec GWT-Ext, il s&#8217;attaque cette fois-ci à la librairie <a
href="http://www.smartclient.com/" title="SmartClient" >SmartClient</a> avec sa nouvelle API <a
href="http://www.smartclient.com/smartgwt/showcase/" title="SmartGWT" >SmartGWT</a> (nous vous en parlions dans une précédente <a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#SortiedeSmartGWT" title="revue de presse" >revue de presse</a>).<br
/> Le wrapping est encore une fois très complet : tous les composants de SmartClient sont présents dont :</p><ul><li>Arbre : colonne bloquée, drag &#038; drop entre de nombreux composants, data binding multiples&#8230;,</li><li>Slider, effects, animations, dialogs, look &#038; feel, &#8230;</li><li>Tableau : filtres, interactions avancées, &#8230;</li><li>Tile (<a
href="http://www.smartclient.com/smartgwt/showcase/#featured_tile_filtering" title="dmo" >démo</a>),</li><li>Liste-Tableau, Calendrier (à la <em>outlook</em>), load on demand, &#8230;</li></ul><p>On retrouvera aussi, et sans surprise, la plupart des composants combobox, radio, field, &#8230; d&#8217;autres librairie du même type.</p><h4><a
name="ahrefhttprialtoimprovetechnolo"></a><a
href="http://rialto.improve-technologies.com/wiki/rialtogwt" title="Rialto-GWT" >Rialto-GWT</a> (<a
href="http://rialto.improve-technologies.com/Rialto-GWT-Demo/" title="dmo" >démo</a>)</h4><p>De même que pour Ext-GWT, Rialto-GWT dans sa version <a
href="http://rialto.improve-technologies.com/wiki/rialtogwt/download" title="20" >2.0</a> nous propose d&#8217;utiliser GWT 1.5 donc Java 5.<br
/> L&#8217;API utilise aussi les mécanismes internes à GWT, le Wrapping Javascript est présent mais l&#8217;abstraction avec les classes Java rend l&#8217;utilisation très simple.<br
/> A noter toutefois une Javadoc de composants peu fournie&#8230;<br
/> Les composants principaux sont proches de ceux d&#8217;Ext-GWT.</p><h4><a
name="ahrefhttpcodegooglecomptatamit"></a><a
href="http://code.google.com/p/tatami/" title="Tatami (Dojo)" >Tatami (Dojo)</a> (<a
href="http://tatami.googlecode.com/svn/trunk/site/samples/TatamiDemo/index.html" title="dmo" >démo</a>)</h4><p>Encore une célèbre librairie Javascript porté en GWT : <a
href="http://dojotoolkit.org/" title="Dojo" >Dojo</a> !<br
/> Une fois de plus, on retrouve le support de GWT 1.5, des tableaux en tout genre, des sliders, des pickers&#8230;</p><h4><a
name="Autres"></a>Autres&#8230;</h4><p>D&#8217;autres librairies/codes sont disponibles sur la plupart des sites d&#8217;informations GWT, on trouvera ainsi quelques wrapper <a
href="http://script.aculo.us/" title="Script.aculo.us" >Script.aculo.us</a> (<a
href="http://gwt.components.googlepages.com/script.aculo.usintegration" title="ici" >ici</a> ou <a
href="http://labs.pathf.com/GWTaculous/" title="là" >là</a>) mais aussi des wrapper <a
href="http://jquery.com/" title="jQuery" >jQuery</a> (avec entre autre <a
href="http://code.google.com/p/gwtquery/" title="GQuery" >GQuery</a>).</p><div
align="center"> <object
type="application/x-shockwave-flash" data="http://widget-44.slide.com/widgets/slideticker.swf" height="450" width="600" style="width:600px;height:450px"><param
name="movie" value="http://widget-44.slide.com/widgets/slideticker.swf" /><param
name="quality" value="high" /><param
name="scale" value="noscale" /><param
name="salign" value="l" /><param
name="wmode" value="transparent"/><param
name="flashvars" value="cy=ms&#038;il=1&#038;channel=3458764513824714820&#038;site=widget-44.slide.com"/></object></div><h3><a
name="APIsgnrales"></a>APIs générales</h3><h4><a
name="ahrefhttpgwtgooglecomsamplesSh"></a><a
href="http://gwt.google.com/samples/Showcase/Showcase.html#CwMessagesExample" title="I18N" >I18N</a></h4><p>GWT gère nativement l&#8217;internationalisation, donc pas de librairies externes pour cette fonctionnalité.<br
/> L&#8217;utilisation est simple :</p><ul><li>un fichier properties contenant toutes nos clés,</li><li>des interfaces (<em>I18NConstants</em>, <em>I18NMessages</em>&#8230;) Java permettant de faire appel à ces clés,</li><li>une entrée dans notre module.gwt.xml avec si besoin la locale par défaut,</li><li>une locale pouvant être définie au runtime, dans la JSP ou dans l&#8217;URL.</li></ul><h4><a
name="ahrefhttpcodegooglecompgwtlogt"></a><a
href="http://code.google.com/p/gwt-log/" title="Logs" >Logs</a> (<a
href="http://allen-sauer.com/com.allen_sauer.gwt.log.demo.LogDemo/LogDemo.html" title="demo" >demo</a>)</h4><p>Un logger côté client très complet avec différents niveaux de logs : <em>info</em>, <em>warn</em>, <em>debug</em>, <em>error</em> et <em>fatal</em>.<br
/> De nombreux loggers sont disponibles comme le <em>ConsoleLogger</em>, le <em>GWTLogger</em> ou bien encore le <em>FireBugLogger</em>.</p><h4><a
name="ahrefhttpcodegooglecompgwtgoog"></a><a
href="http://code.google.com/p/gwt-google-apis/" title="Google API" >Google API</a></h4><p>Gears, gadgets, Ajax Search et Maps, voici ce que propose la librairie de Google.<br
/> À noter que Visualization est en release candidate.</p><h4><a
name="ahrefhttpcodegooglecompgwtmath"></a><a
href="http://code.google.com/p/gwt-math/" title="Maths" >Maths</a></h4><p>Émulation de <em>BigInteger</em> et <em>BigDecimal</em> avec un grand nombre de méthodes (<em>add</em>, <em>subtract</em>, <em>multiply</em>, <em>divide</em>, <em>abs</em>, <em>negate</em>, <em>compareTo</em>, <em>equals</em>, <em>toString</em>&#8230;).</p><h4><a
name="Etbiendautresencore"></a>Et bien d&#8217;autres encore !</h4><p>A chercher/récupérer au besoin <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>On pourra rapidement citer <a
href="http://code.google.com/p/gwteventservice/" title="GWTEventService" >GWTEventService</a> (qui permet entre autre de faire du pushing / comet), <a
href="http://trac.puremvc.org/PureMVC_Java_MultiCore/" title="PureMVC" >PureMVC</a> (MVC pour GWT) ou bien encore <a
href="http://code.google.com/p/goda-time/" title="GodaTime" >Goda-Time</a> (Joda-Time pour GWT !).</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Ce petit tour d&#8217;horizon de la galaxie GWT nous permet de retenir 3 choses : <em>vous avez dit galaxie ?</em>, <em>[Mode gros doutes] Tu penses que c&#8217;est possible ?</em> et enfin <em>ça ressemble vraiment à un puzzle cette techno&#8230;</em>.</p><p>Galaxie ? On peut se poser la question dans le sens où, si l&#8217;on creuse un peu, on trouve en effet quelques APIs très bien faites&#8230; mais elles sont tout de même rares ! Après plus de 2 ans d&#8217;existence, on a tout de même l&#8217;impression que cette techno se cherche encore et que, du coup, la communauté J2EE n&#8217;a pas encore confiance en GWT pour démarrer ses projets. Ce manque d&#8217;API robuste ne fera que renforcer cette tendance.</p><p>Est-ce possible ? Réponse : Google est ton ami <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Très peu de sites (comme par exemple <a
href="http://www.ongwt.com/" title="onGWT" >onGWT</a>)  référencent ce qui se fait en GWT au niveau des outils, des frameworks&#8230; Il devient assez laborieux de <em>trouver</em> une API pour un besoin spécifique. N&#8217;oublions pas que GWT émule les packages java.util, java.lang et java.io. Suffisant pour certains projets, mais pour de grosses applications de gestion il en faudra d&#8217;autres&#8230;</p><p>Un puzzle ! C&#8217;est certainement ce qui ressort le plus des projets GWT. Les librairies se récupèrent <em>à droite, à gauche</em> sur Google, il y en a partout avec peu de référencement&#8230; GWT devrait peut-être intégrer directement des APIs reconnues qui ont fait leurs preuves (comme par exemple <a
href="http://www.jcp.org/en/jsr/detail?id=310" title="Java 7 avec JodaTime" >Java 7 avec Joda-Time</a>)&#8230;</p><p>Autrement dit, et c&#8217;est aussi une des conclusions de <a
href="http://www.manning.com/hanson/" title="GWT in Action" >GWT in Action</a>, GWT permet de développer très facilement des applications <em>Ajax</em> sans forcément connaitre Javascript (tout en laissant la possibilité de coder directement en Javascript). Il y a bien sûr encore des choses à revoir/améliorer mais le langage est en très bonne voie et les librairies existantes font le travail demandé.</p><p>Cependant, devez-vous foncer tête baissée sur GWT car vous démarrez un nouveau projet Web / Ajax et vous ne savez pas quelle technologie choisir (<em>GWT</em>, <em>Flex</em>, <em>Silverlight</em>, <em>JavaFX</em>&#8230;) ? Impossible de répondre de manière générale pour tous les projets, cela dépend du back-end existant, des besoins du projet, du temps imparti&#8230; Sachez en tout cas que GWT est un excellent compromis entre Ajax, Java et Javascript et que personnellement, sur les projets auxquels j&#8217;ai participé, je ne regrette absolument pas son utilisation !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/01/23/gwt-galaxy/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> </channel> </rss>
