<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Le Blog d&#039;Akram Ben Aissi</title>
	<atom:link href="http://akrambenaissi.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://akrambenaissi.wordpress.com</link>
	<description>Le B.A BA autour de Java, JEE et d&#039;autres choses</description>
	<lastBuildDate>Tue, 07 Feb 2012 09:11:37 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='akrambenaissi.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Le Blog d&#039;Akram Ben Aissi</title>
		<link>http://akrambenaissi.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://akrambenaissi.wordpress.com/osd.xml" title="Le Blog d&#039;Akram Ben Aissi" />
	<atom:link rel='hub' href='http://akrambenaissi.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Playing with puppet: The installation</title>
		<link>http://akrambenaissi.wordpress.com/2012/01/30/playing-with-puppet-the-installation/</link>
		<comments>http://akrambenaissi.wordpress.com/2012/01/30/playing-with-puppet-the-installation/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 16:55:34 +0000</pubDate>
		<dc:creator>akrambenaisssi</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=232</guid>
		<description><![CDATA[The subject of this post may be misinterprated&#8230;.or not. To help search engines to find it more easily, the subject here is to give some tricks while using the puppet tool from www.puppetlabs.org which used to automatically administer large systems by allowing automated installations and configurations drifts detection. These functionnalities are also available on some [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=232&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The subject of this post may be misinterprated&#8230;.or not.<br />
To help search engines to find it more easily, the subject here is to give some tricks while using the puppet tool from <a href="http://www.puppetlabs.org" title="Puppet Labs">www.puppetlabs.org</a> which used to automatically administer large systems by allowing automated installations and configurations drifts detection.</p>
<p>These functionnalities are also available on some other tools, among them JBoss Operation Network (the drift feature is available since version 3.0), however puppet seems to gather of a larger adoption among the community.</p>
<p>While working at a customer, I met a sponsor so we decided to give it a large try.</p>
<p>Corporate customers often rely on a enterprise Linux distribution, and RHEL 5 is often a common guest in the party. Unfortunately, puppet is not a part of the distribution and you have to rely on the EPEL (Extra Packages for Enterprise Linux) repository to make it available for installation.<br />
To do so, simply add /etc/yum.repos.d/epel.repo with the following content:</p>
<p><pre class="brush: plain;">
[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel&amp;arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
</pre><br />
And then, perform the agent installation with:<br />
<pre class="brush: plain;">
sudo yum install puppet
sudo /etc/init.d/puppet start
</pre><br />
Fine, your puppet agent must be up and running. You can now have fun trying to write your own classes and manifest.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=232&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2012/01/30/playing-with-puppet-the-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c3642bdc40e03b643a976870254dbb6a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akrambenaisssi</media:title>
		</media:content>
	</item>
		<item>
		<title>Load testing Seam-Booking with JMeter</title>
		<link>http://akrambenaissi.wordpress.com/2011/12/02/load-testing-seam-booking-with-jmeter/</link>
		<comments>http://akrambenaissi.wordpress.com/2011/12/02/load-testing-seam-booking-with-jmeter/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 23:06:34 +0000</pubDate>
		<dc:creator>akrambenaisssi</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Qualité logicielle]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=233</guid>
		<description><![CDATA[There are some interesting  blog posts on how to do load tests of seam applications with JMeter. Since a few days, I had to train a customer in doing load tests. We had a pilot project, that already had a testable application with its own JMeter tests scripts, however, because of lack of time, the application [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=233&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There are some interesting <a title="Load testing Seam-Booking with JMeter" href="#links"> blog posts on how to do load tests</a> of seam applications with JMeter. Since a few days, I had to train a customer in doing load tests. We had a pilot project, that already had a testable application with its own JMeter tests scripts, however, because of lack of time, the application was not ready, and I had to fallback on another solution.</p>
<p>My favorite demo application is Seam Booking application which is a &#8220;bogus&#8221; Hotel Reservation Web Application developed with Seam (using JSF, Seam and Hibernate). The application is pretty and nice to use. It uses Ajax and just like all JSF applications it rely on javax.faces.viewState&#8217;s that are exchanged along pages. Because it uses Seam, there is also a &#8220;Conversation ID&#8221; that is hold from pages to others.</p>
<p><span id="more-233"></span></p>
<h1>The perfbench project</h1>
<p>I was very happy to see that an existing project is already doing as <a href="http://code.google.com/p/perfbench/wiki/HotelBookingSpecs">Seam load test through a performance comparison between presentation frameworks</a>. However, <a href="http://code.google.com/p/perfbench/source/browse/trunk/perfbench/seam-jpa/src/test/jmeter/booking.jmx">the scripts were pretty old</a>, and I performed a few modification to make them work.</p>
<h1>Adapt booking.jmx to Seam 2.2</h1>
<p>There are only minor changes, mainly on 2 pages:</p>
<ul>
<li>The main.seam page does not refer anymore to a main form, instead it is named &#8220;searchCriteria&#8221;. First step, was to modify the request&#8217;s parameters to match this new name.<a href="http://akrambenaissi.files.wordpress.com/2011/12/screen-shot-2011-12-01-at-23-30-05.png"><img class="aligncenter size-full wp-image-234" title="Screen Shot 2011-12-01 at 23.30.05" src="http://akrambenaissi.files.wordpress.com/2011/12/screen-shot-2011-12-01-at-23-30-05.png?w=630&#038;h=170" alt="" width="630" height="170" /><br />
</a></li>
<li>On book.seam page , CreditCardNameDecorate:* attributes have been renamed to creditCardNameDecorate (with a lower case c). Second step, is to rename all the form&#8217;s attributes related to this decorator.<a href="http://akrambenaissi.files.wordpress.com/2011/12/screen-shot-2011-12-01-at-23-34-10.png"><img class="aligncenter size-full wp-image-235" title="Screen Shot 2011-12-01 at 23.34.10" src="http://akrambenaissi.files.wordpress.com/2011/12/screen-shot-2011-12-01-at-23-34-10.png?w=630&#038;h=167" alt="" width="630" height="167" /></a></li>
</ul>
<h1>Missing Ajax call to validate the booking</h1>
<div>Even after performing these changes, it is impossible to make the JMeter test plan perfom correctly. It always end with the following error message:</div>
<p><pre class="brush: plain;">Caused by: javax.faces.application.ViewExpiredException: viewId:/confirm.seam - View /confirm.seam could not be restored.</pre></p>
<p>An important detail about seam, all the application&#8217;s pages submitted via a POST are followed by a redirect to avoid double submit issues. This can be confusing, because every POST leads to an HTTP 302 error: Moved temporarily. In fact, this redirect gives the location of the next page in navigation and provides the updated cid through url.</p>
<p>After investigation, using firebug and Results Tree Listeners in JMeter, I realized that the &#8220;POST booking details&#8221; step was not performing correctly. Indeed, instead of returning an HTTP 302 code like all the other posts, it was only doing a GET on a the book.seam view. Then, the confirm.seam view was failing because of an incoherent &#8220;cid&#8221;.</p>
<p>So, I finally ended to look deeper in Seam Booking Code to determine why the redirection does not occur at this time. This is due to the following code in the WEB-INF/pages.xml:</p>
<p><pre class="brush: xml;">
&lt;page view-id=&quot;/book.xhtml&quot; conversation-required=&quot;true&quot; login-required=&quot;true&quot;&gt;
  &lt;description&gt;Book hotel: #{hotel.name}&lt;/description&gt;
  &lt;navigation from-action=&quot;#{hotelBooking.setBookingDetails}&quot;&gt;
    &lt;rule if=&quot;#{hotelBooking.bookingValid}&gt;
      &lt;redirect view-id=&quot;/confirm.xhtml&quot;/&gt;
    &lt;/rule&gt;
  &lt;/navigation&gt;
&lt;/page&gt;
</pre></p>
<div>An Ajax call is probably missing in the JMeter test case that performs the hotelBooking validation. Anyway, simply commenting out the condition around the redirection solves my problem.</div>
<div><pre class="brush: xml;">
&lt;!--rule if=&quot;#{hotelBooking.bookingValid}&quot;--&gt;
  &lt;redirect view-id=&quot;/confirm.xhtml&quot;/&gt;
&lt;!--/rule--&gt;
</pre></p>
</div>
<p><a name="links"></a><br />
Finally, here is <a href="http://code.google.com/p/seam-booking-jmeter-test-plan/source/browse/SeamBookingTestPlan.jmx">the resulting booking.jmx file to load test Seam Booking.</a></p>
<h1>Interesting links</h1>
<p><a href="http://kalgtech.blogspot.com/2009/10/load-testing-seam-application-using.html">http://kalgtech.blogspot.com/2009/10/load-testing-seam-application-using.html<br />
</a><a href="http://ptrthomas.wordpress.com/2009/01/14/seam-jsf-vs-wicket-performance-comparison/">http://ptrthomas.wordpress.com/2009/01/14/seam-jsf-vs-wicket-performance-comparison/<br />
</a><a href="http://ptrthomas.wordpress.com/2009/09/14/perfbench-update-tapestry-5-and-grails/">http://ptrthomas.wordpress.com/2009/09/14/perfbench-update-tapestry-5-and-grails/<br />
</a><a href="http://seamframework.org/Community/JMeterSeamCidProblem">http://seamframework.org/Community/JMeterSeamCidProblem<br />
</a><a href="http://blog.milamberspace.net/index.php/jmeter-pages/jmeter-test-de-charges-dun-site-web-mode-demploi/jmeteriser-son-scenario-fonctionnel">http://blog.milamberspace.net/index.php/jmeter-pages/jmeter-test-de-charges-dun-site-web-mode-demploi/jmeteriser-son-scenario-fonctionnel</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/233/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=233&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2011/12/02/load-testing-seam-booking-with-jmeter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c3642bdc40e03b643a976870254dbb6a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akrambenaisssi</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/12/screen-shot-2011-12-01-at-23-30-05.png" medium="image">
			<media:title type="html">Screen Shot 2011-12-01 at 23.30.05</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/12/screen-shot-2011-12-01-at-23-34-10.png" medium="image">
			<media:title type="html">Screen Shot 2011-12-01 at 23.34.10</media:title>
		</media:content>
	</item>
		<item>
		<title>Une méthode de 1000 lignes ou 100 méthodes de 10 lignes ?</title>
		<link>http://akrambenaissi.wordpress.com/2011/07/05/une-methode-de-1000-lignes-ou-100-methodes-de-10-lignes/</link>
		<comments>http://akrambenaissi.wordpress.com/2011/07/05/une-methode-de-1000-lignes-ou-100-methodes-de-10-lignes/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 22:17:00 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Méthodologie de projet]]></category>
		<category><![CDATA[Qualité logicielle]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=181</guid>
		<description><![CDATA[La réponse à cette question est évidement: 100 méthodes de 10 lignes &#8230; Nombre de lignes de code ou LoC Parmi les métriques de bases de la qualité logicielle, s&#8217;il y&#8217;en a une bien qui est vraiment LA métrique de base, c&#8217;est le nombre de ligne de codes. On ne va pas expliquer ici comment [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=181&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La réponse à cette question est évidement: 100 méthodes de 10 lignes &#8230;</p>
<h2>Nombre de lignes de code ou LoC</h2>
<p>Parmi les métriques de bases de la qualité logicielle, s&#8217;il y&#8217;en a une bien qui est vraiment LA métrique de base, c&#8217;est le nombre de ligne de codes. On ne va pas expliquer ici comment on calcule ce nombre, Wikipedia en anglais contient une page LoC (Lines of Code) sur le sujet.</p>
<p>Le nombre de ligne de codes d&#8217;un projet, d&#8217;une application, d&#8217;une classe ou d&#8217;une méthode est une métrique intéressante pour évaluer la complexité de chacun de ces éléments.</p>
<p>Le mot &#8220;évaluer&#8221; est délibérément choisi, car effectivement ce n&#8217;est qu&#8217;une évaluation et non pas une vision exacte de cette complexité, néanmoins c&#8217;est un indicateur  convenable. Ceci n&#8217;est pas du à la précision du calcul, mais au fait que la complexité, comme la simplicité ou l&#8217;intelligibilité sont des critères subjectifs et donc difficilement quantifiables.<span id="more-181"></span></p>
<p>Un exemple simple pour démontrer cela. Prenons le code Java suivant que l&#8217;on va nommer code A:</p>
<p><pre class="brush: plain;">
 int i = 0;
 System.out.println(&quot;ligne &quot; + i);
 i++;
 System.out.println(&quot;ligne &quot; + i);
 i++;
 System.out.println(&quot;ligne &quot; + i);
 i++;
</pre></p>
<p>Et ce code ci que l&#8217;on nomme code B:</p>
<p><pre class="brush: plain;">
 for( int i = 0; i &lt; 3;i++) {
 System.out.println(&quot;ligne &quot; + i);
 }
</pre></p>
<p>Bien que ces deux codes fassent la même chose, et que le code B comporte moins de lignes que le code A, d&#8217;un point de vue intellectuel, le code B est plus complexe que le code A. Pour vous en convaincre, rappelez-vous que lorsque vous avez appris à programmer, vous avez d&#8217;abord appris ce qu&#8217;était une instruction, puis une série d&#8217;instructions, puis une boucle.</p>
<p>Je ne parle pas ici d&#8217;une autre métrique qui est la Complexité Cyclomatique, que l&#8217;on développera dans un autre article, mais purement de complexité au sens intellectuel du terme. Cette même complexité qui est proportionnelle à l&#8217;effort de réflexion ou de conceptualisation nécessaire à la compréhension d&#8217;un raisonnement, d&#8217;un algorithme et par extension d&#8217;un code.</p>
<p>Évidemment, cet exemple est un cas extrême, et si votre application ne ressemblait qu&#8217;à des successions de lignes identiques (du copier coller du code A), il y&#8217;aurait probablement un sérieux problème. Dans la majorité des cas, votre application ressemble plutôt à une succession ou à un enchevêtrement du code B avec en plus des tests (instructions if, else, switch/case, etc&#8230;), des appels de méthodes, de l&#8217;introspection et tout un tas d&#8217;autres choses assez complexe à appréhender.</p>
<p>Globalement, le nombre d&#8217;instructions et donc de lignes va en croissant avec la complexité de ce qui est développé.</p>
<h2>Revenons à notre sujet : La méthode de 1000 lignes</h2>
<p>Récemment, j&#8217;avais une discussion intéressante avec un chef de projet technique qui a pas mal travaillé sur une application grandissante et vieillissante et qui était confronté à des problématiques de méthodes de plus de 700 lignes, voire 1000 lignes. Il va sans dire que la maintenance était éprouvante.</p>
<p>Les méthodes en question réalisaient les écritures comptables des transactions journalières d&#8217;une application d&#8217;encaissement et de facturation. Cette application était soumise à de nombreuses évolutions de ses règles de calcul, notamment du fait de l&#8217;existence de &#8220;promotions&#8221; et de &#8220;barèmes dérogatoires&#8221;. Si bien qu&#8217;au bout d&#8217;un temps, les méthodes qui réalisaient le calcul étaient criblées de portions de code de ce type:</p>
<p><pre class="brush: plain;">
if( je suis dans ce cas) {
  +20 lignes de code
}
</pre></p>
<p>Les méthodes ont rapidement atteint plusieurs centaines de lignes, dépassant parfois le millier.<br />
Ce à quoi j&#8217;ai répondu simplement:</p>
<blockquote><p>- Il suffit de remplacer &#8220;+20 lignes de code&#8221; par une méthode privée au sein de ta classe.<br />
- Oui, mais au final la classe fera toujours plus de 1000 lignes et sa taille continuera de croître.<br />
- C&#8217;est vrai, mais il vaut mieux avoir 100 méthodes de 10 lignes que 10 méthodes de 100 lignes ou pire une méthode de 1000 lignes</p></blockquote>
<p>A ce niveau là, il y&#8217;a deux points de vues:</p>
<blockquote><p>- Effectivement on aura toujours +1000 lignes donc autant laisser comme ça</p></blockquote>
<p>et dans ce cas, la lecture de cet article ne devrait plus vous intéresser. Ou alors</p>
<blockquote><p>- 100 méthodes de 10 lignes, on peut mieux faire et améliorer encore cette classe en la découpant en plusieurs classes</p></blockquote>
<p>Pour ceux qui sont en accord avec le premier point de vue voici tout de même quelques arguments pour finir de vous convaincre et vous rallier à la cause de la qualité logicielle. Pour les autres, vous pouvez passer à la conclusion.</p>
<h2>Les numéros de téléphone ne dépassent pas 10 chiffres</h2>
<p>Cette affirmation est vraie pour la quasi totalité des pays et lorsque ce n&#8217;est pas le cas, il existe une numérotation locale qui permet de descendre en dessous de ce nombre.</p>
<h3>Nous ne sommes pas tous rainman</h3>
<p>La raison à cela se trouve entre nos deux oreilles. Généralement, notre mémoire à court terme ne retient qu&#8217;un nombre restreint d&#8217;éléments (entre 7 et 10). C&#8217;est cette mémoire que nous utilisons dans des tâches qui nécessitent de la concentration ou de la conceptualisation. Comme c&#8217;est le cas de manière intensive lorsqu&#8217;on programme une application informatique.</p>
<p>Au delà, on entre dans un processus de mémorisation à plus long terme basé sur de la matérialisation d&#8217;idées plus que sur des faits. Comme c&#8217;est le cas lorsqu&#8217;on lit un roman: On ne retient pas toutes les pages et toutes les actions, mais on mémorise et construit globalement l&#8217;histoire. Ce qui est sujet à l&#8217;imagination et non pas à la mémorisation. C&#8217;est ce qui fait d&#8217;ailleurs qu&#8217;un même lecteur  peut lire plusieurs fois un même extrait et le percevoir de manière comme  différente.<br />
La lecture d&#8217;une méthode de plusieurs centaines de lignes s&#8217;apparente davantage à ce processus ce qui fait que le développeur perds en concentration et en précision.</p>
<h3>Mémoriser peu, retenir beaucoup</h3>
<p>Dans le cas contraire, la mémorisation de 7 verbes ordonnés ne pose généralement aucun problème à la plupart des individus. C&#8217;est encore plus simple si il existe un ordre &#8220;logique&#8221; entre ces verbes: Par exemple:</p>
<p><pre class="brush: plain;">
se lever
se laver
s'habiller
manger
partir travailler
rentrer chez soi
dormir
</pre></p>
<p>Il est ensuite possible d&#8217;entrer dans le détail de chacun de ses verbes, je peux par exemple détailler en 7 actions le fait de &#8220;se laver&#8221; ou tout autre action. Ce qui me permettrait par exemple de définir et de retenir un enchaînement de 49 actions. Tout en ne travaillant que sur des unités de travail facilement mémorisables.</p>
<h3>Diviser pour mieux régner</h3>
<p>Ces simples constats vont dans le sens d&#8217;une simplification des méthodes au sein de la classe: Il suffit de penser à découper les actions d&#8217;une méthode au sein d&#8217;actions plus petites et des les invoquer dans un ordre logique.<br />
De cette façon, la lecture de la méthode est plus facile puisqu&#8217;elle s&#8217;apparente une mémorisation d&#8217;actions courtes. Les anomalies présentes sont alors plus faciles à détecter. Pour reprendre notre exemple, imaginez la suite suivante:</p>
<p><pre class="brush: plain;">
se lever
dormir
se laver
s'habiller
manger
partir travailler
rentrer chez soi
</pre></p>
<p>L&#8217;anomalie saute aux yeux, alors que si j&#8217;avais donné la séquence des 49 actions, elle serait bien plus difficille à détecter.</p>
<h2>La qualité logicielle: un travail de fond</h2>
<p>Le nombre de lignes d&#8217;une méthode est la métrique de base qui permet de s&#8217;attaquer à des problèmes de maintenabilité du code. Il ne faut pas perdre de vue le fait qu&#8217;il s&#8217;agit de la première métrique, celle qui va aider à poser les jalons de l&#8217;amélioration continue de la qualité.</p>
<p>Parmi ces jalons, les plus importants sont:<br />
- La réduction du nombre de lignes de code dans une classe<br />
- La réduction du manque de cohésion d&#8217;une classe (trop d&#8217;attributs dans une classe et les méthodes de la classe n&#8217;accède qu&#8217;à peu d&#8217;attributs)<br />
- La réduction de la complexité cyclomatique</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/181/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/181/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/181/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/181/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/181/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/181/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/181/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/181/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=181&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2011/07/05/une-methode-de-1000-lignes-ou-100-methodes-de-10-lignes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a1c3682fe7845f0a251a2f60451e295?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Akram</media:title>
		</media:content>
	</item>
		<item>
		<title>Leçon d&#8217;humilité: Balayer devant sa porte ou la découverte du bug du Pentium</title>
		<link>http://akrambenaissi.wordpress.com/2011/07/05/lecon-dhumilite-balayer-devant-sa-porte-ou-la-decouverte-du-bug-du-pentium/</link>
		<comments>http://akrambenaissi.wordpress.com/2011/07/05/lecon-dhumilite-balayer-devant-sa-porte-ou-la-decouverte-du-bug-du-pentium/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 14:55:43 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Méthodologie de projet]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=176</guid>
		<description><![CDATA[Ca ne fonctionne pas, c&#8217;est la faute à l&#8217;autre Dans mon travail, j&#8217;entends souvent: Ce n&#8217;est pas ma faute, il y&#8217;a une anomalie dans le service, il ne retourne pas les bonnes données. Ou encore il y&#8217;a un bug dans le framework. Ou plus rarement, mais c&#8217;est arrivé, c&#8217;est un bug de la JVM ou [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=176&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Ca ne fonctionne pas, c&#8217;est la faute à l&#8217;autre</h2>
<p>Dans mon travail, j&#8217;entends souvent: Ce n&#8217;est pas ma faute, il y&#8217;a une anomalie dans le service, il ne retourne pas les bonnes données. Ou encore il y&#8217;a un bug dans le framework.<br />
Ou plus rarement, mais c&#8217;est arrivé, c&#8217;est un bug de la JVM ou de Spring ou de Hibernate.</p>
<p>C&#8217;est souvent plus facile d&#8217;accuser quelqu&#8217;un d&#8217;autre, parfois même ça peut rendre service. Mais face à ce genre de situation, dans 99,9999% des cas, le problème provient de ce qui se trouve entre le clavier et l&#8217;écran: Le développeur (en l&#8217;occurence moi).</p>
<h2>Comment s&#8217;y prendre</h2>
<p>En fait, ce genre de situation me rappelle une anecdote que j&#8217;avais entendu quand j&#8217;étais encore sur les bancs du cours de Génie Logiciel (en école d&#8217;ingénieurs), qui concerne la façon dont a été découvert le bug du Pentium.<span id="more-176"></span></p>
<p>Si vous recherchez un peu sur le net, il y&#8217;a des articles qui parlent profondeur des tenants et des aboutissants de cette histoire, mais l&#8217;idée ici est surtout de décrire la démarche du mathématicien américain Thomas Nicely, de l&#8217;université Lynchburg (Virginie).</p>
<p>Ce mathématicien travaillait sur la suite numérique qui additionne les inverses des nombres premiers jumeaux (nombre premiers dont la différence vaut 2, exemple, 5 et 7 , 11 et 13, etc&#8230;). Le début du la suite est (1/3 + 1/5) + (1/5 + 1/7) etc&#8230; .</p>
<p>Autant dire qu&#8217;il s&#8217;agit d&#8217;un sujet pointu et précis et que notre expert connait bien son domaine, il faut dire que la valeur de cette suite ne change pas. Il possédait alors des tables contenant la valeur de cette suite. Et biensûr, il avait établi des algorithmes et développé des programmes permettant de réaliser ces calculs.</p>
<p>En 1994, il reçoit un nouvel ordinateur équipé d&#8217;un processeur révolutionnaire, lui permettant d’approfondir son étude. Il s&#8217;empresse de recompiler ses programmes pour ce processeur et les executent avant de s&#8217;apercevoir de différences entre les valeurs de ses tables et celle retournées par ses programmes.</p>
<p>Il commence alors par vérifier ses tables, refait les calculs et valide ses résultats. Tout est correct, ses résultats sont bons.<br />
Il reverifie alors ses algorithmes, les écrits dans un autre langage, et obtiens des résultats incorrects sur ce processeur.<br />
Il décortique alors le compilateur afin de rechercher une anomalie dans ce dernier et toujours rien.<br />
Il met alors finalement en cause le processeur et démontre que l&#8217;unité de division de calcul flottant contient effectivement un bug.</p>
<h2>La morale de l&#8217;histoire</h2>
<p>Avant de rejeter la faute sur quelqu&#8217;un d&#8217;autre, je m&#8217;assure toujours que l&#8217;erreur ne vient pas de moi et de ce que j&#8217;ai fait. Aujourd&#8217;hui, c&#8217;est encore plus simple de s&#8217;en assurer avec tous les outils à ma disposition. Voici les quelques pratiques que j&#8217;utilise et qui m&#8217;aide à faire celà dans mon travail:</p>
<ul>
<li>Les tests unitaires automatisés et tous les frameworks de tests unitaires</li>
<li>Le mode debug (et remote debug, on l&#8217;oublie souvent celui-là) de mon IDE</li>
<li>Les sources des frameworks (ou de la VM) que j&#8217;utilise, non pas pour les incriminer mais pour comprendre ce que j&#8217;ai fait d&#8217;incorrect</li>
<li>La documentation de reference et les API</li>
</ul>
<div>Et biensûr, la <a href="http://interstices.info/jcms/c_5737/les-lecons-dun-algorithme-delinquant">petite histoire de ce mathématicien perseverant qui est aussi reprise dans cette page.</a></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=176&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2011/07/05/lecon-dhumilite-balayer-devant-sa-porte-ou-la-decouverte-du-bug-du-pentium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a1c3682fe7845f0a251a2f60451e295?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Akram</media:title>
		</media:content>
	</item>
		<item>
		<title>Le plugin Sonar PHP</title>
		<link>http://akrambenaissi.wordpress.com/2011/02/23/le-plugin-sonar-php/</link>
		<comments>http://akrambenaissi.wordpress.com/2011/02/23/le-plugin-sonar-php/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 13:43:45 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Qualité logicielle]]></category>
		<category><![CDATA[Sonar]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=116</guid>
		<description><![CDATA[Vous savez, peut-être, qu&#8217;en plus de m&#8217;interresser à Sonar, je suis impliqué dans le développement d&#8217;un plugin pour la plateforme Sonar. Un plugin et demi, si on compte le commit sur le plugin twitter . Du PHP dans Sonar Vous l&#8217;aurez compris, il s&#8217;agit plugin PHP pour Sonar. Depuis Sonar 2.1, il est en effet [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=116&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vous savez, peut-être, qu&#8217;en plus de m&#8217;interresser à Sonar, je suis impliqué dans le développement d&#8217;un plugin pour la plateforme Sonar. Un plugin et demi, si on compte le commit sur le plugin twitter <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<h1>Du PHP dans Sonar</h1>
<p>Vous l&#8217;aurez compris, il s&#8217;agit plugin PHP pour Sonar. Depuis Sonar 2.1, il est en effet possible de développer des plugins permettant à Sonar de réaliser l&#8217;analyse de la qualité du code d&#8217;applications écrites dans autre chose que du Java.</p>
<p><span id="more-116"></span></p>
<p>Le développement du plugin a commencé courant 2009 avec pour objectif de permettre aux développeurs PHP de disposer d&#8217;un outil de qualimétrie puissant et automatisable.</p>
<p>PHP étant un language ouvert,il existe déjà de nombreux outils d&#8217;analyse de qualité de code, de calcul de métriques et de détection de bugs. Dans un premier temps, l&#8217;idée consiste à s&#8217;appuyer sur ces outils.</p>
<h1>Ajouter le support d&#8217;un langage</h1>
<p>Il y&#8217;a plusieurs façon d&#8217;ajouter le support d&#8217;un nouveau langage à Sonar. La plus &#8220;intégrée&#8221; consiste à développer ou à utiliser un outil Java qui réalise l&#8217;analyse syntaxique du code (en s&#8217;appuyant par exemple sur un AST (Abstract Syntaxic Tree)), et à en faire ressortir certains nombres de métriques.</p>
<p>Une autre possibilité consiste à s&#8217;appuyer sur des outils existants et à les intégrer dans Sonar. Pour le développement de PHP Plugin, nous avons choisit la deuxième solution, principalement pour 3 raisons:</p>
<ul>
<li>Nous n&#8217;avions pas trop le temps de développer l&#8217;AST pour PHP</li>
<li>Des outils qui font déjà le boulot existent dans le monde PHP</li>
<li>Utiliser des outils connus par la communauté peut aider à l&#8217;adoption</li>
<li><img class="aligncenter size-medium wp-image-128" title="Diagramme de déploiement Sonar PHP Plugin" src="http://akrambenaissi.files.wordpress.com/2011/02/diagramme_de_dc3a9ploiement_sonar_php_plugin-e1298467282954.png?w=300&#038;h=255" alt="" width="300" height="255" /></li>
</ul>
<p>Le plugin Sonar PHP se contente, et c&#8217;est dejà pas mal, de:</p>
<ul>
<li>recueillir les informations sur le projet: emplacement des sources, des tests unitaires, identifiants et version du projet</li>
<li>construire les lignes de commande nécessaires au lancement de des outils</li>
<li>lancer l&#8217;execution de chacun des outils</li>
<li>recueillir les résultats de l&#8217;analyse au format XML</li>
<li>insérer ces données dans la base Sonar en utilisant l&#8217;API Sonar Plugins</li>
</ul>
<p>Une fois ces données receuillies et réconcilliées avec les fichiers auxquelles elle se réfère, le moteur de Sonar prends la relève et permet de réaliser le drilldown dans le tableau de bord pour aller visualiser l&#8217;état du code en détail.</p>
<h1>PHPDepend</h1>
<p>Parmi ces outils,  l&#8217;incontournable PHP Depend est capable de parser un ensemble de code PHP et d&#8217;extraire les métriques de bases qui nous permettent de construire un tableau de bord:</p>
<ul>
<li>Le nombre de ligne de code</li>
<li>Le nombre de ligne de commentaires</li>
<li>La complexité conditionnelle (ccn et eccn)</li>
<li>La profondeur d&#8217;héritage</li>
<li>Le nombre pondéré de méthode (wcm)</li>
<li>Le nombre de classes, méthodes, fonctions, &#8230;</li>
</ul>
<p>On obtient en sortie un fichier xml contenant l&#8217;ensemble de ces métriques et les artefacts (fichiers, classes, packages) auxquels ils se référent.</p>
<p><pre class="brush: xml;">
&lt;pre&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;metrics ahh=&quot;0.19444444444444&quot; andc=&quot;0.46268656716418&quot; calls=&quot;1406&quot; ccn=&quot;1203&quot; ccn2=&quot;1237&quot; cloc=&quot;11657&quot; clsa=&quot;7&quot; clsc=&quot;60&quot; eloc=&quot;6528&quot; fanout=&quot;571&quot; leafs=&quot;59&quot; loc=&quot;20078&quot; maxDIT=&quot;2&quot; ncloc=&quot;8421&quot; noc=&quot;67&quot; nof=&quot;0&quot; noi=&quot;21&quot; nom=&quot;578&quot; nop=&quot;11&quot; roots=&quot;5&quot;&gt;
  &lt;files&gt;
    &lt;file name=&quot;/usr/local/pear/PEAR/PHP/Depend/Parser.php&quot; cloc=&quot;324&quot; eloc=&quot;534&quot; loc=&quot;997&quot; ncloc=&quot;673&quot;/&gt;
    &lt;file name=&quot;/usr/local/pear/PEAR/PHP/Depend/StorageRegistry.php&quot; cloc=&quot;81&quot; eloc=&quot;18&quot; loc=&quot;103&quot; ncloc=&quot;22&quot;/&gt;
  &lt;/files&gt;
</pre></p>
<p>class=&#8221;aligncenter size-medium wp-image-128&#8243;z</p>
<p>Le plugin Sonar PHP receuille ensuite les informations contenues dans ce fichier et les insère dans la base de données Sonar. En sortie on obtient un tableau de bord Sonar dont voici quelques copies d&#8217;écrans.</p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-111.png?w=300"><img class="size-medium wp-image-150 alignnone" title="Dashboard Sonar" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-111.png?w=300&#038;h=213" alt="" width="300" height="213" /></a><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-50.png"><img class="alignnone size-medium wp-image-139" title="Quelques métriques" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-50.png?w=300&#038;h=226" alt="" width="300" height="226" /></a></p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-111.png?w=150"></a></p>
<h1>PHPUnit</h1>
<p>PHPUnit est un framework de tests unitaires automatisés pour PHP. C&#8217;est l&#8217;équivalent de <a class="zem_slink" title="JUnit" rel="homepage" href="http://junit.sourceforge.net">JUnit</a> (ou <a class="zem_slink" title="TestNG" rel="wikipedia" href="http://en.wikipedia.org/wiki/TestNG">Testng</a>) en Java. Il permet de lancer les tests unitaires, fournit une API d&#8217;assertion et permet d&#8217;extraire des métriques, des rapports d’exécution et de taux de couverture du code testé, là encore au format XML. Sonar PHP fait le même travail de pilotage et d&#8217;aggrégation des résultats, mais sur des métriques différentes telles que le nombre de tests, le taux de couverture, les statistiques d&#8217;echec et de succès des tests.</p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-27.png"><img class="alignnone size-thumbnail wp-image-143" title="Nombres de tests unitaires et couverture de code" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-27.png?w=150&#038;h=52" alt="" width="150" height="52" /></a><img class="alignnone size-thumbnail wp-image-138" title="La couverture de code en détails" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-31-22.png?w=150&#038;h=45" alt="" width="150" height="45" /><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-36.png"><img class="alignnone size-thumbnail wp-image-146" title="Les tests unitaires en détails" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-36.png?w=150&#038;h=127" alt="" width="150" height="127" /></a><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-12.png"><img class="alignnone size-thumbnail wp-image-145" title="La couverture des tests unitaires en détails" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-12.png?w=150&#038;h=121" alt="" width="150" height="121" /></a></p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-27.png"></a></p>
<h1>PHP CodeSniffer</h1>
<p>Code Sniffer est un moteur de détection de violation qui s&#8217;appuie sur des clases PHP appellées &#8220;Sniff&#8221; et qui parcourent des éléments de code afin de détecter des violations. Il s&#8217;appuie sur des rulesets qui définissent l&#8217;ensemble des règles disponibles. La force de l&#8217;outils réside dans le fait qu&#8217;il référence plus de 400 contrôles qualité.  L&#8217;utilisateur a même la possibilité d&#8217;enrichir ces règles avec des nouveaux contrôles. Ou au contraire être le limiter à certaines règles.</p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-36.png"><img class="alignnone size-medium wp-image-144" title="Le widget des violations" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-36.png?w=300&#038;h=105" alt="" width="300" height="105" /></a><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-12.png"><img class="alignnone size-medium wp-image-145" title="Quelques violations détectées par PHP_CodeSniffer" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-12.png?w=300&#038;h=243" alt="" width="300" height="243" /></a></p>
<p>L&#8217;intégration de CodeSniffer dans Sonar PHP est plus la plus avancée puisqu&#8217;il est possible d&#8217;intégrer des rulesets personnalisés simplement en les packageant et les copiant dans le repertoire  $SONAR_HOME/extensions/rules. Et une évolution important prévue dans la version 0.4 permettra de ne lancer que les règles choisies par l&#8217;utilisateur afin d&#8217;améliorer les temps de construction du dashboard.</p>
<h1>PHP Mess Detector, PHP Cpd et les autres&#8230;</h1>
<p>Deux autres outils s&#8217;ajoutent aux précédents:</p>
<ul>
<li>PHPCpd (Copy Paste Detector) fournit des métriques sur le taux de duplication de code : Le copier/coller</li>
<li>PHPMD est un autre moteur de détection de bug qui réalise aujourd&#8217;hui avec une vingtaine de contrôle sur le design, le nommage ou la taille des classes ou méthodes</li>
</ul>
<p><img class="alignnone size-thumbnail wp-image-148" title="Le détails du code dupliqué" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-30-49.png?w=150&#038;h=109" alt="" width="150" height="109" /><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-19.png"><img class="alignnone size-thumbnail wp-image-142" title="La distribution de la complexité conditionnelle" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-19.png?w=150&#038;h=67" alt="" width="150" height="67" /></a><a href="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-30-39.png"><img class="alignnone size-thumbnail wp-image-147" title="Le copié/collé en détail" src="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-30-39.png?w=150&#038;h=116" alt="" width="150" height="116" /></a></p>
<p>A ces outils d&#8217;autres peuvent venir s&#8217;ajouter. Mais pour le moment, nous nous concentrons davantage sur l&#8217;intégration au sein d&#8217;outils de build ou d&#8217;intégration continue.</p>
<h1>Conclusion</h1>
<p>L&#8217;objectif de cette article était de présenter le fonctionnement et d&#8217;avoir un aperçu des fonctionnalités du plugin Sonar PHP. Voici quelques liens où l&#8217;ont peut trouver davantage d&#8217;informations sur Sonar ou de la domaine de qualité logicielle, et sur le plugin bien évidement.</p>
<p><a href="http://docs.codehaus.org/display/SONAR/PHP+Plugin">La documentation du plugin sur codehaus</a></p>
<p><a href="http://docs.codehaus.org/display/SONAR/Additional+Languages">Le site de la forge sonarsource.org</a></p>
<p><a href="http://docs.codehaus.org/display/SONAR/How+Sonar+PHP+Plugin+works">Des détails sur le fonctionnement et la configuration du plugin</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/116/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=116&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2011/02/23/le-plugin-sonar-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b3d14b8c5e59ea0acf5cb070243fc9a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akramba</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/diagramme_de_dc3a9ploiement_sonar_php_plugin-e1298467282954.png?w=300" medium="image">
			<media:title type="html">Diagramme de déploiement Sonar PHP Plugin</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-111.png?w=300" medium="image">
			<media:title type="html">Dashboard Sonar</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-27-50.png?w=300" medium="image">
			<media:title type="html">Quelques métriques</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-27.png?w=150" medium="image">
			<media:title type="html">Nombres de tests unitaires et couverture de code</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-31-22.png?w=150" medium="image">
			<media:title type="html">La couverture de code en détails</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-36.png?w=150" medium="image">
			<media:title type="html">Les tests unitaires en détails</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-12.png?w=150" medium="image">
			<media:title type="html">La couverture des tests unitaires en détails</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-36.png?w=300" medium="image">
			<media:title type="html">Le widget des violations</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-29-12.png?w=300" medium="image">
			<media:title type="html">Quelques violations détectées par PHP_CodeSniffer</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-30-49.png?w=150" medium="image">
			<media:title type="html">Le détails du code dupliqué</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-28-19.png?w=150" medium="image">
			<media:title type="html">La distribution de la complexité conditionnelle</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/02/ss-2011-02-23-13-30-39.png?w=150" medium="image">
			<media:title type="html">Le copié/collé en détail</media:title>
		</media:content>
	</item>
		<item>
		<title>Qualité de code avec Sonar</title>
		<link>http://akrambenaissi.wordpress.com/2011/01/10/qualite-de-code-avec-sonar/</link>
		<comments>http://akrambenaissi.wordpress.com/2011/01/10/qualite-de-code-avec-sonar/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 22:41:06 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Qualité logicielle]]></category>
		<category><![CDATA[Sonar]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=71</guid>
		<description><![CDATA[J&#8217;ai entendu parlé de Sonar pour la première fois en 2008. Je travaillais alors comme consultant pour un éditeur de logiciel spécialisé dans le domaine de la qualité logicielle et de l&#8217;Application Intelligence. A l&#8217;époque, Sonar commençait tout juste à être connu mais n&#8217;était perçu encore que comme un agrégateur de résultats d&#8217;analyse fournis par [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=71&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div>
<p>J&#8217;ai entendu parlé de Sonar pour la première fois en 2008. Je travaillais alors comme consultant pour un éditeur de logiciel spécialisé dans le domaine de la qualité logicielle et de l&#8217;Application Intelligence. A l&#8217;époque, Sonar commençait tout juste à être connu mais n&#8217;était perçu encore que comme un agrégateur de résultats d&#8217;analyse fournis par différents outils.Courant 2008, je réalise une étude comparative pour le client pour qui je travaille, et là, je me rends réellement compte qu&#8217;il s&#8217;agit d&#8217;une solution crédible pour l&#8217;audit de code et pour l&#8217;inspection continue. La grande différence avec les outils avec lesquels je travaille chaque jour et la réelle automatisation et l&#8217;extensibilité.<span id="more-71"></span></p>
<h2>Comment que ça marche?</h2>
<p>Le principe de fonctionnement de Sonar est simple. Les concepteurs ont eu la bonne intuition de s&#8217;appuyer maven qui est aujourd&#8217;hui un outil largement répandu dans le monde de l&#8217;intégration continue Java. En une simple ligne de commande, on réalise les contrôles qualités de son application et on dispose de tableaux de bords qui fournissent des indicateurs quantitatifs et qualitatifs sur le code source analysé.</p>
<p>C&#8217;est là qu&#8217;entre jeu le deuxième pilier de l&#8217;architecture de sonar: Le serveur Sonar qui héberge les différents widget sonar, les profils qualité, la base de données des règles, des mesures et des violations, les plugins additionnels et enfin l&#8217;API Sonar qui permet d&#8217;enrichir le produit avec des nouvelles fonctionnalités.</p>
<p style="text-align:left;"><a href="http://akrambenaissi.files.wordpress.com/2011/01/how-sonar-works1.png"><img class="aligncenter size-full wp-image-76" title="Fonctionnement de Sonar" src="http://akrambenaissi.files.wordpress.com/2011/01/how-sonar-works1.png?w=630" alt="Fonctionnement de Sonar"   /></a></p>
<p style="text-align:left;">Comme le montre le schéma (issue d&#8217;une présentation de Sonar), Sonar est au départ prévu pour effectuer de l&#8217;analyse de code Java. Il s&#8217;appuie sur des outils bien connus du monde Java: PMD, Checkstyle, Findbugs, Surefire, Cobertura, etc&#8230; Le projet connait de nombreuses évolutions notamment au niveau des plugins de présentation des différentes violations présentes au sein de l&#8217;application analysée: Timeline, Technical Debt, Squid ou Views.</p>
<h2>L&#8217;API Sonar et le support d&#8217;autres langages</h2>
<p>L&#8217;API Sonar permet d&#8217;étendre les fonctionnalités du produit de deux manières différentes. Sous la forme d&#8217;extensions batch side et server side.</p>
<ul>
<li>Les extensions batch side sont celles qui s&#8217;executent au sein du plugin maven de sonar. C&#8217;est le cas par exemple des plugins qui d&#8217;analyse d&#8217;autres langages</li>
<li>Les extensions server side s&#8217;executent côté server Sonar. C&#8217;est le cas des extensions web services, ou des widget additionnels</li>
</ul>
<p>L&#8217;équipe Sonar a mis à disposition une forge logicielle hébergée sur codehaus pour les développeurs qui désirent s&#8217;impliquer dans le développement de plugin. Le point d&#8217;entrée est la page suivante: <a href="http://docs.codehaus.org/display/SONAR/Coding+a+plugin">http://docs.codehaus.org/display/SONAR/Coding+a+plugin</a></p>
<p>Depuis la version 1.5, le support d&#8217;autres langages est possible. Mais ce n&#8217;est qu&#8217;avec la version 2.0 qu&#8217;arrivent réellement des plugins pour le support d&#8217;autres langages de programmation: Flex (ActionScript), C, Cobol, PL/SQL, VisualBasic, .Net et PHP. L&#8217;API Sonar Plugins évolue au cours de l&#8217;année 2010 en version 2.2 et casse la compatibilité avec les versions précédentes mais introduit de nouvelles possibilités.</p>
<p style="text-align:left;">Le développement de plugin pour la plateforme est grandement simplifié par l&#8217;utilisation d&#8217;archetype et l&#8217;utilisation de maven pour lancer un serveur sonar automatiquement téléchargé et initialisé.</p>
<h2>Installer maven</h2>
<p style="text-align:left;">Maven est un outils permettant de compiler, construire, packager et livrer des projets en faisant de l&#8217;intégration continue. Il s&#8217;appuie sur les notions de</p>
<ul>
<li>repository (dépôt) de binaires qui est un répertoire sur la machine locale sur laquelle les binaires (jar, war, zip, etc..) sont téléchargés et copiés pour une utilisation pour la compilation d&#8217;application en local</li>
<li>repository distant qui est un dépôt de binaire central accessible à travers le réseau</li>
<li>goal qui est un tâche rattachée à une phase et à un plugin qui permet de réaliser des actions nécessaires à la construction d&#8217;un binaire (exemple compile, process-resources, etc&#8230;)</li>
<li>plugin qui permet d&#8217;étendre les fonctionnalités de maven pour la réalisation d&#8217;autres actions ou d&#8217;opérations nécessaires ou connexes au build (exemple: générer la documentation, calculer le taux de couverture de test, générer des rapports, etc&#8230;)</li>
</ul>
<p>Avant de commencer, assurez vous que java est installé sur votre système et que la variabe JAVA_HOME est définie.<br />
L&#8217;installation de maven commence par son téléchargement depuis le site maven.apache.org. Il faut ensuite simplement extraire les binaires dans un répertoire et faire pointer la variable d&#8217;environnement MAVEN_HOME vers ce répertoire. Et ajouter $MAVEN_HOME/bin à votre PATH.</p>
<p>Le répository maven local sera crée par défaut dans le répertoire $HOME/.m2/repository.</p>
<h2>Installer Sonar</h2>
<p>L&#8217;installation de sonar consiste à:</p>
<ul>
<li>télécharger la distribution de Sonar</li>
<li>décompresser l&#8217;archive dans un répertoire $SONAR_HOME</li>
<li>lancer le serveur depuis $SONAR_HOME/bin/ en choisissant le répertoire correspondant à la plateforme sur laquelle sonar est installé</li>
</ul>
<p>Pour de plus amples détails ou des configurations particulières (utilisation d&#8217;un serveur d&#8217;application ou d&#8217;une base de données externe), il faut se reporter à la documentation de Sonar.</p>
<h2>Analyser un projet</h2>
<p style="text-align:left;">Une fois le serveur installé et lancé, l&#8217;analyse d&#8217;un projet se limite à lancer la commande suivante dans le répertoire du projet.<br />
<span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;line-height:18px;font-size:12px;white-space:pre;"> </span></p>
<p><pre class="brush: plain;">mvn sonar:sonar</pre></p>
<div>Si votre projet est un projet Java utilisant déjà maven, vous n&#8217;avez rien à faire. Dans le cas contraire, il y&#8217;a plusieurs possibilités.</div>
<div>
<ul>
<li>Pour un projet Java (ou Flex), le plus interressant est de &#8220;maveniser&#8221; votre projet afin d&#8217;automatiser son build, la gestion des dépendances, le reporting et surtout l&#8217;inspection continue avec Sonar.</li>
<li>Si vous utilisez un autre outil de build (ant par exemple), il est possible de réaliser une configuration &#8220;light&#8221; permettant de réaliser rapidement une première analyse. Pour cela, il suffit de créer un fichier pom.xml à la racine de votre projet avec le contenu ci-dessous. Je ne recommande pas ce mode de fonctionnement, car il y&#8217;a de réels avantage à utiliser maven et car ça vous éloigne du mode de fonctionnement standard.<span style="font-family:Consolas, Monaco, 'Courier New', Courier, monospace;line-height:18px;font-size:12px;white-space:pre;"><pre class="brush: xml;">&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;[GROUPID]&lt;/groupId&gt;
  &lt;artifactId&gt;[ARTIFACTID]&lt;/artifactId&gt;
  &lt;name&gt;[PROJECT NAME]&lt;/name&gt;
  &lt;version&gt;[PROJECT VERSION]
    &lt;/version&gt;
  &lt;build&gt;
    &lt;sourceDirectory&gt;[SOURCE DIRECTORY]&lt;/sourceDirectory&gt;

    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
        &lt;configuration&gt;
          &lt;source&gt;1.5&lt;/source&gt;
          &lt;target&gt;1.5&lt;/target&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
  &lt;properties&gt;
    &lt;sonar.light&gt;true&lt;/sonar.light&gt;
  &lt;/properties&gt;
&lt;/project&gt;</pre><br />
</span></li>
</ul>
<ul>
<li>Pour un projet PHP, le pom.xml peut-être encore plus réduit, du fait que maven n&#8217;est pas nécessairement utilisé pour effectuer la compilation du projet. Il existe par ailleurs un projet php-maven (www.php-maven.org) qui donne la possibilité de le faire. Si vous utilisez PHP, je suis interressé par vos retours sur ce projet.<br />
<pre class="brush: xml;">&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
 &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
 &lt;groupId&gt;de.phpunit&lt;/groupId&gt;
 &lt;artifactId&gt;phpunit&lt;/artifactId&gt;
 &lt;name&gt;PHPUnit&lt;/name&gt;
 &lt;version&gt;1.0&lt;/version&gt;
 &lt;!-- For the moment, specify pom as packaging for php projects --&gt;
 &lt;packaging&gt;pom&lt;/packaging&gt;
 &lt;build&gt;
   &lt;!-- You cannot omit this one, because maven will implicitely add src/main/java
     to it --&gt;
   &lt;sourceDirectory&gt;${basedir}&lt;/sourceDirectory&gt;
   &lt;testSourceDirectory&gt;${basedir}/Tests&lt;/testSourceDirectory&gt;
 &lt;/build&gt;
 &lt;properties&gt;
    &lt;sonar.language&gt;php&lt;/sonar.language&gt;
 &lt;/properties&gt;
&lt;/project&gt;
</pre></li>
</ul>
</div>
<p>La dernière étape consiste à se rendre à l&#8217;adresse http://localhost:9000/ et à visualiser le tableau de bord récapitulant les mesures et violations du projet.</p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/01/tableau-de-bord-sonar1.png"><img class="aligncenter size-medium wp-image-98" title="Listes de projets dans Sonar" src="http://akrambenaissi.files.wordpress.com/2011/01/tableau-de-bord-sonar1.png?w=300&#038;h=102" alt="" width="300" height="102" /></a></p>
<p><a href="http://akrambenaissi.files.wordpress.com/2011/01/tableau-de-bord-sonar21.png"><img class="aligncenter size-full wp-image-100" title="Tableau de bord Sonar" src="http://akrambenaissi.files.wordpress.com/2011/01/tableau-de-bord-sonar21.png?w=630" alt=""   /></a></p>
<p>Après ces quelques étapes, vous disposez d&#8217;une plateforme d&#8217;inspection en continue qui vous permet de suivre l&#8217;évolution de nombreux indicateurs concernant le code source de vos projets. Dans les articles suivants nous verrons comment exploiter ces métriques au profit de votre projet ainsi que les explications et l&#8217;utilisation d&#8217;éléments de qualimétrie courants.</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/71/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=71&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2011/01/10/qualite-de-code-avec-sonar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a1c3682fe7845f0a251a2f60451e295?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Akram</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/01/how-sonar-works1.png" medium="image">
			<media:title type="html">Fonctionnement de Sonar</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/01/tableau-de-bord-sonar1.png?w=300" medium="image">
			<media:title type="html">Listes de projets dans Sonar</media:title>
		</media:content>

		<media:content url="http://akrambenaissi.files.wordpress.com/2011/01/tableau-de-bord-sonar21.png" medium="image">
			<media:title type="html">Tableau de bord Sonar</media:title>
		</media:content>
	</item>
		<item>
		<title>Qualité logicielle: De grands mots?</title>
		<link>http://akrambenaissi.wordpress.com/2011/01/04/qualite-logicielle-de-grands-mots/</link>
		<comments>http://akrambenaissi.wordpress.com/2011/01/04/qualite-logicielle-de-grands-mots/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 22:08:20 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Qualité logicielle]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=31</guid>
		<description><![CDATA[Le domaine de la qualité logicielle est relativement large. En y regardant de plus près, on se retrouve rapidement confronté à des mots comme termes comme Modèle Qualimétrique, Complexité Cyclomatique, Manque de Cohésion, taux de couverture de tests&#8230; L&#8217;objectif de cette article n&#8217;est pas de faire peur ou de dire que la qualité logicielle est réservé aux [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=31&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Le domaine de la qualité logicielle est relativement large. En y regardant de plus près, on se retrouve rapidement confronté à des mots comme termes comme Modèle Qualimétrique, Complexité Cyclomatique, Manque de Cohésion, taux de couverture de tests&#8230;</p>
<p>L&#8217;objectif de cette article n&#8217;est pas de faire peur ou de dire que la qualité logicielle est réservé aux esthètes, aux intégristes de la ligne de code ou aux architectes qui n&#8217;en écrivent jamais une.<span id="more-31"></span></p>
<p><span style="font-weight:bold;">La qualité logicielle, c&#8217;est cool</span></p>
<p>Oui c&#8217;est cool, mais c&#8217;est quoi? Il existe plusieurs définitions, celle de wikipédia :</p>
<blockquote><p>In the context of software engineering, <strong>software quality</strong> measures how well software is designed (<em>quality of design</em>), and how well the software conforms to that design (<em>quality of conformance</em>), although there are several different definitions. It is often described as the &#8216;fitness for purpose&#8217; of a piece of software.</p>
<p>Whereas <em>quality of conformance</em> is concerned with implementation, <em>quality of design</em> measures how valid the design and requirements are in creating a worthwhile product.</p></blockquote>
<p>Comme c&#8217;est si justement dit, la plupart des outils et des modèles distinguent plusieurs niveaux de conformité. Globalement, tous se basent sur des métriques (des éléments factuels qui sont mesurables sur l&#8217;application). C&#8217;est la clé de voute de la qualité logicielle.</p>
<h4>La qualité logicielle: à quoi ça sert?</h4>
<p>Comme toutes les choses cool, la qualité logicielle ça peut être très utile, parfois ennuyant et parfois même handicapant. La réelle utilité tiens dans une notion simple, celle de l&#8217;amélioration continue. Pourquoi mesurer quelque chose si ce n&#8217;est pour l&#8217;améliorer? En fait, il y&#8217;a deux réponses à cette question qui s&#8217;opposent à priori.<br />
D&#8217;une part, le développement est un métier artisanal dont l&#8217;état de l&#8217;art évolue et s&#8217;adapte aux besoins ou aux évolutions des technologies. Pour pouvoir construire des applications, il y&#8217;a certains critères qu&#8217;il est nécessaire de respecter pour que l&#8217;édifice puisse croitre.<br />
Le deuxième aspect en contradiction avec le premier, c&#8217;est la nécessité d&#8217;industrialiser, de faire évoluer et de maintenir les opérations de construction de l&#8217;application.</p>
<h4>Artisanat et industrie logicielle</h4>
<p>Les deux objectifs sont opposés mais la finalité est la même: Bien développer. La difficulté réside dans le fait d&#8217;exprimer le &#8220;bien développer&#8221;. Un modèle qualimétrique définit généralement des facteurs de qualité (ou de santé) d&#8217;une application. Un des modèle les plus répandu est l&#8217;ISO 9126-3.  Mais il en existe d&#8217;autres, celui du SEI, ou encore des modèles propres à des éditeurs, des outils ou à des méthodologies de projet ou d&#8217;analyse de la qualité. A titre d&#8217;exemple, l&#8217;evolutivité, la transférabilité, la sécurité, la robustesse et la performance sont des facteurs de santé.</p>
<p>Certains modèles s&#8217;appuient (aussi ou uniquement) sur des critères  qualités: Gestion des erreurs et des exceptions, documentation ou complexité sont des critères qualités.</p>
<p>En bout de chaîne, la métrique est l&#8217;élément essentiel permettant de réaliser la mesure et intervient ainsi dans le critère qualité ou dans le facteur de santé. La complexité cyclomatique, le taux de documentation, le taux de duplication ou le taux de couverture par les tests unitaires sont des métriques. Elles sont valuées et répétables.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=31&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2011/01/04/qualite-logicielle-de-grands-mots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b3d14b8c5e59ea0acf5cb070243fc9a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akramba</media:title>
		</media:content>
	</item>
		<item>
		<title>Historique des web services</title>
		<link>http://akrambenaissi.wordpress.com/2010/06/04/historique-des-web-services/</link>
		<comments>http://akrambenaissi.wordpress.com/2010/06/04/historique-des-web-services/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 22:40:37 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=52</guid>
		<description><![CDATA[La légende raconte que c&#8217;est Bill Gates, alors président de Microsoft qui a le premier utilisé ensemble les termes Web Services. Il l&#8217;aurait fait  le 12 Juillet 2000 au cours de Microsoft Professional Developers Conference à Orlando. Même si cette légende est controversée, il est plus certains en revanche que c&#8217;est chez Microsoft que ces [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=52&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La légende raconte que c&#8217;est Bill Gates, alors président de Microsoft qui a le premier utilisé ensemble les termes Web Services. Il l&#8217;aurait fait  le 12 Juillet 2000 au cours de Microsoft Professional Developers Conference à Orlando. Même si cette légende est controversée, il est plus certains en revanche que c&#8217;est chez Microsoft que ces mots ont été utilisés la première en les associants à SOAP, XML, WSDL et UDDI.<span id="more-52"></span></p>
<h4>Génèse</h4>
<p>Evidement, tout ne s&#8217;est pas fait en jour, et la naissance des Services Web et des technologies qui les accompagne remonte à un peu plus loin que cette date. En réalité, l&#8217;histoire commence en 1975 lorsque l&#8217;informatique souffrait encore de peu de standardisation et que les constructeurs et éditeurs se rendent compte de la nécessité d&#8217;uniformiser les échanges de données. Ils firent alors le vœux pieux de &#8220;l&#8217;interopérabilité&#8221; afin de standardiser la communication entre application au travers d&#8217;un réseau. c&#8217;est la naissance l&#8217;EDI (Electronic Data Interchange ou Echange de Données Informatisées), l&#8217;ancêtre des Web Services.</p>
<p>De nombreuses technologies ont alors émergé depuis avec toujours cet objectif de connecter des logiques métiers au travers d&#8217;un réseau: C&#8217;est la naissance de CORBA, DCOM, Unix RPC, Java RMI, mais aucune de ces technologies n&#8217;a réellement réussit à s&#8217;imposer comme standard universel car souvent rattaché à un système d&#8217;exploitation, à un éditeur ou à un langage particulier.</p>
<h4>Le web à la rescousse</h4>
<p>L&#8217;arrivée du web à tout bouleversé. Jusque là toute les tentatives d&#8217;accorder les acteurs du marché autour d&#8217;un protocole réseau d&#8217;interconnexion des applications ont échoués. Le web a rendu cela possible en s&#8217;appuyant des modèles académiques (modèle OSI) et en reprenant les clés du succès de protocoles de plus bas niveaux déjà adopté.</p>
<p>L&#8217;émergence du Web va passer par la création du protocole HTTP et sa standardisation en 1997 comme protocole de transfert de données hyper texte (du texte avec des liens) et qui s&#8217;appuiera sur TCP/IP. A ce moment, IP est un protocole d&#8217;interconnexion mature et dont la diffusion était importante dans les universités et les entreprises. Il ne manquait alors qu&#8217;un format d&#8217;encapsulation et d&#8217;échange de message pour finaliser la chaîne de l&#8217;interopérabilité.</p>
<h4>L&#8217;arrivée d&#8217;XML et la naissance de XML-RPC</h4>
<p>En 1998, année de sa standardisation en version 1.0 par le W3C, XML viendra compléter la chaîne de l&#8217;interopérabilité en s&#8217;imposant comme format d&#8217;échange et de description des données, indépendant de toute plateforme.</p>
<p>La même année, la société UserLand très active dans le domaine de la gestion de contenu (CMS), et pionnière sur XML, entame alors des travaux en collaboration avec Microsoft pour standardiser une technologie d&#8217;échange entre applications. C&#8217;est la naissance de XML-RPC.</p>
<h4>Stop stop stop</h4>
<p>L&#8217;histoire ne s&#8217;est pas arreté là, mais la redaction de cette article oui, car cette article a donné lieu à un document beaucoup plus important d&#8217;une soixantaine de pages sur les normes d&#8217;architecture et de développement des Web Services.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=52&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2010/06/04/historique-des-web-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b3d14b8c5e59ea0acf5cb070243fc9a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akramba</media:title>
		</media:content>
	</item>
		<item>
		<title>Programmation Oritentée Tâches</title>
		<link>http://akrambenaissi.wordpress.com/2007/07/24/programmation-oritentee-taches/</link>
		<comments>http://akrambenaissi.wordpress.com/2007/07/24/programmation-oritentee-taches/#comments</comments>
		<pubDate>Mon, 23 Jul 2007 23:06:28 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Méthodologie de projet]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Branching (software)]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[Mylyn]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=67</guid>
		<description><![CDATA[La Programmation Orientée Tâches (Task Focused Programming) est un mode de développement introduit par Mik Kersten permettant d&#8217;accroitre la productivité du développeur en axant son travail sur une liste de tâches à réaliser dans un contexte de travail donné. L&#8217;objet de ce billet est de détailler la mise en place de la POT dans une équipe [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=67&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><span style="font-weight:normal;font-size:13px;">La Programmation Orientée Tâches (Task Focused Programming) est un mode de développement introduit par <a href="http://www.ibm.com/developerworks/java/library/j-mylar2/#author">Mik Kersten</a> permettant d&#8217;accroitre la productivité du développeur en axant son travail sur une liste de tâches à réaliser dans un contexte de travail donné.<span id="more-67"></span></span></h3>
<div>L&#8217;objet de ce billet est de détailler la mise en place de la POT dans une équipe de développement en utilisant Eclipse 3.3, le plugin Mylyn, le connecteur JIRA pour Mylyn et évidement JIRA.&nbsp;</p>
<ul>
<li>L&#8217;installation de Eclipse 3.3 ( alias Europa)</li>
<li>L&#8217;installation du connecteur JIRA pour Mylyn</li>
<li>La configuration du Mylyn pour récupérer la liste des tâches dans JIRA</li>
<li>La création des tâches dans JIRA</li>
<li>Travailler sur une tâche</li>
<li>Lui assigner un contexte</li>
<li>Partager un contexte</li>
</ul>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/akrambenaissi.wordpress.com/67/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/akrambenaissi.wordpress.com/67/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/67/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=67&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2007/07/24/programmation-oritentee-taches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b3d14b8c5e59ea0acf5cb070243fc9a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akramba</media:title>
		</media:content>
	</item>
		<item>
		<title>Créer un formulaire simple avec Spring et SimpleFormController</title>
		<link>http://akrambenaissi.wordpress.com/2006/11/13/creer-un-formulaire-simple-avec-spring-et-simpleformcontroller/</link>
		<comments>http://akrambenaissi.wordpress.com/2006/11/13/creer-un-formulaire-simple-avec-spring-et-simpleformcontroller/#comments</comments>
		<pubDate>Mon, 13 Nov 2006 22:52:27 +0000</pubDate>
		<dc:creator>Akram</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://akrambenaissi.wordpress.com/?p=57</guid>
		<description><![CDATA[Ce billet décrit l&#8217;utilisation d&#8217;un SimpleFormController pour la création d&#8217;un formulaire simple avec Spring. Je vous conseille d&#8217;utiliser SimpleFormController lorsque vous devez créer un formulaire permettant de peupler un objet composé de propriétés simples (boolean, int, String, etc&#8230;) . Dans le cas où vous voudriez écrire une applicaiton permettant de peupler des objets un peu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=57&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><span style="font-weight:normal;font-size:13px;">Ce billet décrit l&#8217;utilisation d&#8217;un SimpleFormController pour la création d&#8217;un formulaire simple avec Spring. Je vous conseille d&#8217;utiliser SimpleFormController lorsque vous devez créer un formulaire permettant de peupler un objet composé de propriétés simples (boolean, int, String, etc&#8230;) . Dans le cas où vous voudriez écrire une applicaiton permettant de peupler des objets un peu plus complexe, je AbstractWizardFormController qui fera l&#8217;objet d&#8217;un prochain billet.</span></h3>
<div><span id="more-57"></span><br />
<a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/mvc/SimpleFormController.html">SimpleFormController</a> possède 5 attributs interressants:&nbsp;</p>
<ol>
<li>formView : Il s&#8217;agit de la vue à afficher lors de l&#8217;édition du formulaire. Cette vue est affichée tant que le formulaire n&#8217;est pas validé et submitté.</li>
<li>successView : C&#8217;est la vue à afficher après la validation et le submit du formulaire.</li>
<li>commandClass : La classe (java) de l&#8217;objet qui servira de commande au formulaire.</li>
<li>commandName : Le nom associé à l&#8217;objet command</li>
<li>validator: Il s&#8217;agit de la classe de l&#8217;objet qui sera en charge de la validation de l&#8217;objet command. C&#8217;est dans cette classe que l&#8217;on fera les validations de surface (format et champs obligatoires).</li>
</ol>
<p>Pour utiliser SimpleFormController (SFC pour les intimes), la première étape consiste à étendre cette classe et eventuellement redefinir certaines de ses méthodes.<br />
L&#8217;implémentation de base est plutôt complète, mais elle ne sert à rien tant que vous n&#8217;avez pas redéfini la méthode onSubmit() .</p>
<ul>
<li>La méthode <a href="http://www.springframework.org/docs/api/org/springframework/web/servlet/mvc/SimpleFormController.html#onSubmit%28javax.servlet.http.HttpServletRequest,%20javax.servlet.http.HttpServletResponse,%20java.lang.Object,%20org.springframework.validation.BindException%29">onSubmit()<br />
</a></li>
</ul>
<p>Cette méthode est éxécutée une fois que le formulaire a été bindé, validé et submitté.</p>
<p>Le binding: Cette opération est éxecuté implicitement par SimpleFormController lors du submit du formulaire dans la méthode onBind(). Elle consiste a rechercher dans la JSP pointée par formView les correspondances avec les propriétés de l&#8217;object command . Pour cela, elle s&#8217;appuie sur le tag qui indique quelle propriété doit être attachée avec quelle valeur contenue dans le formulaire. Ces valeurs sont portées par des champs html input comme des textfield, des radio, des select ou des champs hidden.<br />
Le binding par défaut du SFC reconnait certains types standard comme String, Integer, BigDecimal, Long, etc&#8230; . Pour celà, il se base sur la locale de la request et instancie un formatter (NumberFormatter par ex ) capable de parser la valeur. Il est possible de personnaliser le binder de SFC en surchargeant la méthode initBinder() . Cela permet par exemple de parser directement dates ou des types que vous avez vous-même définis.<br />
Lorsque le binding ne peut s&#8217;opérer sur les types gérés par le binder, la méthode onBind peuple l&#8217;objet BindException errors avec des erreurs typeMismatch.</p>
<p>La validation: Cette opération est éxécutée implicement par SFC après le binding. Pour cela, elle récupère l&#8217;objet command et execute sur ce dernier la méthode validate du validator. La méthode validate doit peupler l&#8217;objet errors avec des messages d&#8217;erreurs spécifiés par l&#8217;utilisateur. Il est conseillé d&#8217;effectuer les validations de surface dans la méthode validate: Verification des champs obligatoires, vérifications de la taille des données ou de l&#8217;ordre des dates.</p>
<p>Le submit: Une fois le binding et la validation passés sans erreurs, SimpleFormController execute la méthode onSubmit . L&#8217;implémentaiton par défaut se contente de renvoyer un model contenant l&#8217;objet command vers la vue successView. Il est donc conseillé d&#8217;effectuer les traitements utilisant l&#8217;objet command à cet endroit. On appellera par exemple la méthode de sauvegarde de l&#8217;objet command en base, ou on pourra charger une liste ou un résultat en utilisant comme parametre d&#8217;entrée l&#8217;objet command.</p>
<ul>
<li>La méthode onBindAndValidate()</li>
</ul>
<p>Je reviens rapidement sur cette méthode. L&#8217;implémentation par défaut de cette méthode ne fait rien. Or elle est importante, car elle exécutée une fois que le binding s&#8217;est fait correctement et que la validation de surface est passée sans erreur. C&#8217;est donc l&#8217;endroit idéeal pour effectuer les validations métiers (verification de l&#8217;unicité d&#8217;une valeur, appel à une base de données pour vérifier la cohérence des données saisies, etc&#8230;).<br />
Je conseille d&#8217;effectuer ces validations business ici, car de cette facon, elles ne polluent pas le Validator avec des appels à des DAO ou à des services métiers d&#8217;une part. D&#8217;autre part, la validation business aura accès aux infos contenues dans la request et aux services métiers.</p>
<p>voici un exemple de code:</p>
<p>UtilisateurEditController :<br />
<pre class="brush: java;">
/**
* Controlleur spring permettant d'editer/ajouter un utilisateur.
*
* @author &lt;a href=&quot;mailto:akram.benaissi@gmail.com&quot;&gt;Akram BEN AISSI &lt;/a&gt;
*/
public class EditUtilisateurController extends SimpleFormController{
private static Logger logger = Logger.getLogger(EditUtilisateurController.class);&lt;/code&gt;

&lt;code&gt;private AdministrateurEAIProxyManager proxy;&lt;/code&gt;

&lt;code&gt;/**
* Prépare les données du formulaire et affiche la liste complète de ces
* employeurs.
*
* @see org.springframework.web.servlet.mvc.AbstractFormController#formBackingObject(javax.servlet.http.HttpServletRequest)
*/
protected Object formBackingObject(HttpServletRequest request) throws Exception {
logger.debug(&quot;Appel de formBackingObject&quot;);
/**
* Si l'id de l'utilisateur n'est pas présent on est dans le cas d'ajout
* d'un sourcier.
*/
String id = request.getParameter(ApplicationConfig.ID);
UtilisateurModel utilisateur = new UtilisateurModel();
RoleModel role = new RoleModel();
utilisateur.setRole(role);

if (id != null &amp;amp;&amp;amp; !id.trim().equals(&quot;&quot;)) {
long idUtilisateur = Long.parseLong(id);
utilisateur = getProxy().trouverUtilisateur(idUtilisateur);
}
request.setAttribute(ApplicationConfig.ID, id);
return utilisateur;
}

/**
* Prépare les données de références de la vue. Ces données sont ensuite
* ajoutées au model pour affichage dans la vue.
*
* @see org.springframework.web.servlet.mvc.SimpleFormController#referenceData(javax.servlet.http.HttpServletRequest)
*/
protected Map referenceData(HttpServletRequest request) throws Exception {
Map data = new HashMap();
data.put(&quot;roles&quot;, getProxy().rechercherRoles());
return data;
}

/**
* Spring binde les listes en tant que liste de String contenant la value de
* la selection. Or, notre liste d'employeur doit contenir des
* EmployeurModel. Il faut dont la reconstruire à partir des ID des
* employeurs. On le fait dans la méthode onBind car celle ci est appellé
* même lors de l'echec de la validation. Cela permet, entre autre, de
* pouvoir afficher les noms des employeurs déjà sélectionné par
* l'utilisateur.
*
*/
protected void onBind(HttpServletRequest request, Object command) throws Exception {
super.onBind(request, command);
UtilisateurModel utilisateur = (UtilisateurModel) command;
logger.debug(&quot;Command: &quot; + command);
List employeursOrIds = utilisateur.getEmployeurs();
List employeurs = getProxy().trouverEmployeurs(employeursOrIds);
utilisateur.setEmployeurs(employeurs);
}

/**
* Effectue le traitement si aucune erreurs n'a eu lieu. Si une erreur
* business ou données à lieu, elle est interceptée et le message d'erreur à
* afficher dans la vue est préparé ici.
*
* @see org.springframework.web.servlet.mvc.BaseCommandController#onBindAndValidate(javax.servlet.http.HttpServletRequest,
* java.lang.Object, org.springframework.validation.BindException)
*/
protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors) throws Exception {
super.onBindAndValidate(request, command, errors);
if (errors.hasErrors()) {
return;
}

UtilisateurModel user = (UtilisateurModel) request.getSession().getAttribute(ApplicationConfig.USER);
UtilisateurModel utilisateur = (UtilisateurModel) command;
utilisateur.setModificationUser(user.getLogin());
String id = (String) request.getAttribute(ApplicationConfig.ID);
if (id != null &amp;amp;&amp;amp; !id.trim().equals(&quot;&quot;)) {
utilisateur.setUtilisateurId(Long.parseLong(id));
}
try {
getProxy().corrigerUtilisateur(utilisateur);
logger.debug(&quot;Utilisateur corrigé sans erreur&quot;);
} catch (DuplicateException e) {
logger.debug(&quot;Utilisateur corrigé AVEC ERREUR&quot;);
errors.rejectValue(&quot;login&quot;, &quot;error.already.exists.login&quot;);
}
}

/**
* Redirige vers la vue de succès. Les erreurs business sont traitées dans
* onBindAndValidate pour permettre à la fois la validation de surface des
* données puis la validation business.
*
* @see org.springframework.web.servlet.mvc.SimpleFormController#onSubmit(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object,
* org.springframework.validation.BindException)
*/
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command,
BindException errors) throws RemoteException, WebAppEAIException, SQLException {
String id = (String) request.getAttribute(ApplicationConfig.ID);
List utilisateurs = getProxy().trouverUtilisateurs(&quot;&quot;);
Map model = new HashMap();
model.put(&quot;utilisateurs&quot;, utilisateurs);
model.put(&quot;form&quot;, new RechercheBean());
model.put(ApplicationConfig.ID, id);

String pageParameterName = new ParamEncoder(&quot;utilisateurRow&quot;).encodeParameterName(TableTagParameters.PARAMETER_PAGE);
String pageParameter = &quot;?&quot; + pageParameterName + &quot;=&quot; + request.getParameter(pageParameterName);
ModelAndView mv = new ModelAndView(new RedirectView(getSuccessView() + pageParameter));
return mv;
}

/**
* @return Returns the proxy.
*/
public AdministrateurEAIProxyManager getProxy() {
return proxy;
}

/**
* @param proxy
* The proxy to set.
*/
public void setProxy(AdministrateurEAIProxyManager administrateurEAIProxyManager) {
this.proxy = administrateurEAIProxyManager;
}

}
</pre></p>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/akrambenaissi.wordpress.com/57/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/akrambenaissi.wordpress.com/57/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/akrambenaissi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/akrambenaissi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/akrambenaissi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/akrambenaissi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/akrambenaissi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/akrambenaissi.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/akrambenaissi.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/akrambenaissi.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=akrambenaissi.wordpress.com&amp;blog=13421918&amp;post=57&amp;subd=akrambenaissi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://akrambenaissi.wordpress.com/2006/11/13/creer-un-formulaire-simple-avec-spring-et-simpleformcontroller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b3d14b8c5e59ea0acf5cb070243fc9a6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">akramba</media:title>
		</media:content>
	</item>
	</channel>
</rss>
