<?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</title>
	<atom:link href="http://blog.xebia.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.fr</link>
	<description>J2EE, Agilité et SOA</description>
	<lastBuildDate>Thu, 02 Sep 2010 09:34:37 +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>Des ESBs et des nuages</title>
		<link>http://blog.xebia.fr/2010/09/02/des-esbs-et-des-nuages/</link>
		<comments>http://blog.xebia.fr/2010/09/02/des-esbs-et-des-nuages/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 09:34:37 +0000</pubDate>
		<dc:creator>Mohamed-Hamza Benmansour</dc:creator>
				<category><![CDATA[SOA]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[ESB]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5315</guid>
		<description><![CDATA[
La vie terrestre des ESB, aura été courte. À peine compris et apprivoisés, les voilà qui s&#8217;envolent vers d&#8217;autres cieux. En effet, depuis quelque temps, on commence à percevoir les premières initiatives d&#8217;ESB dans les nuages comme celle de la firme WSO2 avec sa plateforme Stratos ou encore celle de Savoir technologies, dans le milieu [...]]]></description>
			<content:encoded><![CDATA[
<p>La vie terrestre des ESB, aura été courte. À peine compris et apprivoisés, les voilà qui s&#8217;envolent vers d&#8217;autres cieux. En effet, depuis quelque temps, on commence à percevoir les premières initiatives d&#8217;ESB dans les nuages comme celle de la firme WSO2 avec sa plateforme <a href="http://wso2.com/cloud/stratos/" title="Stratos" >Stratos</a> ou encore celle de <a href="http://www.savoirtech.com/web/public/home" title="Savoir technologies" >Savoir technologies</a>, dans le milieu hospitalier, où la mise en place d&#8217;un ESB dans les nuages a facilité les échanges des données des patients entre les différents départements.</p>
<p>Dans la suite de ce billet, nous allons essayer d&#8217;analyser cette tendance émergente en revenant brièvement sur :</p>
<ul>
<li>Ce qu&#8217;est un ESB et les besoins des systèmes en terme d&#8217;intégration.</li>
<li>Les plates-formes de cloud computing et leurs différents modèles.</li>
</ul>
<h3><a name="LesESB"></a>Les ESB</h3>
<p>Les tentatives pour couvrir la définition et l&#8217;utilisation des ESB ont fait couler beaucoup d&#8217;encre. Revenir brièvement sur le sujet s&#8217;avère donc un exercice très difficile. Néanmoins, on pourrait le synthétiser de la sorte (pour plus d&#8217;approfondissement, n&#8217;hésitez pas à consulter notre <a href="http://blog.xebia.fr/2007/10/16/livre-blanc-comprendre-et-savoir-utiliser-un-esb-dans-une-soa/" title="livre blanc" >livre blanc</a> sur le sujet) :</p>
<p>Un ESB est une plate-forme d&#8217;intégration basée sur des standards ouverts.  Elle combine les fonctions d&#8217;échange de messages, de transformation, de routage et d&#8217;exposition de services, afin de permettre de relier efficacement et de coordonner les différentes composantes d&#8217;un système d&#8217;information étendu. À bien des égards, un ESB pourrait être un point de départ pour l&#8217;émergence d&#8217;une SOA orientée événement ou &laquo;&nbsp;Event-Driven SOA&nbsp;&raquo;.</p>
<p>Quelles motivations pourraient pousser une telle plate-forme à migrer vers les nuages ? Essayons de les appréhender en s&#8217;intéressant de plus près à ce nouvel environnement d&#8217;exécution.</p>
<h3><a name="Lecloudcomputing"></a>Le cloud computing</h3>
<p><a href="http://fr.wikipedia.org/wiki/Cloud_computing" title="Wikipedia" >Wikipedia</a> définit le cloud computing, selon le <a href="http://www.syntec-informatique.fr/content/download/716911/10898717/file/SYNTEC-livre%20blanc-cloud_computing_HD.pdf" title="livre blanc" >livre blanc</a> de notre cher SYNTEC, comme un concept se déclinant sous trois formes :</p>
<ul>
<li>IaaS : infrastructure as a Service. C&#8217;est le niveau le plus bas. Le fournisseur assure dans ce cas les infrastructures matérielles nécessaires à la demande et selon les besoins de scalabilité et de stockage de l&#8217;application. Le client doit prendre en charge tous les aspects OS, pile logicielle et configuration pour tirer profit de l&#8217;élasticité des infrastructures fournies. On pourra citer comme exemple <a href="http://aws.amazon.com/ec2/" title="Amazon EC2" >Amazon EC2</a>.</li>
<li>PaaS : plate-forme as a Service, niveau intermédiaire. Le fournisseur met à disposition une pile logicielle spécifique à ses infrastructures matérielles. Il assure derrière la disponibilité de votre application en lui allouant dynamiquement les ressources nécessaires selon les variations de sa charge. Un des exemples les plus célèbres est <a href="http://code.google.com/appengine/" title="Google App Engine" >Google App Engine</a></li>
<li>SaaS : Software as a Service, niveau le plus haut du concept. Le client consomme le logiciel hébergé par la plate-forme sur une base de paiement par utilisation (pay per use). <a href="http://www.salesforce.com/fr/" title="SalesForce" >SalesForce</a> a été un des pionniers de ce type de service. </li>
</ul>
<p>Notons que le principe du &laquo;&nbsp;pay per use&nbsp;&raquo; s&#8217;applique aux différentes déclinaisons citées ci-dessus. Il représente un des avantages principaux du cloud computing. Il permet la rationalisation des coûts et l&#8217;élimination du gaspillage en exploitation, licences, &#8230;</p>
<p>Et comme  il y a toujours un &laquo;&nbsp;Mais&nbsp;&raquo;, celui du cloud computing a toujours été la sécurité des données et dans une moindre mesure le lock-in par rapport aux fournisseurs. Ce qui  a donné naissance à une nouvelle variante, les clouds privés. Les entreprises désireuses de tirer profit du concept et ne voulant pas confier leurs données stratégiques à Amazon, Google et consorts, ont opté pour cette alternative. Elles gardent ainsi la main sur l&#8217;exploitation et la gouvernance de leurs infrastructures existantes tout en les mutualisant entre leurs différentes filiales.</p>
<p>Les premières applications à avoir été mises dans les nuages ont été les commodités telles que les solutions de stockage, les CRM, quelques modules d&#8217;ERP (par exemple l&#8217;offre Business ByDesign de SAP)&#8230;</p>
<h3><a name="QuelsargumentspourlesESBdansle"></a>Quels arguments pour les ESB dans les nuages ?</h3>
<p>À la suite de ce bref tour d&#8217;horizon, deux arguments semblent se dégager en faveur d&#8217;un déploiement des ESB dans le cloud :</p>
<ol>
<li>Les ESB, de par leur adoption de standards ouverts, pourraient être un jour considérés comme des commodités, ce qui en fait un bon candidat pour le cloud. Cependant, les tentatives de standardisation, telles que JBI, n&#8217;ont à ce jour pas rassemblé un nombre critique d&#8217;acteurs et l&#8217;offre actuelle du marché reste composée de solutions hétérogènes, adoptant des architectures différentes.</li>
<li>Un déploiement dans les nuages permettrait une intégration pervasive inter-SI, rendant les échanges entre les départements d&#8217;une même entreprise plus directs. Cela permet aussi de faciliter l&#8217;intégration des éventuelles nouvelles applications en mode SaaS avec le reste du parc applicatif.</li>
</ol>
<p>Par ailleurs, porter son bus dans les nuages induira des défis différents selon si l&#8217;on choisit un cloud privé ou public. Dans le premier cas, ils seront plutôt du côté de l&#8217;exploitation traditionnellement orientée vers la gestion des bases de données, des serveurs d&#8217;applications et des serveurs web et il faudra donc se munir d&#8217;un framework approprié pour la gestion d&#8217;ESB dans son cloud privé tel que Stratos. Dans le deuxième cas,  ils seront plus nombreux. On citera principalement, la sécurité, la gouvernance et l&#8217;ouverture des firewall afin de pouvoir communiquer avec une plate-forme publique externe.</p>
<h3><a name="Perspectives"></a>Perspectives</h3>
<p>Les ESB dans les nuages ne sont qu&#8217;à leur début et la pertinence de ce portage est loin encore de faire l&#8217;unanimité. Certaines parties affirment même que les ESB n&#8217;ont pas leur place dans le cloud. Le débat promet d&#8217;être intéressant et animé.</p>
<h3><a name="Rfrences"></a>Références</h3>
<ul>
<li><a href="http://www.amazon.fr/syst%C3%A8me-dinformation-durable-refonte-progressive/dp/2746218291" title="Le systme dinformation durable" >Le système d&#8217;information durable</a></li>
<li><a href="http://oreilly.com/catalog/9780596006754" title="Entreprise service bus" >Entreprise service bus</a></li>
<li><a href="http://searchsoa.techtarget.com/news/article/0,289142,sid26_gci1514427_mem1,00.html" title="ESBs in the cloud Tricky in the early going" >ESBs in the cloud: Tricky in the early going</a></li>
<li><a href="http://www.ebizq.net/blogs/soainaction/2010/06/whats_next_for_the_esb_end_of.php" title="What's Next for the ESB? End of the Line, or Cloud Broker" >What&#8217;s Next for the ESB? End of the Line, or Cloud Broker</a></li>
<li><a href="http://www.runmyprocess.com/fr/content/integration-saas" title="RunMyProcess" >RunMyProcess</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/09/02/des-esbs-et-des-nuages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revue de Presse Xebia</title>
		<link>http://blog.xebia.fr/2010/08/31/revue-de-presse-xebia-174/</link>
		<comments>http://blog.xebia.fr/2010/08/31/revue-de-presse-xebia-174/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 05:48:06 +0000</pubDate>
		<dc:creator>Xebia France</dc:creator>
				<category><![CDATA[Revue de presse]]></category>
		<category><![CDATA[Brevet]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[java7]]></category>
		<category><![CDATA[Jdk7]]></category>
		<category><![CDATA[rabbitmq]]></category>
		<category><![CDATA[SpringSource]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5303</guid>
		<description><![CDATA[

La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.
Actualité  éditeurs / SSII

Sortie de RabbitMQ 2.0

Le coin de la  technique

Gestion automatique des ressources dans Java7 (ARM)

Evènements  de notre communauté en France et à l'étranger

Google et les brevets

Actualité  éditeurs / SSII
Sortie de RabbitMQ 2.0
La sortie de la version 2.0 du serveur [...]]]></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/31/revue-de-presse-xebia-174/#SortiedeRabbitMQ">Sortie de RabbitMQ 2.0</a></li>
</ul>
<p><strong>Le coin de la  technique</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/08/31/revue-de-presse-xebia-174/#Gestionautomatiquedesressource">Gestion automatique des ressources dans Java7 (ARM)</a></li>
</ul>
<p><strong>Evènements  de notre communauté en France et à l'étranger</strong></p>
<ul>
<li><a href="http://blog.xebia.fr/2010/08/31/revue-de-presse-xebia-174/#Googleetlesbrevets">Google et les brevets</a></li>
</ul>
<h3><a name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3>
<h4><a name="SortiedeRabbitMQ"></a>Sortie de RabbitMQ 2.0</h4>
<p>La sortie de la version 2.0 du serveur de messaging <a href="http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/" title="AMQP" >AMQP</a> RabbitMQ vient d'être annoncée <a href="http://www.rabbitmq.com/blog/2010/08/27/growing-up/" title="ici" >ici</a>.<br />
Cette release majeure vient avec une refonte importante et son lot de nouveautés :</p>
<ul>
<li>Une refonte de la gestion de la persistence permettant une alternative au moteur de persistence embarqué. Il sera possible de développer un support pour une base de données relationelle ou NoSQL ou tout autre data store.</li>
<li>Le support de différents protocoles de messaging : AMQP (0-8 et <a href="http://www.rabbitmq.com/blog/2010/08/04/rabbitmq-and-amqp-0-9-1/" title="0-9-1" >0-9-1</a>), <a href="http://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" title="XMPP" >XMPP</a>, <a href="http://stomp.codehaus.org/Protocol" title="STOMP" >STOMP</a>, HTTP, SMTP... Il sera aussi possible d'ajouter de nouveaux protocoles à l'aide d'extensions. </li>
<li>La mise en place d'une infrastructure ayant pour but de simplifier le développement d'outils pour la gestion et le monitoring de RabbitMQ.</li>
<li>Une amélioration de la gestion des plugins (il n'est plus nécessaire de compiler les plugins, une version pré-compilée peut être directement chargée par RabbitMQ).</li>
</ul>
<p>SpringSource qui a récemment racheté RabbitMQ (nous vous en avions parlé <a href="http://blog.xebia.fr/2010/04/19/revue-de-presse-xebia-155/#RabbitMQrachetparSpringSource" title="ici" >ici</a>) propose de son côté un template reprenant les principes des templates jdbc, hibernate, jms ou encore LDAP encapsulant le client Java d'AMQP. Les utilisateurs habitués à <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/jms/core/JmsTemplate.html" title="JmsTemplate" >JmsTemplate</a> retrouveront donc leurs repères en utilisant l'<a href="http://static.springsource.org/spring-amqp/docs/1.0.x/api/org/springframework/amqp/core/AmqpTemplate.html" title="AmqpTemplate" >AmqpTemplate</a> du projet <a href="http://www.springsource.org/spring-amqp" title="spring AMQP" >spring AMQP</a>.</p>
<p>SpringSource/VMWare continue donc de faire évoluer son portefeuil de produits avec cette évolution majeure de RabbitMQ, qu'il considère comme une pièce essentielle à sa stratégie de développement du Cloud Computing (voir <a href="http://blog.springsource.com/2010/04/13/springsource-acquires-rabbitmq/" title="cet article" >cet article</a> de Rod Johnson).</p>
<h3><a name="Lecoindelatechnique"></a>Le coin de la  technique</h3>
<h4><a name="Gestionautomatiquedesressource"></a>Gestion automatique des ressources dans Java7 (ARM)</h4>
<p>Java7 suit son petit bonhomme de chemin sans qu'on ait encore une bonne visibilité sur la date de sortie officiel. Le <a href="http://download.java.net/jdk7/" title="build 105" >build 105</a> de la version actuelle propose une nouvelle fonctionnalité très intéressante qui devrait facilité la vie de chaque développeur: <a href="http://blogs.sun.com/darcy/entry/project_coin_updated_arm_spec" title="lAutomatic Resource Management" >l'<em>Automatic Resource Management</em></a>. </p>
<p>L'idée, proposée par Joshua Bloch depuis quelques années déjà, consiste à améliorer la fermeture des ressources sous la forme d'une clause <code>try-with-resources</code>. Actuellement lorsqu'on manipule une ressource, par exemple un <code>InputStream</code>, la façon la plus propre ressemble à ceci:</p>
<div class="syntax_hilite">
<div id="java-3">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> copyFile<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AFile+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">File</span></a> in, <a href="http://www.google.com/search?q=allinurl%3AFile+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">File</span></a> out<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AFileInputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileInputStream</span></a> fis = <span style="color: #000000; font-weight: bold;">null</span>;<br />
&nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AFileOutputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileOutputStream</span></a> fos = <span style="color: #000000; font-weight: bold;">null</span>;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;fis = <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=allinurl%3AFileInputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileInputStream</span></a><span style="color: #66cc66;">&#40;</span>in<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;fos= <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=allinurl%3AFileOutputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileOutputStream</span></a><span style="color: #66cc66;">&#40;</span>out<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// Lire le fichier in et écrire dans le out</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;...<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span>&nbsp; <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AException+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">Exception</span></a> e<span style="color: #66cc66;">&#41;</span>&nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;...&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; close<span style="color: #66cc66;">&#40;</span>fis<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; close<span style="color: #66cc66;">&#40;</span>fos<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #993333;">void</span> close<span style="color: #66cc66;">&#40;</span>Closeable closeable<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>closeable != <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">try</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;closeable.<span style="color: #006600;">close</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AIOException+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">IOException</span></a> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>...<span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Ce code devient vite très verbeux et répetitif car beaucoup de vérifications doivent être faites pour s'assurer de la possibilité de fermer la ressource. La solution pour simplifier cela est de déléguer la fermeture du flux à l'aide du <code>try</code>:</p>
<div class="syntax_hilite">
<div id="java-4">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> copyFile<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AFile+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">File</span></a> file<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">try</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AFileInputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileInputStream</span></a> fis=<span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=allinurl%3AFileInputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileInputStream</span></a><span style="color: #66cc66;">&#40;</span>in<span style="color: #66cc66;">&#41;</span>; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?q=allinurl%3AFileOutputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileOutputStream</span></a> fos=<span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=allinurl%3AFileOutputStream+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">FileOutputStream</span></a><span style="color: #66cc66;">&#40;</span>out<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// Lire le fichier in et écrire dans le out</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;...<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span> <br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Le code gagne énormément en visibilité, les tests pour savoir si la ressource est <code>null</code> ou si la fermeture s'est bien déroulée sont gérés en interne de la JVM. A noter que pour être fermées les ressources devront étendre une nouvelle interface <code><a href="http://download.java.net/jdk7/docs/api/java/lang/AutoCloseable.html" title="AutoCloseable" >AutoCloseable</a></code>.</p>
<p>S'il existe un certain consensus autour de l'utilité de cette évolution, il demeure encore un petit débat sur la partie <code>catch</code> des exceptions. Sans rentrer dans les détails, les exceptions levées pendant la fermeture d'une ressource annihilent celles levées dans le bloc <code>try</code>, ce qui en général est préférable mais du coup peut aussi masquer des exceptions importantes pour l'analyse du problème.</p>
<h3><a name="EvnementsdenotrecommunautenFra"></a>Evènements  de notre communauté en France et à l'étranger</h3>
<h4><a name="Googleetlesbrevets"></a>Google et les brevets</h4>
<p>Semaine chargée pour Google:</p>
<ul>
<li>InfoQ <a href="http://www.infoq.com/news/2010/08/h264-free" title="nous annonce" >nous annonce</a> que le MPEG LA a décidé de continuer à ne pas réclamer de royalties pour les videos encodées en H.264 et distribuées gratuitement aux utilisateurs. Seules les plateformes vendant des vidéos sont, elles, toujours soumises à taxation. C'est donc une réponse à Google qui avait il y a quelques temps annoncé WebM, un codec vidéo semblable au H.264 mais plus libre et débarrassé des problèmes de brevets et de royalties qui entravent ce dernier. Si InfoQ ne voit pas trop de problèmes à continuer d'utiliser H.264, ce n'est pas du tout l'avis de <a href="http://en.wikipedia.org/wiki/Mike_Shaver" title="Mike Shaver" >Mike Shaver</a> ingénieur haut gradé chez Mozilla et <a href="http://shaver.off.net/diary/2010/08/27/free-as-in-smokescreen/" title="qui rappelle" >qui rappelle</a> que les logiciels permettant de produire ou de consommer ces vidéos devront eux toujours s'acquitter d'une licence. La bataille entre WebM et H.264 ne fait donc que commencer.</li>
<li>Ensuite, c'est <a href="http://fr.wikipedia.org/wiki/Paul_Allen" title="Paul Allen" >Paul Allen</a>, le co-fondateur de Microsoft, qui <a href="http://www.numerama.com/magazine/16620-brevets-onze-geants-du-web-poursuivis-par-le-cofondateur-de-microsoft.html" title="attaque Google et nombre de ses petits camarades" >attaque Google et nombre de ses petits camarades</a> (AOL, Yahoo, Facebook) pour avoir enfreint 4 brevets détenus par sa compagnie "Interval Licensing". Le blog <em>Digits</em> du Wall Street Journal <a href="http://blogs.wsj.com/digits/2010/08/27/the-paul-allen-suit-a-look-at-the-patents/" title="sest pench sur 2 de ces brevets" >s'est penché sur 2 de ces brevets</a>. Nous vous déconseillons fortement la lecture de son analyse si vous avez réalisé quoi que ce soit dans l'informatique ces 10 dernières années. En effet, vous risquez de ne plus trouver le sommeil en vous rendant compte que vous enfreignez sans doutes, vous aussi, nombre de brevets !</li>
<li>Et pour finir sur Google et les brevets, vous vous souvenez des récentes poursuites engagées par Oracle concernant Java et Android. Google vient de riposter, <a href="http://googlecode.blogspot.com/2010/08/update-on-javaone.html" title="en annoncant" >en annoncant</a> qu'aucun de ses employés ne participera à <a href="http://en.wikipedia.org/wiki/JavaOne" title="JavaOne" >JavaOne</a> <a href="http://www.oracle.com/us/javaonedevelop/062264.html" title="cette année" >cette année</a>. Pour ceux qui voulaient échanger avec les employés de Google, il semble que c'est plus tard dans l'année, à Devoxx, <a href="http://twitter.com/ecspike/status/22288635610" title="qu'il faille se rendre" >qu'il faille se rendre</a>. Mais rassurez vous, il y aura quand même de l'ambiance à JavaOne: James Gosling, père de Java, demande <a href="http://nighthacks.com/roller/jag/entry/let_larry_know_you_care" title="sur son blog" >sur son blog</a> à toute personne y assistant de porter un TShirt arborant le slogan "Java just Free it". Si cette idée ne risque pas trop de faire bouger Oracle, elle devrait quand même apporter sa dose de fun à l'évènement !</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/08/31/revue-de-presse-xebia-174/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Customiser les Tooltips JFreeChart</title>
		<link>http://blog.xebia.fr/2010/08/30/customiser-les-tooltips-jfreechart/</link>
		<comments>http://blog.xebia.fr/2010/08/30/customiser-les-tooltips-jfreechart/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 11:49:45 +0000</pubDate>
		<dc:creator>Amin Fathallah</dc:creator>
				<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[JFreeChart]]></category>
		<category><![CDATA[Tooltips]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5269</guid>
		<description><![CDATA[
J'ai récemment eu quelques difficultés à customiser les styles (couleurs, fonts, ...) des Tooltips générés par l'API JFreeChart.
Quelques recherches sur le sujet m'ont permis de constater que je n'étais pas le seul à rencontrer des difficultés pour modifier les styles par défaut fournis par l'API JFreeChart.
L'API JFreeChart étant assez mal documentée sur le sujet, j'ai [...]]]></description>
			<content:encoded><![CDATA[
<p>J'ai récemment eu quelques difficultés à customiser les styles (couleurs, fonts, ...) des Tooltips générés par l'API <a href="http://www.jfree.org/jfreechart/" title="JFreeChart" >JFreeChart</a>.<br />
Quelques recherches sur le sujet m'ont permis de constater que je n'étais pas le seul à rencontrer des difficultés pour modifier les styles par défaut fournis par l'API <a href="http://www.jfree.org/jfreechart/" title="JFreeChart" >JFreeChart</a>.<br />
L'API <a href="http://www.jfree.org/jfreechart/" title="JFreeChart" >JFreeChart</a> étant assez mal documentée sur le sujet, j'ai du fouiller dans le code source de l'api pour trouver mon bonheur. Comme dit le proverbe, <em>"Pour avoir de l'eau claire, il n'est que d'aller à la source"</em>.<br />
Ayant finalement trouvé une solution au problème, je me propose de la partager au travers de ce billet.</p>
<h3><a name="LesTooltipsavecJFreeChart"></a>Les Tooltips avec JFreeChart</h3>
<p>Les implémentations des Tooltips fournis par l'API <a href="http://www.jfree.org/jfreechart/" title="JFreeChart" >JFreeChart</a> sont basées sur l'interface <code>ToolTipTagFragmentGenerator</code>.</p>
<p><code><strong>ToolTipTagFragmentGenerator.java</strong></code></p>
<div class="syntax_hilite">
<div id="java-15">
<div class="java">package org.<span style="color: #006600;">jfree</span>.<span style="color: #006600;">chart</span>.<span style="color: #006600;">imagemap</span>;</p>
<p><span style="color: #808080; font-style: italic;">/**<br />
&nbsp; * Interface for generating the tooltip fragment of an HTML image map area tag.<br />
&nbsp; * The fragment should be &lt;code&gt;XHTML 1.0&lt;/code&gt; compliant.<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> ToolTipTagFragmentGenerator <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* Generates a tooltip string to go in an HTML image map.<br />
&nbsp; &nbsp; &nbsp;* @param toolTipText&nbsp; the tooltip.<br />
&nbsp; &nbsp; &nbsp;* @return The formatted HTML area tag attribute(s).<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</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> generateToolTipFragment<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> toolTipText<span style="color: #66cc66;">&#41;</span>;</p>
<p><span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>L'api <a href="http://www.jfree.org/jfreechart/" title="JFreeChart" >JFreeChart</a> fournit quelques implémentations de base :</p>
<ul>
<li><code><strong>StandardToolTipTagFragmentGenerator.java</strong></code> : Cette classe permet de générer un Tooltip en se basant sur les attributs alt et title.</li>
</ul>
<div class="syntax_hilite">
<div id="java-16">
<div class="java">package org.<span style="color: #006600;">jfree</span>.<span style="color: #006600;">chart</span>.<span style="color: #006600;">imagemap</span>;</p>
<p><span style="color: #808080; font-style: italic;">/**<br />
&nbsp;* Generates tooltips using the HTML title attribute for image map area tags.<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StandardToolTipTagFragment... <span style="color: #000000; font-weight: bold;">implements</span> ToolTipTagFragmentGenerator <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</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> generateToolTipFragment<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> toolTipText<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">" title="</span> + ImageMapUtilities.<span style="color: #006600;">htmlEscape</span><span style="color: #66cc66;">&#40;</span>toolTipText<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + <span style="color: #ff0000;">" alt=''"</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<ul>
<li><code><strong>OverLIBToolTipTagFragmentGenerator.java</strong></code> : Cette classe utilise la libraire JavaScript <a href="http://www.bosrup.com/web/overlib/" title="overLIB" >overLIB</a> pour générer un Tooltip avec un style par défaut.</li>
</ul>
<div class="syntax_hilite">
<div id="java-17">
<div class="java">package org.<span style="color: #006600;">jfree</span>.<span style="color: #006600;">chart</span>.<span style="color: #006600;">imagemap</span>;</p>
<p><span style="color: #808080; font-style: italic;">/**<br />
&nbsp; &nbsp;* Generates tooltips using the OverLIB library<br />
&nbsp; &nbsp;* (http://www.bosrup.com/web/overlib/).<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> OverLIBToolTipTagFragmentGenerator<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">implements</span> ToolTipTagFragmentGenerator <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</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> generateToolTipFragment<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> toolTipText<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">" onMouseOver=return overlib('"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + ImageMapUtilities.<span style="color: #006600;">javascriptEscape</span><span style="color: #66cc66;">&#40;</span>toolTipText<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + <span style="color: #ff0000;">"'); onMouseOut=return nd();"</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<h3><a name="QuelquesexemplesdeTooltipsavec"></a>Quelques exemples de Tooltips avec overLIB</h3>
<p>Le site de la libraire <a href="http://www.bosrup.com/web/overlib/" title="overLIB" >overLIB</a> proposent de nombreux exemples d'utilisation dont :</p>
<ul>
<li><strong>Tooltip ordinaire avec le style fournis par JFreeChart</strong> :</li>
</ul>
<div class="syntax_hilite">
<div id="javascript-18">
<div class="javascript">&lt;a href=<span style="color: #3366CC;">"javascript:void(0);"</span> onmouseover=<span style="color: #3366CC;">"return overlib('This is an ordinary popup.'); onmouseout='return nd();'"</span>&gt;tooltip&lt;/a&gt;</div>
</div>
</div>
<p></p>
<ul>
<li><strong>Tooltip personnalisé avec la librairie overLIB</strong> :</li>
</ul>
<div class="syntax_hilite">
<div id="javascript-19">
<div class="javascript">&lt;a href=<span style="color: #3366CC;">"javascript:void(0);"</span> onmouseover=<span style="color: #3366CC;">"return overlib('&lt;b&gt;&lt;font color='#FF6666' face='Courier,Verdana,Arial,Helvetica'&gt;No border or image!&lt;/font&gt;&lt;/b&gt;', FULLHTML)"</span> onmouseout=<span style="color: #3366CC;">"return nd();"</span>&gt;with overlib styles&lt;/a&gt;</div>
</div>
</div>
<p></p>
<ul>
<li><strong>Tooltip avec du html et du css</strong> :</li>
</ul>
<div class="syntax_hilite">
<div id="javascript-20">
<div class="javascript">&lt;a href=<span style="color: #3366CC;">"javascript:void(0);"</span> onmouseover=<span style="color: #3366CC;">"return overlib('&lt;html&gt;&lt;body&gt;&lt;span style='font-size: 8pt;background: #FFFF99;border:none;'&gt;No border or image!&lt;/span&gt;&lt;/body&gt;&lt;/html&gt;', FULLHTML)"</span> onmouseout=<span style="color: #3366CC;">"return nd();"</span>&gt;with HTML&lt;/a&gt;</div>
</div>
</div>
<p></p>
<h3><a name="Solution"></a>Solution</h3>
<p>Une fois le mécanisme compris, tout ce qu'il reste à faire c'est s'inspirer de la classe <code>OverLIBToolTipTagFragmentGenerator</code> pour créer un générateur de Tooltips personnalisés.</p>
<p>J'ai pour ma part opté pour la solution FULLHTML dans laquelle la librairie <a href="http://www.bosrup.com/web/overlib/" title="overLIB" >overLIB</a> gère uniquement les événements <code>onmouseover</code> et <code>onmouseout</code>, les styles et les couleurs sont appliqués directement dans le code HTML.</p>
<p>Je commence par créer mon générateur personnalisé <code>CustomToolTipTagFragmentGenerator</code> :</p>
<div class="syntax_hilite">
<div id="java-21">
<div class="java"><span style="color: #a1a100;">import org.jfree.chart.imagemap.ImageMapUtilities;</span><br />
<span style="color: #a1a100;">import org.jfree.chart.imagemap.ToolTipTagFragmentGenerator;</span></p>
<p><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomToolTipTagFragment... <span style="color: #000000; font-weight: bold;">implements</span> ToolTipTagFragmentGenerator <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #808080; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp; * Generates tooltips using the OverLIB library with FULLHTML option<br />
&nbsp; &nbsp; &nbsp; * (http://www.bosrup.com/web/overlib/).<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</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> generateToolTipFragment<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> toolTipText<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</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> ret = <span style="color: #ff0000;">" onMouseOver=return overlib('"</span> + <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ImageMapUtilities.<span style="color: #006600;">javascriptEscape</span><span style="color: #66cc66;">&#40;</span>toolTipText<span style="color: #66cc66;">&#41;</span>&nbsp; + <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">"', FULLHTML); onMouseOut=return nd();"</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> ret;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Pour la génération du graphique, la classe <code>ChartUtilities</code> propose les méthodes suivantes :</p>
<div class="syntax_hilite">
<div id="java-22">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">static</span>&nbsp; <span style="color: #993333;">void</span> writeImageMap<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3APrintWriter+java.sun.com&amp;bntl=1"><span style="color: #aaaadd; font-weight: bold;">PrintWriter</span></a> writer, <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> name, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ChartRenderingInfo info, ToolTipTagFragmentGenerator tooltipTagGen,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; URLTagFragmentGenerator urlTagGen<span style="color: #66cc66;">&#41;</span></div>
</div>
</div>
<p></p>
<p>Ou</p>
<div class="syntax_hilite">
<div id="java-23">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">static</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> getImageMap<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> name, ChartRenderingInfo info,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; URLTagFragmentGenerator urlTagFragmentGenerator<span style="color: #66cc66;">&#41;</span></div>
</div>
</div>
<p></p>
<p>Le code html permettant de générer le rendu du Tooltip est créé en implémentant l'interface <code>StandardCategoryToolTipGenerator</code> :</p>
<p><code><strong>CustomValueToolTipGenerator.java</strong></code></p>
<div class="syntax_hilite">
<div id="java-24">
<div class="java"><span style="color: #000000; font-weight: bold;">Class</span> CustomValueToolTipGenerator <span style="color: #000000; font-weight: bold;">extends</span> StandardCategoryToolTipGenerator&nbsp; <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</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> generateToolTip<span style="color: #66cc66;">&#40;</span>CategoryDataset dataset, <span style="color: #993333;">int</span> row, <span style="color: #993333;">int</span> column<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StringBuilder toolTipHtml = <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toolTipHtml.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"&lt;html&gt;&lt;body&gt;"</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toolTipHtml.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"&lt;span&nbsp; style='color: #000000;padding: 0.1em 0.1em;background: #FFFF99;border: 1px solid #000000;width:40px;left:25px;top:2px;font-family: Calibri, Tahoma,&nbsp; Geneva, sans-serif;font-size: 8pt;font-weight:normal;' /&gt;"</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toolTipHtml.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"&lt;/body&gt;&lt;/html&gt;"</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> toolTipHtml.<span style="color: #006600;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Une instance de cette classe doit être passée en paramètre de la méthode <code>void setBaseToolTipGenerator(CategoryToolTipGenerator)</code> de la classe <code>AbstractCategoryItemRenderer</code>.</p>
<p>Toutefois, si vous avez opté pour une utilisation des styles fournis par <a href="http://www.bosrup.com/web/overlib/" title="overLIB" >overLIB</a>, la fonction <code>generateToolTip</code> doit se contenter de retourner le message à afficher dans le Tooltip.</p>
<p>En espérant que cette solution puisse vous aider !</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/08/30/customiser-les-tooltips-jfreechart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java en Production &#8211; L&#8217;audit</title>
		<link>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/</link>
		<comments>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 11:40:04 +0000</pubDate>
		<dc:creator>Cyrille Leclerc et David Galichet</dc:creator>
				<category><![CDATA[Exploitation]]></category>
		<category><![CDATA[Java / JEE]]></category>
		<category><![CDATA[annotation]]></category>
		<category><![CDATA[aspect]]></category>
		<category><![CDATA[audit]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.xebia.fr/?p=5252</guid>
		<description><![CDATA[
Après avoir abordé la gestion des fichiers de logs, nous continuons aujourd'hui la série "Applications Java prêtes pour la Production" avec l'audit.
Par audit, nous entendons l'audit des actions importantes réalisées sur une application.
Pourquoi auditer ?
Est-il vraiment utile de générer des informations d'audit dans nos applications ? Sans explications de juriste, quelques exemples suffiront à nous [...]]]></description>
			<content:encoded><![CDATA[
<p>Après avoir abordé la gestion des <a href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="fichiers de logs" >fichiers de logs</a>, nous continuons aujourd'hui la série "Applications Java prêtes pour la Production" avec l'audit.</p>
<p>Par audit, nous entendons l'audit des actions importantes réalisées sur une application.</p>
<h3><a name="Pourquoiauditer"></a>Pourquoi auditer ?</h3>
<p>Est-il vraiment utile de générer des informations d'audit dans nos applications ? Sans explications de juriste, quelques exemples suffiront à nous en convaincre :</p>
<ul>
<li>Un site web de partage de photos doit pouvoir dire qui a uploadé quelle image, depuis quelle adresse IP et à quelle date.</li>
<li>L'application d'administration d'un site de e-commerce doit tracer toutes les modifications de prix pour empêcher un <em>employé astucieux</em> de baisser à 1 euro le prix de son téléphone préféré le temps de passer commande.</li>
</ul>
<p>Pour revenir à des explications plus théoriques, les logs d'audit nous apportent :</p>
<ul>
<li>les informations nécessaires à la justice en cas d'infraction,</li>
<li>la détection d'intrusions,</li>
<li>la reconstitution des événements en complément des logs d'exceptions pour aider au diagnostique de problèmes.</li>
</ul>
<p>Nous nous placerons dans le cas le plus fréquent où nous ne développons pas d'outil pour consulter ces informations d'audit et où un accès direct au média de stockage (<code>grep</code> sur fichier texte, sql sur base de données, etc) suffit.</p>
<h3><a name="Quefautilauditer"></a>Que faut-il auditer ?</h3>
<p>Dans un monde idéal, le contenu des messages serait défini avec les équipes de sécurité. En pratique, nous sommes assez seuls pour les choisir et il ne faut pas dramatiser. Si l'on ne prend pas le sujet à la légère, après quelques itérations, notre bon sens est le plus souvent suffisant.</p>
<p>Les éléments clefs à tracer sont :</p>
<ul>
<li>L'heure exacte : il est essentiel que les serveurs soient à l'heure pour corréler les logs des différentes briques du système d'information. Le sujet est aujourd'hui censé être banal pour les équipes système (c.f. <a href="http://en.wikipedia.org/wiki/Network_Time_Protocol" title="NTP" >NTP</a>) et nous pouvons demander le soutien des équipes sécurité pour obtenir gain de cause.</li>
<li>L'action réalisée : il s'agit souvent du nom de la méthode métier appelée.</li>
<li>L'identifiant et/ou la valeur des données métier sensibles manipulées : souvent les <code>id</code> ou le <code>toString()</code> des paramètres d'appel.</li>
<li>L'auteur de la manipulation : nom de l'utilisateur connecté et son adresse ip (pour plus de détails sur l'adresse ip : <a href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="XForwardedFilter" >XForwardedFilter</a> et <a href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat  Adresse IP de linternaute load balancer reverse proxy et header Http XForwardedFor" >Tomcat : Adresse IP de l'internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>).</li>
<li>La description succincte des exceptions levées pour analyser les éventuelles attaques.</li>
</ul>
<h3><a name="Pourquoileslogsdaccsdesserveur"></a>Pourquoi les logs d'accès des serveurs http ne suffisent pas ?</h3>
<p>La première idée serait de se contenter des logs d'accès des serveurs web et des firewalls pour auditer les accès à nos applications ; nous n'aurions alors plus rien à faire.</p>
<p>Hélas, cela n'est pas suffisant car il manque dans les logs http des informations clefs :</p>
<ul>
<li>Nous n'avons pas l'identité de l'appelant : on a bien l'adresse ip mais pas le login de l'utilisateur authentifié.</li>
<li>Nous n'avons pas les id passés en paramètre des opérations à auditer (sauf si on fait du REST) ; en SOAP, nous n'avons même pas le nom de l'opération !</li>
<li>Nous n'avons pas le détail des exceptions levées par l'application.</li>
</ul>
<h3><a name="APIFrameworkdelogvsframeworkdd"></a>API : Framework de log vs. framework dédié</h3>
<p>Dans un monde idéal, le framework d'audit ne devrait pas dépendre de la configuration des logs pour ne pas risquer qu'une mauvaise manipulation de ces configurations de logs ne le désactive.</p>
<p>En pratique, les frameworks de logs sont les briques les plus performantes et les plus matures pour traiter les besoins d'écriture d'audit et la probabilité de désactiver l'audit en faisant une mauvaise manipulation sur la configuration des logs est négligeable. Ces raisons nous amènent à utiliser <a href="http://www.slf4j.org/" title="SLF4J" >SLF4J</a> avec <a href="http://logback.qos.ch/" title="logback" >logback</a> ou <a href="http://logging.apache.org/log4j/1.2/" title="log4j" >log4j</a> pour gérer l'audit. </p>
<p>Nous encapsulerons tout de même le logger avec une couche légère <em>packagée</em> dans la librairie <a href="http://code.google.com/p/xebia-france/wiki/XebiaSpringSecurityExtras" title="Xebia Spring Security Extras" >Xebia Spring Security Extras</a> qui ajoutera au message l'identité de l'internaute et son adresse IP (via <a href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a>). Cette librairie offre une gestion déclarative de l'audit avec une annotation <code><a href="http://xebia-france.googlecode.com/svn/springframework/xebia-spring-security-extras/tags/xebia-spring-security-extras-1.1.1/src/main/java/fr/xebia/audit/Audited.java">@Audited</a></code>, son aspect associé <code><a href="http://xebia-france.googlecode.com/svn/springframework/xebia-spring-security-extras/tags/xebia-spring-security-extras-1.1.1/src/main/java/fr/xebia/audit/AuditAspect.java">AuditAspect</a></code> et une classe utilitaire <code><a href="http://xebia-france.googlecode.com/svn/springframework/xebia-spring-security-extras/tags/xebia-spring-security-extras-1.1.1/src/main/java/fr/xebia/audit/Auditor.java">Auditor</a></code>. Nous ne rentrerons pas dans le débat annotations vs. code ; dans la majeure partie des projets, nous avons pu traiter la plupart de l'audit avec une annotation et seuls quelques cas ont nécessité de passer par du code.</p>
<p><strong>Exemple de gestion de l'audit avec l'annotation <code>@Audited</code> :</strong></p>
<div class="syntax_hilite">
<div id="java-33">
<div class="java">@Audited<span style="color: #66cc66;">&#40;</span>message = <span style="color: #ff0000;">"transferMoney(#{args[0].accountNumber}, #{args[1].accountNumber}, #{args[3]})"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> transferMoney<span style="color: #66cc66;">&#40;</span>Account from, Account to, Amount amount<span style="color: #66cc66;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> BusinessException <span style="color: #66cc66;">&#123;</span> ... <span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
L'attribut <code>message</code> est un pattern supportant <a href="http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch07.html" title="Spring Expression Language" >Spring Expression Language</a> définissant l'entrée insérée dans le fichier d'audit ; la date, le nom de l'utilisateur, l'adresse ip et l'exception s'il y en a une sont ajoutés au message.</p>
<p><strong>Fragment de configuration Spring Framework pour utiliser l'annotation <code>@Audited</code> :</strong></p>
<div class="syntax_hilite">
<div id="xml-34">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;beans</span> ...<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;aop</span>:aspectj-autoproxy<span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"fr.xebia.audit.AuditAspect"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp;...<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/beans<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
<p><strong>Message d'audit généré :</strong></p>
<div class="syntax_hilite">
<div id="java-35">
<div class="java">... <span style="color: #006600;">transferMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">000652584515</span>, <span style="color: #cc66cc;">0000684651684</span>, <span style="color: #cc66cc;">187</span>.<span style="color: #cc66cc;">53</span><span style="color: #66cc66;">&#41;</span> by bdupont coming from <span style="color: #cc66cc;">192</span>.<span style="color: #cc66cc;">168</span>.<span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">14</span><br />
... <span style="color: #006600;">transferMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">000652584515</span>, <span style="color: #cc66cc;">0000684651684</span>, <span style="color: #cc66cc;">666666</span>.<span style="color: #cc66cc;">00</span><span style="color: #66cc66;">&#41;</span> threw <span style="color: #ff0000;">'...BusinessException: debit amount greater than account balance'</span> <br />
&nbsp; &nbsp;by bdupont coming from <span style="color: #cc66cc;">192</span>.<span style="color: #cc66cc;">168</span>.<span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">14</span></div>
</div>
</div>
<p></p>
<p><strong>Exemple de gestion de l'audit avec l'utilitaire <a href="http://xebia-france.googlecode.com/svn/springframework/xebia-spring-security-extras/tags/xebia-spring-security-extras-1.1.1/src/main/java/fr/xebia/audit/Auditor.java" title="Auditor" ><code>Auditor</code></a> :</strong></p>
<div class="syntax_hilite">
<div id="java-36">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> transferMoney<span style="color: #66cc66;">&#40;</span>...<span style="color: #66cc66;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> BusinessException <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp;...<br />
&nbsp; &nbsp;<span style="color: #006600;">Auditor</span>.<span style="color: #006600;">audit</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"Tranfer '"</span> + amount + <span style="color: #ff0000;">"' from "</span> + fromAccount + <span style="color: #ff0000;">" to "</span> + toAccount<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p><strong>Message d'audit généré :</strong></p>
<div class="syntax_hilite">
<div id="java-37">
<div class="java">... <span style="color: #006600;">Transfer</span> <span style="color: #ff0000;">'187.53 euros'</span> from Account<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">000652584515</span><span style="color: #66cc66;">&#93;</span> to Account<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0000684651684</span><span style="color: #66cc66;">&#93;</span> by bdupont coming from <span style="color: #cc66cc;">192</span>.<span style="color: #cc66cc;">168</span>.<span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">14</span></div>
</div>
</div>
<p></p>
<p>L'entrée d'audit est ajoutée dans un fichier d'audit géré par le logger spécifique <code>"fr.xebia.audit"</code> (<a href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="voir cet article" >voir cet article</a> pour la configuration du logger).</p>
<h4><a name="Intgrationduframeworkdansuneap"></a>Intégration du framework dans une application</h4>
<p>Ce framework peut être intégré de différentes façons dans une application :</p>
<ul>
<li>Intégration Maven :
<div class="syntax_hilite">
<div id="xml-38">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;project</span> ...<span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dependencies<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <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; &nbsp; &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>fr.xebia.springframework<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; &nbsp; &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>xebia-spring-security-extras<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; &nbsp; &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.1.1<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 />
&nbsp; &nbsp; &nbsp; <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; &nbsp; ...<br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/dependencies<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;repositories<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;repository<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;id<span style="font-weight: bold; color: black;">&gt;</span></span></span>xebia-france-googlecode-repository<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/id<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;url<span style="font-weight: bold; color: black;">&gt;</span></span></span>http://xebia-france.googlecode.com/svn/repository/maven2/<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/url<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/repository<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/repositories<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;...<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/project<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></li>
<li>Téléchargement du jar <a href="http://xebia-france.googlecode.com/files/xebia-spring-security-extras-1.1.1.jar" title="xebia-spring-security-extras-1.1.1.jar" >xebia-spring-security-extras-1.1.1.jar</a> (<a href="http://xebia-france.googlecode.com/files/xebia-spring-security-extras-1.1.1-sources.jar" title="sources" >sources</a>).</li>
<li>En récupérant le code source disponible sous licence Open Source <a href="http://www.apache.org/licenses/LICENSE-2.0" title="Apache Software Licence 2" >Apache Software Licence 2</a> dans le repository Subversion <a href="http://xebia-france.googlecode.com/svn/springframework/xebia-spring-security-extras/trunk/" title="httpxebiafrancegooglecodecomsvnspringframeworkxebiaspringsecurityextrastrunk" >http://xebia-france.googlecode.com/svn/springframework/xebia-spring-security-extras/trunk/</a>.</li>
</ul>
<h3><a name="Stockagefichiertextevsbasededo"></a>Stockage : fichier texte vs. base de données</h3>
<p>Le stockage des entrées d'audit en base de données permet sûrement une recherche plus fine des données que sur des fichiers mais cela ajoute de la complexité (déploiement, exploitation, backup) ainsi que des risques de pannes et impacte les performances. Les approches JMS présentent des contraintes similaires et l'utilisation de systèmes de logs distants comme <a href="http://en.wikipedia.org/wiki/Rsyslog" title="rsyslog" >rsyslog</a> présentent un défi de fiabilité. Ces difficultés sont accentuées lorsqu'une application génère de gros volumes de logs (plusieurs Go/jour). </p>
<p><strong>Pour ces raisons, nous préférons stocker les messages d'audit dans un simple fichier.</strong> Les risques de saturation du système de fichiers sont <em>assez facilement</em> gérables par les équipes d'exploitation, les procédures d'archivage et de consultation très simples (<code>gzip</code>, <code>scp</code>, <code>grep</code>, etc) et il n'y a quasiment jamais de problème de performance, même avec des fichiers de quelques Go par jour. </p>
<p>Y-a-t-il un plus grand risque de perdre les données par de mauvaises manipulations ? Si une application est critique, les exploitants doivent déjà ne pas perdre les fichiers de log du système d'exploitation, des serveurs web et autres firewalls.</p>
<p>Pour la gestion des messages d'audit sous forme de fichier texte, nous aimons logback comme nous l'avons expliqué dans <a href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="Java en Production  Les fichiers de logs" >Java en Production - Les fichiers de logs</a> mais il est aussi possible d'utiliser Log4j.</p>
<p>Exemple de configuration Logback pour gérer les messages d'audit émis sur le logger <code>fr.xebia.audit</code> :</p>
<div class="syntax_hilite">
<div id="xml-39">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;appender</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"audit-file"</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"ch.qos.logback.core.rolling.RollingFileAppender"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;file<span style="font-weight: bold; color: black;">&gt;</span></span></span>${LOGS_FOLDER}/my-application-audit.log<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/file<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;rollingPolicy</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- rotate every day --&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;fileNamePattern<span style="font-weight: bold; color: black;">&gt;</span></span></span>/my-application-audit.%d{yyyyMMdd-HHmm}.log.zip<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/fileNamePattern<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;/rollingPolicy<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;encoder<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- don't output the date or the logger name because the auditing framework handles this --&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;pattern<span style="font-weight: bold; color: black;">&gt;</span></span></span>%m %throwable{0}%n<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/pattern<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;/encoder<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/appender<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- route the 'fr.xebia.audit' log messages to the audit-file --&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;logger</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"fr.xebia.audit"</span> <span style="color: #000066;">additivity</span>=<span style="color: #ff0000;">"false"</span> <span style="color: #000066;">level</span>=<span style="color: #ff0000;">"TRACE"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;appender</span>-ref <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">"audit-file"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/logger<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
<p>Exemple équivalent avec log4j (le <code>EnhancedPatternLayout</code> requiert log4j 1.2.16) :</p>
<div class="syntax_hilite">
<div id="java-40">
<div class="java">log4j.<span style="color: #006600;">appender</span>.<span style="color: #006600;">auditfile</span>=org.<span style="color: #006600;">apache</span>.<span style="color: #006600;">log4j</span>.<span style="color: #006600;">DailyRollingFileAppender</span><br />
log4j.<span style="color: #006600;">appender</span>.<span style="color: #006600;">auditfile</span>.<span style="color: #006600;">datePattern</span>=<span style="color: #ff0000;">'-'</span>yyyyMMdd<br />
log4j.<span style="color: #006600;">appender</span>.<span style="color: #006600;">auditfile</span>.<span style="color: #006600;">file</span>=$<span style="color: #66cc66;">&#123;</span>catalina.<span style="color: #006600;">base</span><span style="color: #66cc66;">&#125;</span>/logs/my-application-audit.<span style="color: #006600;">log</span><br />
log4j.<span style="color: #006600;">appender</span>.<span style="color: #006600;">auditfile</span>.<span style="color: #006600;">layout</span>=org.<span style="color: #006600;">apache</span>.<span style="color: #006600;">log4j</span>.<span style="color: #006600;">EnhancedPatternLayout</span><br />
log4j.<span style="color: #006600;">appender</span>.<span style="color: #006600;">auditfile</span>.<span style="color: #006600;">layout</span>.<span style="color: #006600;">conversionPattern</span>=%m %throwable<span style="color: #66cc66;">&#123;</span><span style="color: #993333;">short</span><span style="color: #66cc66;">&#125;</span>n</p>
<p>log4j.<span style="color: #006600;">logger</span>.<span style="color: #006600;">fr</span>.<span style="color: #006600;">xebia</span>.<span style="color: #006600;">audit</span>=INFO, auditfile</div>
</div>
</div>
<p></p>
<h3><a name="Quefairedeslogsdauditaprslesav"></a>Que faire des logs d'audit après les avoir générées ?</h3>
<p>Nous ne rentrerons pas plus dans les détails de la gestion des logs d'audit après leur génération par nos applications. </p>
<p>Ce sujet complexe présente aussi bien des aspects juridiques que de confidentialité ou encore de fiabilité. Schématiquement, on n'a pas le droit de garder indéfiniment des données personnelles, il faut restreindre leur consultation et empêcher leur modification et leur destruction par accident comme par malveillance. </p>
<p>Des professionnels de l'exploitation et de la sécurité sont beaucoup plus compétents que nous sur ce sujet <img src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . </p>
<h3><a name="Pourallerplusloin"></a>Pour aller plus loin</h3>
<p>Si le traitement de l'audit dans les applications vous a intéressé, nous avons aimé lire :</p>
<ul>
<li><a href="http://itmanagement.earthweb.com/columns/article.php/3578916/The-Importance-of-Audit-Logs.htm" title="The Importance of Audit Logs" >The Importance of Audit Logs</a> par George Spafford,</li>
<li><a href="http://www.slideshare.net/anton_chuvakin/nist-80092-log-management-guide-in-the-real-world" title="NIST 800-92 Log Management Guide in the Real World" >NIST 800-92 Log Management Guide in the Real World</a> et <a href="http://www.slideshare.net/anton_chuvakin/presentations" title="lensemble des prsentations" >l'ensemble des présentations</a> de Anton Chukavin.</li>
</ul>
<h3><a name="Synthse"></a>Synthèse</h3>
<p>Nous avons vu aujourd'hui une façon simple de gérer l'audit d'applications java en reposant sur le framework de log de l'application (Logback voire Log4j) pour écrire les messages dans de simples fichiers texte avec une surcouche très légère composée d'une annotation <code>@Audited</code> et d'un utilitaire <code>Auditor</code>.</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<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'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'affaire Oracle vs Google
James Gosling revient sur l'é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'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'affaire Oracle vs Google</h4>
<p>James Gosling revient sur l'é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'é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'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'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'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'un machine virtuelle Java sur laquelle le code ne s'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'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'Oracle souhaite continuer dans cette voie mais en choisissant de sortir l'artillerie lourde pour parvenir à ses fins.</li>
</ul>
<p>Cette affaire a un effet néfaste sur l'image de Java et James Gosling, loin de cautionner l'action d'Oracle, regrette l'absence de moralité des grandes compagnies informatiques actuelles.</p>
<h4><a name="ActiveMQ"></a>ActiveMQ 5.4.0</h4>
<p>Un peu moins d'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'à maintenant pour jouer sur la priorité de certains messages sur d'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'à maintenant était lié à l'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'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'autres termes, il est possible à l'envoi du message de préciser la date réelle de l'envoi et la durée entre la répétition d'un envoi. L'interface permet même de préciser tout cela sous la forme d'une entrée CRON. Ceci peut être assez intéressant pour par exemple faire du <em>heartbeat</em> (envoi d'un message à intervalle régulier pour s'assurer du fonctionnement de l'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'émergence d'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'agit d'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'il n'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'aurait plus de support et semble figée à la version 2.2 qui date de 2008. L'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...), 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>
	</channel>
</rss>
