<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lunatix&#039;Blog &#187; oss</title>
	<atom:link href="https://blog.developpez.com/lunatix/pcategory/oss/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/lunatix</link>
	<description></description>
	<lastBuildDate>Thu, 19 Apr 2012 09:16:45 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Groovy Beans : javaBeans au régime</title>
		<link>https://blog.developpez.com/lunatix/p5374/java/groovy_java_reloaded</link>
		<comments>https://blog.developpez.com/lunatix/p5374/java/groovy_java_reloaded#comments</comments>
		<pubDate>Tue, 01 Apr 2008 15:58:40 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Avec la même approche que pour le HelloWorld du billet précédent, nous allons voir un GroovyBean. Un Groovy bean, c&#8217;est un java Bean a la mode groovy. Prenons par exemple une classe Adresse pour java : Elle contient deux attributs, leurs geters et seters ainsi qu&#8217;une méthode de formatage getAdresseComplete et un petit main pour afficher les données. Et bien elle compile directement dans groovy mais nous allons bien sur voir comment elle peut être [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://media.xircles.codehaus.org/_projects/groovy/_logos/medium.png" class="rightmargin" alt="groovy logo"/><br />
Avec la même approche que pour le <a href="http://blog.developpez.com/index.php?blog=39&amp;p=5380&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1#more5380">HelloWorld du billet précédent</a>, nous allons voir un GroovyBean. Un Groovy bean, c&rsquo;est un java Bean a la mode groovy.</p>
<p>Prenons par exemple une classe <b>Adresse</b> pour java : Elle contient deux attributs, leurs geters et seters ainsi qu&rsquo;une méthode de formatage <b>getAdresseComplete</b> et un petit <b>main</b> pour afficher les données.<br />
Et bien elle compile directement dans groovy mais nous allons bien sur voir comment elle peut être transformée pour une meilleure lisibilité.<br />
<span id="more-65"></span></p>
<p><img src="http://blog.developpez.com/media/groovyBean1.PNG" width="572" height="564" alt="Groovy beans 1" /></p>
<p>Tout d&rsquo;abord et comme la dernière fois : les <b>;</b> sont inutiles, et en groovy, les classes et méthodes sont par défaut public. On peut donc se passer de ces artefacts inutiles dans le code.</p>
<p><img src="http://blog.developpez.com/media/groovyBean2.PNG" width="568" height="569" alt="Groovy beans 2" /></p>
<p>Vous avez peut-être vu que pour java7, <a href="http://www.developpez.net/forums/showthread.php?t=461389">il est proposé un système déclaration des propriétés</a>, en groovy, c&rsquo;est déjà la. Un attribut sans aucun modificateur est considéré comme une propriété. Vous pouvez donc vous passer des geters et seters. Par contre le byte code généré comporte ces méthodes, donc si vous utilisez ce bean via java, vous pourrez bien utiliser les méthodes getVille() et autres.</p>
<p><img src="http://blog.developpez.com/media/groovyBean3.PNG" width="550" height="299" alt="Groovy beans 3" /></p>
<p>Dans groovy, dernier statement d&rsquo;une méthode est automatiquement retourné, on peut donc se passer du <b>return</b> de la méthode <b>getAdresseComplete()</b>. On en profite pour utiliser les possibilités de concaténation de variables des String groovy (GString de leur petit nom).</p>
<p><img src="http://blog.developpez.com/media/groovyBean4.PNG" width="530" height="70" alt="Groovy beans 4" /></p>
<p>Et comme On l&rsquo;a vu, il n&rsquo;est pas obligatoire de tout mettre dans une classe, ni de typer les variables. On utilise le raccourci println pour System.out.prinln() histoire d&rsquo;alleger au maximum.</p>
<p><img src="http://blog.developpez.com/media/groovyBean5.PNG" width="645" height="186" alt="Groovy beans 5" /></p>
<p>Au final, on a du code très simple, très expressif, et facile a lire pour un habitué de java. C&rsquo;est je crois le gros point fort de groovy, très expressif, tout en étant facile a appréhender.<br />
Par contre, je reste partagé sur le fait de typer ou non les variables, et je pense que ça dépends du type de code que l&rsquo;on produit. Si c&rsquo;est plutôt du script, <b>def</b> c&rsquo;est plutôt pratique. Sur un projet plus gros, le typage apporte quand même une sécurité a la compilation appréciable.</p>
<p>Et bien sur, vous disposez avec ce bean de Java et de toute ses api, comme par exemple JPA. Voila par exemple ce que donne ce bean rendu persistant via JPA. </p>
<p><img src="http://blog.developpez.com/media/groovyBeansJpa.PNG" width="748" height="240" alt="Groovy beans Jpa" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Groovy : helloWorld</title>
		<link>https://blog.developpez.com/lunatix/p5380/java/groovy_helloworld</link>
		<comments>https://blog.developpez.com/lunatix/p5380/java/groovy_helloworld#comments</comments>
		<pubDate>Fri, 28 Mar 2008 10:05:32 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un classique, mais on doit y passer : le hello world ! Déjà, il faut installer groovy -> Downloads Il existe un plugin pour Eclipse, et un autre pour Netbeans est en approche. Sinon, la console groovy marche aussi Bon, nous venons de java, et un hello world java qui donnerait ceci fonctionne sans aucun changement sous groovy. Il faut savoir que par défaut dans groovy, une classe ou une méthode est public, donc on [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://blog.developpez.com/media/medium.png" class="leftmargin" width="203" height="100" alt="logo groovy" /><br />
Un classique, mais on doit y passer : le hello world !<br />
Déjà, il faut installer groovy -> <a href="http://groovy.codehaus.org/Download">Downloads</a></p>
<p>Il existe un <a href="http://groovy.codehaus.org/Eclipse+Plugin">plugin pour Eclipse</a>, et un autre pour <a href="http://groovy.codehaus.org/NetBeans+Plugin">Netbeans</a> est en approche. Sinon, la console groovy marche aussi <img src="https://blog.developpez.com/lunatix/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Bon, nous venons de java, et un hello world java qui donnerait ceci fonctionne sans aucun changement sous groovy.</p>
<p> <img src="http://blog.developpez.com/media/groovy1.PNG" width="530" height="136" alt="groovy code 1" border="1" /><br />
<span id="more-67"></span></p>
<p>Il faut savoir que par défaut dans groovy, une classe ou une méthode est public, donc on peut se passer de ce mot clé, et que les <b> ; </b> sont optionnels.</p>
<p><img src="http://blog.developpez.com/media/groovy2.PNG" width="530" height="101" alt="grovvy code 2" /></p>
<p>De plus, comme on utilise souvent les sorties standards, la méthode println de System.out est disponible en permanence, et petit plus, si il n&rsquo;y a pas d&rsquo;ambiguïté, les accolades sont optionnelles.</p>
<p><img src="http://blog.developpez.com/media/groovy3.PNG" width="530" height="87" alt="groovy code 3" /></p>
<p>Enfin, en groovy, il n&rsquo;est pas obligatoire de tout inclure dans une classe : on arrive donc a un très simple. </p>
<p><img src="http://blog.developpez.com/media/groovy4.PNG" width="530" height="39" alt="groovy code 4" /></p>
<p>cet exemple bien sur un peu caricatural vous montre quand même bien la philosophie de Groovy ! Le code doit être utile et lisible. tout ce qui est inutile doit disparaitre ! On verra par la suite la même passe sur un java bean.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Groovy : java reloaded ?</title>
		<link>https://blog.developpez.com/lunatix/p5379/java/groovy_java_reloaded_1</link>
		<comments>https://blog.developpez.com/lunatix/p5379/java/groovy_java_reloaded_1#comments</comments>
		<pubDate>Thu, 27 Mar 2008 12:22:57 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Alors que mon camarade Djo.mos s&#8217;est tourné vers scala, j&#8217;ai préféré me tourner vers groovy. Pour ceux qui ne connaissent pas, groovy est un langage de la JVM, c&#8217;est-à-dire qu&#8217;il tourne sur la machine virtuelle java, et qui est compilé en .class (donc, il n&#8217;est pas interprété). Ce que j&#8217;apprécie dans groovy, c&#8217;est le fait qu&#8217;il soit proche de java, tout en amenant un nettoyage du langage très bien pensé. On peut passer facilement et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://media.xircles.codehaus.org/_projects/groovy/_logos/medium.png" class="rightmargin" alt="groovy logo"/> Alors que mon camarade <a href="http://blog.developpez.com/index.php?blog=174&amp;p=5366&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1#more5366">Djo.mos s&rsquo;est tourné vers scala</a>, j&rsquo;ai préféré <a href="http://blog.developpez.com/index.php?blog=39&amp;title=scala_groovy_ou_autre&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">me tourner vers groovy</a>.<br />
Pour ceux qui ne connaissent pas, groovy est un langage de la JVM, c&rsquo;est-à-dire qu&rsquo;il tourne sur la machine virtuelle java, et qui est compilé en .class (donc, il n&rsquo;est pas interprété).</p>
<p>Ce que j&rsquo;apprécie dans groovy, c&rsquo;est le fait qu&rsquo;il soit proche de java, tout en amenant un nettoyage du langage très bien pensé. On peut passer facilement et naturellement vers ce langage en s&rsquo;appuyant sur ce qu&rsquo;on connait déjà de java et de ses API.</p>
<p>je vais dans les semaines qui suivent (si j&rsquo;ai le temps /o\ ) essayer de publier différents billets sur groovy et ses points forts.<br />
Par exemple son excellente interaction et intégration dans java, sur les Builders intégrés, sur les accès base de données etc&#8230;<br />
<span id="more-66"></span></p>
<p>Un premier gros point fort de groovy sur java, c&rsquo;est le fait qu&rsquo;il peut être compilé a la volée. c&rsquo;est-à-dire que le passage par l&rsquo;étape de compilation est optionnel. C&rsquo;est vraiment très agréable de pouvoir exécuter facilement et modifier du code comme en php (ou d&rsquo;autres). Le classpath peut contenir des .class (oui groovy se compile en .class, mais on y reviendra) ou des .groovy indifféremment.</p>
<p>Du coup, groovy peut être utilisé très facilement en langage de scripting. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FireFox 3 : la machine a mashup</title>
		<link>https://blog.developpez.com/lunatix/p4811/web/firefox_3_la_machine_a_mashup</link>
		<comments>https://blog.developpez.com/lunatix/p4811/web/firefox_3_la_machine_a_mashup#comments</comments>
		<pubDate>Fri, 18 Jan 2008 10:34:32 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[oss]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je reviens sur mon dernier post : firefox 3 et cross site scripting ajax. Cette capacité à faire des appels ajax vers d&#8217;autres domaines que le domaine de la page active va permettre a terme de créer une véritable api de widget pour le web. En effet comme déjà vu, on aura deux possibilités : placer un header http pour autoriser un domaine, et pour l&#8217;inclusion de xml une entête dans ce fichier. En combinant [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://lunatix.developpez.com/images/firefox.png" alt="logo firefox" class='leftmargin'/>  Je reviens sur mon dernier post : <a href="http://blog.developpez.com/index.php?blog=39&amp;title=firefox_3_et_cross_site_scripting_ajax&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">firefox 3 et cross site scripting ajax</a>.</p>
<p>Cette capacité à faire des appels ajax vers d&rsquo;autres domaines que le domaine de la page active va permettre a terme de créer une véritable api de widget pour le web.</p>
<p>En effet comme déjà vu, on aura deux possibilités : placer un header http pour autoriser un domaine, et pour l&rsquo;inclusion de xml une entête dans ce fichier.<br />
En combinant les deux, on va pouvoir créer des widgets sur un serveur, et proposer leur inclusion dans une autre page cliente.<br />
Ce widget pourra lui même faire des appels ajax vers des fichiers xml pour se mettre à jour.</p>
<p>On va pouvoir proposer, hebergé sur developpez.com un widget à inclure en ajax qui permet de rechercher dans les forums par exemple et qui va afficher les résultats.<br />
Pas mal ! Le mashup va passer du serveur au client web. ca va simplifier les choses. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sun Mysql</title>
		<link>https://blog.developpez.com/lunatix/p4795/web/sun_mysql</link>
		<comments>https://blog.developpez.com/lunatix/p4795/web/sun_mysql#comments</comments>
		<pubDate>Wed, 16 Jan 2008 14:18:06 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[oss]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La nouvelle est fraiche, Sun vient de se porter acquéreur de mysql labs : news sur le site de Sun ca se concentre !]]></description>
				<content:encoded><![CDATA[<p>La nouvelle est fraiche, Sun vient de se porter acquéreur de mysql labs : <a href="http://www.sun.com/aboutsun/pr/2008-01/sunflash.20080116.1.xml">news sur le site de Sun</a></p>
<p>ca se concentre !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Firefox 3 et cross site scripting (Ajax)</title>
		<link>https://blog.developpez.com/lunatix/p4768/web/firefox_3_et_cross_site_scripting_ajax</link>
		<comments>https://blog.developpez.com/lunatix/p4768/web/firefox_3_et_cross_site_scripting_ajax#comments</comments>
		<pubDate>Thu, 10 Jan 2008 10:54:04 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[oss]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Une des nouveautés de firefox 3 qui va nous intéresser (nous les = développeurs), c&#8217;est la possibilité de faire du cross site scripting ajax. Et oui, il va être possible de faire une requête ajax vers un site autre que le site émetteur de la page. Bien sur, afin que ce ne soit pas une faille de sécurité, il faudra autoriser la page web à le faire avec un header http. Par exemple en php [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://lunatix.developpez.com/images/firefox.png" alt="logo firefox" class='leftmargin'/> Une des nouveautés de firefox 3 qui va nous intéresser (nous les = développeurs), c&rsquo;est la possibilité de faire du cross site scripting ajax. Et oui, il va être possible de faire une requête ajax vers un site autre que le site émetteur de la page.</p>
<p>Bien sur, afin que ce ne soit pas une faille de sécurité, il faudra autoriser la page web à le faire avec un header http.</p>
<p>Par exemple en php<br />
<code class="codecolorer text default"><span class="text">&lt;?php header('Access-Control: allow &lt;*&gt;'); ?&gt;</span></code><br />
Autorisera votre page à appeler n’importe quel site distant en ajax.</p>
<p>plus de détails ici -> <a href="http://developer.mozilla.org/en/docs/Cross-Site_XMLHttpRequest">Cross-Site_XMLHttpRequest</a></p>
<p>je prédis l&rsquo;explosion des api REST pour l&rsquo;année qui vient !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Résumé sur les Fluent interfaces et Dsl en java</title>
		<link>https://blog.developpez.com/lunatix/p4657/java/resume_sur_fluent_interface_et_dsl_en_ja</link>
		<comments>https://blog.developpez.com/lunatix/p4657/java/resume_sur_fluent_interface_et_dsl_en_ja#comments</comments>
		<pubDate>Tue, 11 Dec 2007 13:05:11 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Comment simplifier son code grace aux fluent interfaces. J&#8217;ai pas mal parcouru le net sur le sujet, et je vous livre un résumé de mes pérégrinations&#8230; L&#8217;objectif est de se simplifier la vie, le code et la maintenance en allegeant le code au maximum. Imaginons un objet Commande qui a pas mal d&#8217;attributs, et contient une liste de lignes de commandes. au lieu d&#8217;écrire le classique Commande commmande = new Commande(); commande.setType(AR); // accusé reception [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://adiguba.developpez.com/blog/java.png" class="leftmargin" alt="java"/>Comment simplifier son code grace aux fluent interfaces. J&rsquo;ai pas mal parcouru le net sur le sujet, et je vous livre un résumé de mes pérégrinations&#8230;</p>
<p>L&rsquo;objectif est de se simplifier la vie, le code et la maintenance en allegeant le code au maximum. Imaginons un objet Commande qui a pas mal d&rsquo;attributs, et contient une liste de lignes de commandes.</p>
<p>au lieu d&rsquo;écrire le classique</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Commande commmande = new Commande(); <br />
commande.setType(AR); // accusé reception demandé <br />
commande.setTruc1(...); // euh, oui, j'ai pas d'imagination... <br />
commande.setTruc2(...); <br />
commande.setTruc3(...); <br />
commande.getLignes().add(new LigneCommande());</div></div>
<p>on voudrait pouvoir ecrire (exemple simple)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Commande commmande = initCommandeAR() <br />
&nbsp; &nbsp; .dateEnvoi(..) <br />
&nbsp; &nbsp; .truc1(...) <br />
&nbsp; &nbsp; .truc2(...) <br />
&nbsp; &nbsp; .with(new LigneCommande());</div></div>
</p>
<p><span id="more-27"></span></p>
<p>Il sagit de chain programming, déjà utilisé dans certaines api java par exemple dans l&rsquo;api nio (regardez les methodes des buffers, elles renvoient toutes l&rsquo;objet).</p>
<p>Plus leger, plus simple, potentiellement lisible par un profane en programmation. On peut pousser le concept beaucoup plus loin que sur cet exemple un peu naïf en creant un veritable petit &laquo;&nbsp;langage&nbsp;&raquo; dédié a cet objet ou a un ensemble d&rsquo;objets. Imaginez par exemple manipuler l&rsquo; horrible api Date/Calendar de java en tappant</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">date = now().add(days(2)).add(months(1)).subtract(years(1))</div></div>
<p>ou bien</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$(2).days().before().now();</div></div>
<p>Un exemple plus complexe de l&rsquo;api JMock, ou finalement on approche le concept de Domain Specific Language.</p>
<p><code class="codecolorer text default"><span class="text">mock.expects(once()).method(&quot;m&quot;).with( or(stringContains(&quot;hello&quot;), stringContains(&quot;howdy&quot;)));</span></code></p>
<p>Un autre exemple est le <a href="http://andersnoras.com/blogs/anoras/archive/tags/Quaere/default.aspx ">projet Quaere</a>, un genre de linq pour java. </p>
<p>Ca vous donne des idées ? (y&rsquo;a aussi jrules, l&rsquo;api <a href="http://www.hibernate.org/hib_docs/reference/en/html/querycriteria.html">criteria de hibernate</a> etc&#8230; )</p>
<p>La façon la plus evidente pour faire cela est d&rsquo;ajouter ces methodes a l&rsquo;objet sur lequel on veut travailler.<br />
En plus des geter/seters, on peut y ajouter les methodes supplementaires pour avoir cette syntaxe.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public Commande truc1(String truc) { <br />
&nbsp; &nbsp; this.setTruc1(truc); <br />
&nbsp; &nbsp; return this; <br />
}</div></div>
<p>Simple, mais bon, le nombre de methodes va exploser, on va melanger les methodes, en gros c&rsquo;est le bordel ! On s&rsquo;éloigne de l&rsquo;objectif, et on ne peut pas ajouter simplement le return this; au seter, car ce n&rsquo;est plus conforme aux normes du java bean</p>
<p>La méthode proposée par <a href="http://martinfowler.com/bliki/FluentInterface.html">martinfowler.com</a> consiste a avoir un sous objet qui lui dispose de ces methodes.<br />
On crée cette classe.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class CommandeFluentInterface { <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private Commande commande; <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; public CommandeFluentInterface(Commande commande) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; this.commande = commande; <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; public CommandeFluentInterface truc1(String truc1) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; commande.setTruc1(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; return this; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; public CommandeFluentInterface truc2(String truc2) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; commande.setTruc2(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; return this; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; public Commande finish() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; return commande; <br />
&nbsp; &nbsp; } <br />
} <br />
&nbsp;<br />
public class Commande { <br />
&nbsp; &nbsp; private CommandeFluentInterface commandeFluentInterface; <br />
&nbsp;<br />
&nbsp; &nbsp; public Commande() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; commandeFluentInterface = new commandeFluentInterface(this); <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; public CommandeFluentInterface &nbsp;with() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; return commandeFluentInterface ; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; ... <br />
}</div></div>
<p>on arrive a un code du type</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Commande commmande = new Commande().with() <br />
&nbsp; &nbsp; .dateEnvoi(..) <br />
&nbsp; &nbsp; .truc1(...) <br />
&nbsp; &nbsp; .truc2(...) <br />
&nbsp; &nbsp; .with(new LigneCommande()) <br />
&nbsp; &nbsp; .finish();</div></div>
<p>Pas mal, mais cette méthode a selon moi de gros defauts. Déjà on modifie du code existant pour avoir des &laquo;&nbsp;facilités&nbsp;&raquo; syntaxiques, ce qui pour un gros projet n&rsquo;est pas forcement possible. Du code stable et terminé, on n&rsquo;y touche plus. On mélange code de type Model avec du code de Factory/builder. Enfin on ajoute un attribut a tous les objets que l&rsquo;on veut traiter de cette facon, ce qui peut ne pas etre acceptable (si par exemple cette objet est beaucoup instanciée dans l&rsquo;application, ca peut jouer sur les perfs etc&#8230;)</p>
<p>Oh, mais j&rsquo;ai parlé de Builder, c&rsquo;est un design pattern connu ca ! on a qu&rsquo;a essayer avec. En gros, CommandeFluentInterface devient un CommandeBuilder externe.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class CommandeBuilder { <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private Commande commande; <br />
&nbsp;<br />
&nbsp; &nbsp; public CommandeBuilder(Commande commande) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; this.commande = commande; <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; public CommandeBuilder truc1(String truc1) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; commande.setTruc1() <br />
&nbsp; &nbsp; &nbsp; &nbsp; return this; <br />
&nbsp; &nbsp; }; &nbsp; <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; public CommandeBuilder truc2(String truc2) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; commande.setTruc2() <br />
&nbsp; &nbsp; &nbsp; &nbsp; return this; <br />
&nbsp; &nbsp; }; &nbsp; <br />
&nbsp; &nbsp; public Commande finish() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return commande; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; ... <br />
}</div></div>
<p>du coup, on va coder</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Commande commmande = new CommandeBuilder() <br />
&nbsp; &nbsp; .dateEnvoi(..) <br />
&nbsp; &nbsp; .truc1(...) <br />
&nbsp; &nbsp; .truc2(...) <br />
&nbsp; &nbsp; .with(new LigneCommande()) <br />
&nbsp; &nbsp; .finish();</div></div>
<p>Ca commence a etre pas mal. joli, simple, code de construction decouplé de l&rsquo;objet lui-même, donc on peut ajouter ce genre de choses a un projet existant, sans modifier le code deja présent.</p>
<p>Mais en mélangeant tout ca, avec les satic imports de java 5, on fini par avoir un truc vraiment tres bien (ca vient de <a href="http://blog.centuryminds.com/2007/10/21/java-static-imports-fluent-interfaces-builder-pattern-dsl/">ce blog</a>)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class CommandeUtils { <br />
&nbsp;<br />
&nbsp; &nbsp; public static CommandeBuilder initCommandeAR() { &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; return new CommandeBuilder(new Commande()); <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; public static CommandeBuilder initCommandeAR() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; CommandeBuilder commandeBuilder = new CommandeBuilder(new Commande()); <br />
&nbsp; &nbsp; &nbsp; &nbsp; commandeBuilder.withAR(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; return commandeBuilder(); <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; public static final class CommandeBuilder { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; private Commande commande; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public CommandeBuilder(Commande commande) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.commande = commande; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public CommandeBuilder truc1(String truc1) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;commande.setTruc1(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return this; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public CommandeBuilder truc2(String truc2) { commande.setTruc2() ); &nbsp;<br />
return this; <br />
}; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public Commande finish() { &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return commande; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; ... <br />
&nbsp; &nbsp; } <br />
}</div></div>
<p>et la on peut faire</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import static CommandeUtils.* <br />
... <br />
Commande commmande = initCommandeAR() &nbsp;<br />
&nbsp; &nbsp; .dateEnvoi(..) <br />
&nbsp; &nbsp; .truc1(...) <br />
&nbsp; &nbsp; .truc2(...) <br />
&nbsp; &nbsp; .with(new LigneCommande()) <br />
&nbsp; &nbsp; .finish(); <br />
&nbsp;<br />
&nbsp; &nbsp;<br />
Commande commmande2 = initCommande() &nbsp;<br />
&nbsp; &nbsp; .dateEnvoi(..).finish();</div></div>
<p>evidement, l&rsquo;exemple choisi (la commande si vous suivez) est simpliste, mais cela permet de s&rsquo;attquer a une api complete</p>
<p>http://stephan.reposita.org/archives/2007/10/17/creating-a-fluent-interface-for-google-collections/</p>
<p>voila voila. Vous en pensez quoi vous ? c&rsquo;est totalement inutile ? vous preferez une solution a une autre ? En tous cas, c&rsquo;est un sujet a la mode, probablement parce que les DSL sont interessants, mais que leur construire un outillage approprié n&rsquo;est pas facile (support dans un ide etc&#8230;) : du coup les implementer dans un langage existant est tres utile.<br />
D&rsquo;ailleurs de nombreuses propositions pour java 7, si elles sont retenues vont permettre beaucoup de choses dans le domaine<br />
<a href="http://tech.puredanger.com/java7#closures">Closures</a>, <a href="http://tech.puredanger.com/java7#extmethods">les méthodes d&rsquo;extension</a>, <a href="http://tech.puredanger.com/java7#chained">chained methods</a></p>
<p>multiples sources qui sont la base de ce blog (beaucoup de copié collé dans ce post <img src="https://blog.developpez.com/lunatix/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> )<br />
<a href="http://martinfowler.com/bliki/FluentInterface.html">martinfowler Bliki</a><br />
<a href="http://blog.centuryminds.com/2007/10/21/java-static-imports-fluent-interfaces-builder-pattern-dsl/">static imports fluent interfaces/</a><br />
<a href="http://stephan.reposita.org/archives/2007/10/10/fluent-interface-and-reflection-for-object-building-in-java/">fluent-interfaceand-reflection</a><br />
<a href="http://stephan.reposita.org/archives/2007/10/17/creating-a-fluent-interface-for-google-collections/">creating-a-fluent-interface-for-google-collections</a><br />
<a href="http://randypatterson.com/2007/09/26/HowToDesignAFluentInterface.aspx">HowTo DesignA FluentInterface</a></p>
<p>http://andersnoras.com/blogs/anoras/default.aspx</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Netbeans : CVS  bloqué  ?</title>
		<link>https://blog.developpez.com/lunatix/p2577/java/netbeans_bloque_cvs_only</link>
		<comments>https://blog.developpez.com/lunatix/p2577/java/netbeans_bloque_cvs_only#comments</comments>
		<pubDate>Wed, 29 Nov 2006 11:19:06 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bon, la ca m&#8217;énerve. Le support CVs subversion de Netbeans est vraiment loin derrière celui d&#8217;Eclipse. Je galère sur un truc tout bête par exemple : j&#8217;ai un projet sous CVS, et je veux le déconnecter de ce repository pour le mettre sous un autre (voir sous subversion). Sous Eclipse : -> bouton droit sur le projet -> team -> disconnect et Eclipse demande même si il doit effacer les meta-information (les répertoires CVS) ou [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://blog.developpez.com/media/netbeans_logo.gif" alt="logo netbeans" class="leftmargin"/>  Bon, la ca m&rsquo;énerve. Le support CVs subversion de Netbeans est vraiment loin derrière celui d&rsquo;Eclipse. </p>
<p>Je galère sur un truc tout bête par exemple : j&rsquo;ai un projet sous CVS, et je veux le déconnecter de ce repository pour le mettre sous un autre (voir sous subversion).</p>
<p>Sous Eclipse : -> bouton droit sur le projet -> team -> disconnect   et Eclipse demande même si il doit effacer les meta-information (les répertoires CVS) ou pas.</p>
<p>Sous Netbeans : impossible de trouver quelque chose d&rsquo;équivalent. c&rsquo;est franchement moyen. J&rsquo;envisage d&rsquo;aller dégager les répertoires cvs a la main et de voir ce que ça donne.</p>
<p><span id="more-64"></span></p>
<p>Je reviendrais sur le support de cvs et de subversion dans Netbeans, parce que c&rsquo;est vraiment un gros point noir pour cet IDE. (pas moyen de naviguer facilement dans un repository, le diff est pas terrible, pas de moyen simple pour comparer son fichier avec une version/release antérieure)&#8230; sans parler des locks sous subversion qui bloquent tout et qu&rsquo;il faut aller virer en ligne de commande. bof bof bof</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java en GPL ?</title>
		<link>https://blog.developpez.com/lunatix/p2526/java/java_en_gpl</link>
		<comments>https://blog.developpez.com/lunatix/p2526/java/java_en_gpl#comments</comments>
		<pubDate>Wed, 08 Nov 2006 11:03:24 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Grosse rumeur, Sun serait sur le point d&#8217;annoncer la publication de java SE, java Me et de glassfish (serveur JEE 5 de sun) sous la license star du monde open source : GPL. sources Cnn [edit] oups, c&#8217;est cRn. slashdot]]></description>
				<content:encoded><![CDATA[<p>Grosse rumeur, Sun serait sur le point d&rsquo;annoncer la publication de java SE, java Me et de glassfish (serveur JEE 5 de sun) sous la license star du monde open source : GPL.</p>
<p>sources <a href="http://www.crn.com/sections/breakingnews/breakingnews.jhtml;?articleId=193600331">Cnn</a> [edit] oups, c&rsquo;est cRn.<br />
<br /><a href="http://developers.slashdot.org/article.pl?sid=06/11/08/0221255&amp;from=rss">slashdot</a> </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Spring 2.0 est disponible en version finale</title>
		<link>https://blog.developpez.com/lunatix/p2396/java/spring_2_0_est_disponible_en_version_fin</link>
		<comments>https://blog.developpez.com/lunatix/p2396/java/spring_2_0_est_disponible_en_version_fin#comments</comments>
		<pubDate>Wed, 04 Oct 2006 11:41:46 +0000</pubDate>
		<dc:creator><![CDATA[lunatix]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[oss]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Spring, le framework le plus populaire dans le monde du developpement java est enfin disponible en version 2.0. Au menu de nombreuses nouveautés : Modification de Spring pour que les beans puissent etre codés en n&#8217;importe quel langage supporté par la jvm (Python, Ruby, Beanshell&#8230;) Modularisation plus grande, avec un spring-core reduit a son strict minimum De nouveaux scopes pour les beans : avant il n&#8217;y avait que Singleton, maintenant il y a les scopes [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Spring, le framework le plus populaire dans le monde du developpement java est enfin disponible en version 2.0. </p>
<p>Au menu de nombreuses nouveautés :</p>
<ul>
<li>Modification de Spring pour que les beans puissent etre codés en n&rsquo;importe quel langage supporté par la jvm (Python, Ruby, Beanshell&#8230;)</li>
<li>Modularisation plus grande, avec un spring-core reduit a son strict minimum</li>
<li>De nouveaux scopes pour les beans : avant il n&rsquo;y avait que Singleton, maintenant il y a les scopes ServletContext et session, et la possibilité de créer ses propres scopes.</li>
<li>Le fichier de configuration de Spring passe a xml-schéma, et permet l&rsquo;inclusion d&rsquo;autres namespaces <a href="http://ego.developpez.com/springnamespaces/" >(voir l&rsquo;article de Erik Gollot)</a> pour se faire une idée</li>
<li>L&rsquo;utilisation des annotations (metadata) de java5 pour gerer les transactions</li>
<li>L&rsquo;utilisation de Java Persistence API (JPA) est possible</li>
<li>L&rsquo;inclusion d&rsquo;un Portlet MVC framework</li>
<li>L&rsquo;inclusion d&rsquo;une bibliotheque de tags pour Spring MVC et la gestion des formulaires html</li>
</ul>
<p><span id="more-24"></span><br />
Et encore beaucoup d&rsquo;autres le tout en restant retro-compatible dans la grande majorité des cas, ce qui est quand même impressionant (je vous donnerai des nouvelles de mes migrations).</p>
<p>Pour plus d&rsquo;informations : Le <a href="http://static.springframework.org/spring/docs/2.0.x/reference/new-in-2.html#new-in-2-other-java5">detail des nouveautés</a> sur le site de Spring</p>
<p>Bonne migration(s) <img src="https://blog.developpez.com/lunatix/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
