<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Helyx Weblog</title>
	
	<link>http://blog.helyx.org</link>
	<description>Java, Web and everything else...</description>
	<lastBuildDate>Thu, 09 Jun 2011 23:17:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/helyx/rss" /><feedburner:info uri="helyx/rss" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Introduction aux nouveautés de Groovy 1.8, et Grails 1.4</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/gssqN0-MN-c/</link>
		<comments>http://blog.helyx.org/2011/06/introduction-aux-nouveautes-de-groovy-1-8-et-grails-1-4/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 22:18:58 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://blog.helyx.org/?p=392</guid>
		<description><![CDATA[Ce mardi 7 juin a eu lieu le Paris Groovy &#38; Grail User Group (GUG) dans les locaux de VMware à la Défense. Nous avons le droit à une présentation de Guillaume Laforge introduisant les nouveautés de Groovy 1.8, ainsi que les fonctionnalités à venir dans Groovy 1.9. Cette présentation très intéressante a déjà été [...]]]></description>
			<content:encoded><![CDATA[<p>Ce mardi 7 juin a eu lieu le Paris Groovy &amp; Grail User Group (GUG) dans les locaux de VMware à la Défense. Nous avons le droit à une présentation de Guillaume Laforge introduisant les nouveautés de Groovy 1.8, ainsi que les fonctionnalités à venir dans Groovy 1.9. Cette présentation très intéressante a déjà été jouée lors de la Gr8Conf 2011 de Copenhague et au S2G Forum 2011 de Londres. Cependant si vous l&#8217;avez ratée, et que vous souhaitez la voir, vous pouvez vous rattraper en visionnant les slides de la présentation sur sur SlideShare à l&#8217;adresse suivante:</p>
<ul>
<li><a href="http://www.slideshare.net/glaforge/groovy-update-s2gforum-london-2011-guillaume-laforge" target="_blank">What&#8217;s new in Groovy 1.8, and What&#8217;s cooking in 1.9!</a></li>
</ul>
<div align="center">
<div style="width:425px" id="__ss_8184912"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/glaforge/groovy-update-s2gforum-london-2011-guillaume-laforge" title="Groovy update - S2GForum London 2011 - Guillaume Laforge">Groovy update &#8211; S2GForum London 2011 &#8211; Guillaume Laforge</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8184912" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/glaforge">Guillaume Laforge</a> </div>
</p></div>
</div>
<p>Nous avons également eu le droit à une présentation animée par Stéphane Maldini en seconde partie introduisant les nouvelles fonctionnalités de Grails 1.4, et il faut bien avouer que cette nouvelle version va envoyer du lourd au niveau killer features. Grails dans sa version 1.4 va proposer de nombreuses fonctions avancées particulièrement tournées vers la productivité.</p>
<div align="center">
<div style="width:425px" id="__ss_8149638"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/gr8conf/gr8conf-2011-grails-14-update-by-peter-ledbrook" title="GR8Conf 2011: Grails 1.4 Update by Peter Ledbrook">GR8Conf 2011: Grails 1.4 Update by Peter Ledbrook</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8149638" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/gr8conf">GR8Conf</a> </div>
</p></div>
</div>
<p>Quelques liens intéressants concernant Grails 1.4 :</p>
<ul>
<li><a href="http://www.grails.org/Roadmap" target="_blank">Grails Roadmap</a></li>
<li><a href="http://blog.springsource.com/2011/06/07/countdown-to-grails-1-4-unit-testing/">Nouveautés Grails 1.4 concernant le support des tests</a></li>
<li><a href="http://grails.org/blog/view/admin/Grails+1.4.0.M1+is+now+available">Grails 1.4.0.M1 est déjà disponible!</a></li>
<li><a href="http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/">Un billet intéressant comparant les prerformances de Grails à d&#8217;autres frameworks web</a>
</li>
</ul>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/gssqN0-MN-c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/06/introduction-aux-nouveautes-de-groovy-1-8-et-grails-1-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/06/introduction-aux-nouveautes-de-groovy-1-8-et-grails-1-4/</feedburner:origLink></item>
		<item>
		<title>Vous reprendrez bien un peu de Git ?</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/cKiO7RH9Yrk/</link>
		<comments>http://blog.helyx.org/2011/04/vous-reprendrez-bien-un-peu-de-git/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 19:12:25 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Scm]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://blog.helyx.org/?p=387</guid>
		<description><![CDATA[Les scm sont incontournables depuis de nombreuses années dans l&#8217;univers du développement informatique, et s&#8217;en passer aujourd&#8217;hui serait pure folie. J&#8217;ai eu l&#8217;occasion de fricoter avec quelques uns d&#8217;entre eux (CVS, Subversion, Mercurial ou bien encore ClearCase). Pendant un temps Subversion semblait être l&#8217;outil incontournable. Comme on dit la roue tourne, aujourd&#8217;hui l&#8217;outil au top [...]]]></description>
			<content:encoded><![CDATA[<p>Les <a href="http://en.wikipedia.org/wiki/Revision_control">scm</a> sont incontournables depuis de nombreuses années dans l&#8217;univers du développement informatique, et s&#8217;en passer aujourd&#8217;hui serait pure folie.</p>
<p>J&#8217;ai eu l&#8217;occasion de fricoter avec quelques uns d&#8217;entre eux (<a href="http://www.nongnu.org/cvs/">CVS</a>, <a href="http://subversion.tigris.org">Subversion</a>, <a href="http://mercurial.selenic.com/">Mercurial</a> ou bien encore <a href="http://www-01.ibm.com/software/awdtools/clearcase/">ClearCase</a>). Pendant un temps Subversion semblait être l&#8217;outil incontournable. Comme on dit la roue tourne, aujourd&#8217;hui l&#8217;outil au top c&#8217;est <a href="http://www.git-scm.com">Git</a>.</p>
<p>Pour avoir joué un peu avec, on peut considérer que <a href="http://www.git-scm.com">Git</a> est très semblable à <a href="http://mercurial.selenic.com/">Mercurial</a> puisque ces deux outils de gestion de source sont de type <a href="http://en.wikipedia.org/wiki/Distributed_revision_control">DVSC</a>. Cependant je n&#8217;avais jamais eu l&#8217;occasion d&#8217;étudier Git plus en profondeur. C&#8217;est maintenant c&#8217;est chose faire grâce à la présentation de Sébastien Douche ( <a href="http://twitter.com/#!/sdouche">@sdouche</a> ) au <a href="http://www.parisjug.org/">ParisJug</a> d&#8217;avril.</p>
<p>Si vous avez manqué la présentation, je vous invite à aller lire le blog de <a href="http://blog.gitfr.net">#gitfr</a>. Le blog est très complet et reprend un certain nombre de thèmes abordés pendant la présentation. Il semble que la présentation devrait être rejouée d&#8217;ici une dizaine de jours. L&#8217;annonce devrait être faite sur le site du <a href="http://www.parisjug.org/">ParisJug</a>. Je vous encourage chaudement  à y assister si vous en avez l&#8217;occasion, d&#8217;autant plus si vous en avez marre de Subversion, puisque vous aurez l&#8217;occasion d&#8217;assister à un enterrement en règle de notre bon vieux Scm.</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/cKiO7RH9Yrk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/04/vous-reprendrez-bien-un-peu-de-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/04/vous-reprendrez-bien-un-peu-de-git/</feedburner:origLink></item>
		<item>
		<title>Lancement du PaaS « Cloud Foundry » par SpringSource</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/9HevR41XOsY/</link>
		<comments>http://blog.helyx.org/2011/04/lancement-du-projet-platform-as-a-service-cloud-foundry/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 18:33:44 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Cloud Foundry]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[SpringSource]]></category>

		<guid isPermaLink="false">http://blog.helyx.org/?p=381</guid>
		<description><![CDATA[Vous n&#8217;avez peut-être pas suivi l&#8217;actualité ces derniers jours, mais SpringSource/WMware vient de lancer une version toute nouvelle de son offre Cloud via le site CloudFoundry.com. Cette offre de type PaaS est basée sur le projet Cloude Foundry, qui n&#8217;est autre qu&#8217;un projet open-source sous licence Apache 2.0 hébergé sur GitHub. A l&#8217;occasion de cette [...]]]></description>
			<content:encoded><![CDATA[<p>Vous n&#8217;avez peut-être pas suivi l&#8217;actualité ces derniers jours, mais SpringSource/WMware vient de lancer une version toute nouvelle de son offre Cloud via le site <a href="http://www.cloudFoundry.com">CloudFoundry.com</a>. Cette offre de type <a href="http://fr.wikipedia.org/wiki/Platform_as_a_service">PaaS</a> est basée sur le projet <a href="http://www.cloudfoundry.org/">Cloude Foundry</a>, qui n&#8217;est autre qu&#8217;un projet open-source sous licence Apache 2.0 hébergé sur <a href="https://github.com/cloudfoundry">GitHub</a>.</p>
<p>A l&#8217;occasion de cette sortie, j&#8217;ai rédigé un billet de présentation de Cloud Foundry sur le <a href="http://blog.xebia.fr">blog de Xebia</a>. Si vous être curieux de ce qui peut se faire aujourd&#8217;hui en terme d&#8217;offre PaaS, je vous invite à aller lire mon article à l&#8217;adresse suivante:</p>
<ul>
<li><a href="http://blog.xebia.fr/2011/04/13/lancement-du-projet-platform-as-a-service-cloud-foundry-de-spring-source/">http://blog.xebia.fr/2011/04/13/lancement-du-projet-platform-as-a-service-cloud-foundry-de-spring-source/</a></li>
</ul>
<p>En vrac, et pour teaser, SpringSource/VMware propose ni plus ni moins qu&#8217;une plateforme Cloud multi-langage: Java, Ruby, JavaScript, et autre langages de la JVM. Dans la foulée la plateforme propose différents supports de stockage de données: Redis (Base Clés/valeurs), MongoDB (Base Document), MySql (Base relationnelle). Il est par exemple possible de créer son application Web avec des frameworks tels que Rails, Grails ou bien encore avec Node.JS.</p>
<p>Tout cela, est bien alléchant et donne envie d&#8217;aller essayer cette offre. A côté de cela, il ne faut pas oublier que SpringSource/VMware propose également en preview une offre Dev at Cloud nommée <a href="http://www.springsource.com/code2cloud">Code2Cloud</a> (Git, BugTracker, Hudson, &#8230;), ainsi qu&#8217;une suite logicielle basée sur Eclipse nommée <a href="http://www.springsource.com/developer/sts">STS</a> (Spring Tool Suite) permettant d&#8217;exploiter parfaitement tous les produit SpringSource/VMware.</p>
<p>Aucun prix n&#8217;a pour le moment été communiqué, l&#8217;essai de la beta de la plateforme est pour le moment gratuit, mais l&#8217;attente d&#8217;activation de son compte semble longue. Vous pouvez toujours vous lancer dans le développer d&#8217;une application basée sur l&#8217;offre de SpringSource/VMware, en démarrant un projet avec STS. Une belle introduction est proposée aux URL suivantes:</p>
<ul>
<li><a href="http://blog.springsource.com/2011/04/12/cloud-foundry-for-spring-developers/">http://blog.springsource.com/2011/04/12/cloud-foundry-for-spring-developers/</a></li>
<li><a href="http://blog.springsource.com/2011/04/13/using-cloud-foundry-from-sts/">http://blog.springsource.com/2011/04/13/using-cloud-foundry-from-sts/</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/9HevR41XOsY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/04/lancement-du-projet-platform-as-a-service-cloud-foundry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/04/lancement-du-projet-platform-as-a-service-cloud-foundry/</feedburner:origLink></item>
		<item>
		<title>Locker son écran sous Mac</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/ZTmxuncYqf4/</link>
		<comments>http://blog.helyx.org/2011/04/locker-son-ecran-sous-mac/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 18:14:06 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://blog.helyx.org/?p=375</guid>
		<description><![CDATA[Les ordinateurs Mac ont pour réputation d&#8217;être intuitifs à l&#8217;usage, toutefois certaines actions simples peuvent devenir des fois très compliquées. Il suffit de faire une recherche sur Google pour se rendre compte que locker son écran sous Mac n&#8217;est pas une action triviale.  Le fameux raccourci Windows+L n&#8217;est pas disponible sous Mac, mais rassurez-vous, une [...]]]></description>
			<content:encoded><![CDATA[<p>Les ordinateurs Mac ont pour réputation d&#8217;être intuitifs à l&#8217;usage, toutefois certaines actions simples peuvent devenir des fois très compliquées. Il suffit de faire une recherche sur Google pour se rendre compte que locker son écran sous Mac n&#8217;est pas une action triviale.  Le fameux raccourci Windows+L n&#8217;est pas disponible sous Mac, mais rassurez-vous, une solution existe&#8230;</p>
<p>Pour cela, il vous suffit d&#8217;aller dans le menu &#8220;Pomme&#8221;, puis dans les &#8220;Préférence Système&#8221;. Une fois la fenêtre ouverte, rendez-vous dans le menu &#8220;Sécurité&#8221; (Première ligne), puis assurez-vous que l&#8217;option: &#8220;Exigez le mot de passe &#8230;&#8221; est sélectionnée. Enfin, choisissez dans la liste déroulante la valeur: &#8220;Immédiatement&#8221;.</p>
<p>&nbsp;</p>
<p><a href="../wp-content/uploads/Capture-d%E2%80%99%C3%A9cran-2011-04-10-%C3%A0-20.04.48.png?PHPSESSID=c66c1047957b281a91c2c367f38f9143"><img class="aligncenter" title="Capture d’écran 2011-04-10 à 20.04.48" src="../wp-content/uploads/Capture-d%E2%80%99%C3%A9cran-2011-04-10-%C3%A0-20.04.48.png" alt="" width="669" height="533" /></a></p>
<p>&nbsp;</p>
<p>Vous êtes maintenant prêt pour utiliser un raccourci clavier pour locker votre PC&#8230; Pardon votre Mac. Il ne nous manques plus que ce fameux précieux pour activer la fonction lock de votre Mac. Pour cela, il vous suffit d&#8217;appuyer sur la combinaison de touches suivante: &#8220;Shift+Ctrl+Eject&#8221;. Vous économiserez au passage votre batterie et sauverez les ours blancs puisque l&#8217;écran se met en veille dans la foulée.</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/ZTmxuncYqf4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/04/locker-son-ecran-sous-mac/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/04/locker-son-ecran-sous-mac/</feedburner:origLink></item>
		<item>
		<title>Mobl: Un DSL pour sites web mobiles</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/oiEMcBAoXMQ/</link>
		<comments>http://blog.helyx.org/2011/03/domain-specific-language-pour-sites-web-mobiles-mobl/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 22:24:24 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Développement web]]></category>
		<category><![CDATA[jQueryMobile]]></category>

		<guid isPermaLink="false">http://blog.helyx.org/?p=360</guid>
		<description><![CDATA[Un article intéressant sorti cette semaine sur InfoQ présente un DSL (Domain Specific Language) spécialement adapté pour le développement de sites mobiles. Mobl est un langage compilé et typé statiquement, il est prévu pour être utilisé travers un plugin Eclipse. Le plugin propose la coloration syntaxique, l&#8217;affichage d&#8217;erreurs, la résolution de références et la complétion [...]]]></description>
			<content:encoded><![CDATA[<p>Un article intéressant sorti cette semaine sur InfoQ présente un DSL (Domain Specific Language) spécialement adapté pour le développement de sites mobiles. </p>
<p>Mobl est un langage compilé et typé statiquement, il est prévu pour être utilisé travers un plugin Eclipse. Le plugin propose la coloration syntaxique, l&#8217;affichage d&#8217;erreurs, la résolution de références et la complétion de code. Le compilateur mobl (intégré à l&#8217;IDE) compile les modules mobl en une combinaison de fichiers HTML, JavaScript et CSS à chaque sauvegarde. </p>
<p>Les application mobl ne reposent pas sur une technologie serveur particulière, elle repose uniquement sur une gestion cliente de l&#8217;application. Le langage supporte les appels de services web JSON asynchrones.</p>
<p>Le langage mobl propose différentes fonctionnalités permettant d&#8217;améliorer la productivité des développeurs mobiles:</p>
<p> &#8211; Interfaces utilisateur spécifiées de façon déclarative.<br />
 &#8211; Gestion de la persistance de données transparantes via la déclaration d&#8217;entités. Les objets sont automatiquement sauvés en base de données, et peuvent être lues sans besoin de requêtage SQL.<br />
 &#8211; Statique en principe, le typage peut être dynamiquement typé. Le typage statique permet à l&#8217;IDe la détection rapides d&#8217;erreurs, la résolution de références, et la complétion de code. Grâce à l&#8217;inférence de type, dans la plupart des cas, il n&#8217;y a pas de besoin de déclaration explicite de types. Le type Dynamic permet l&#8217;utilisation de notions d&#8217;accès à des propriétés et méthodes de façon dynamique.<br />
- Un scripting rédigé dans un style d&#8217;appel synchrone automatiquement transformé en appels asynchrones.</p>
<p>Tout ça donne l&#8217;eau à la bouche, et invite à aller creuser un peu plus ce DSL. Pour cela, je vous invite à aller jeter un coup d&#8217;oeil à l&#8217;article InfoQ qui en propose une bonne présentation/introduction: <a href="http://www.infoq.com/articles/Mobl">http://www.infoq.com/articles/Mobl</a></p>
<p>A quand un DSL facile et rapide à utiliser pour générer un site web mobile en Java? Bien oui, il faut bien satisfaire les java dependants ;)</p>
<p>Mobl propose entre autre des exemples permettant de générer des sites mobiles basés sur jQueryMobile et Sensha Touch</p>
<p>* Le site internet du langage: <a href="http://www.mobl-lang.org/">http://www.mobl-lang.org/</a></p>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/oiEMcBAoXMQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/03/domain-specific-language-pour-sites-web-mobiles-mobl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/03/domain-specific-language-pour-sites-web-mobiles-mobl/</feedburner:origLink></item>
		<item>
		<title>jQuery Mobile Gallery</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/7W2f8fBbQ10/</link>
		<comments>http://blog.helyx.org/2011/03/jquery-mobile-gallery/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 21:58:34 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Développement web]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQueryMobile]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[jquerymobile]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.helyx.org/?p=358</guid>
		<description><![CDATA[jQuery Mobile Gallery est une galerie de sites web mobiles développés, vous l&#8217;aurez deviné, avec la librairie jQueryMobile. Je vous conseille d&#8217;aller y faire un tour si vous être intéressé par cette librairie prometteuse. On peut déjà y trouver une bonne trentaine d&#8217;exemples de site mobiles qui pourront sûrement vous aider à vous donner un [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery Mobile Gallery est une galerie de sites web mobiles développés, vous l&#8217;aurez deviné, avec la librairie jQueryMobile. Je vous conseille d&#8217;aller y faire un tour si vous être intéressé par cette librairie prometteuse. </p>
<p>On peut déjà y trouver une bonne trentaine d&#8217;exemples de site mobiles qui pourront sûrement vous aider à vous donner un bon aperçu de ce vous pouvez faire avec jQueryMobile. Un coup d&#8217;oeil au code source vous aidera à mettre rapidement le pied à l&#8217;étrier si vous souhaitez créer votre propre site mobile.</p>
<p>Vous pouvez visiter la galerie à l&#8217;adresse suivante: <a href="http://www.jqmgallery.com">http://www.jqmgallery.com</a></p>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/7W2f8fBbQ10" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/03/jquery-mobile-gallery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/03/jquery-mobile-gallery/</feedburner:origLink></item>
		<item>
		<title>Sortie de jQueryMobile en version 1.0alpha3 et son grand frère jQuery en version 1.5</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/ZEAz4WaPMjg/</link>
		<comments>http://blog.helyx.org/2011/02/sortie-de-jquerymobile-et-son-grand-frere-jquery/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 17:38:04 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQueryMobile]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[jquerymobile]]></category>

		<guid isPermaLink="false">http://www.helyx.org/?p=353</guid>
		<description><![CDATA[Ces derniers jours ont été prolifiques en news au sujet de l&#8217;écosystème jQuery. Le 31 janvier est sortie la version 1.5.0 de la librairie qui nous propose différentes améliorations intéressantes et sûrement attendues depuis longtemps par bon nombre de développeurs. Les changements principaux de cette version concernent une réécriture complète du support Ajax fournissant une [...]]]></description>
			<content:encoded><![CDATA[<p>Ces derniers jours ont été prolifiques en news au sujet de l&#8217;écosystème jQuery. Le 31 janvier est sortie la version 1.5.0 de la librairie qui nous propose différentes améliorations intéressantes et sûrement attendues depuis longtemps par bon nombre de développeurs.</p>
<p>Les changements principaux de cette version concernent une réécriture complète du support Ajax fournissant une API encore plus efficace et consistante, et l&#8217;intégration d&#8217;un mécanisme qui permet de chaîner différents callbacks sur des appels de fonctions qu&#8217;ils soient asynchrones ou non.</p>
<p>L&#8217;API Ajax fournit maintenant un object jqXHR retourné par l&#8217;appel de la méthode jQuery.ajax() qui permet de gérer de façon consistante l&#8217;objet XMLHttpRequest quelque soit la plateforme utilisée. Par exemple, il est maintenant possible d&#8217;annuler facilement une requête JSONP ce qui n&#8217;était pas le cas auparavant.</p>
<pre class="brush: javascript">
// Assign handlers immediately after making the request,
// and remember the jxhr object for this request
var jxhr = $.ajax({ url: &amp;amp;amp;quot;example.php&amp;amp;amp;quot; })
.success(function() { alert(&amp;amp;amp;quot;success&amp;amp;amp;quot;); })
.error(function() { alert(&amp;amp;amp;quot;error&amp;amp;amp;quot;); })
.complete(function() { alert(&amp;amp;amp;quot;complete&amp;amp;amp;quot;); });

// perform other work here ...

// Set another completion function for the request above
jxhr.complete(function(){ alert(&amp;amp;amp;quot;second complete&amp;amp;amp;quot;); });
</pre>
<p>Une explication complète du mécanisme appelé: &#8216;<a href="http://api.jquery.com/category/deferred-object/" title="Deferred Objects" >Deferred Objects</a>&#8216; est disponible sur le site de <a href="http://www.jquery.com" title="jQuery" >jQuery</a>.</p>
<p>jQuery expose maintenant, par le biais de la méthode <a href="http://api.jquery.com/jQuery.sub/" title="jQuery.sub()" >jQuery.sub()</a> un moyen simple de créer et modifier un clone de jQuery dans la même page sans pour autant interférer avec la déclaration par défaut. il est ainsi possible d&#8217;overrider des méthodes natives jQuery sans craindre d&#8217;incompatibilité avec d&#8217;autres scripts d&#8217;une même page basée sur jQuery. Cela rend aisé l&#8217;écriture d&#8217;API basées sur jQuery sans risquer une collision de namespaces.</p>
<pre class="brush: javascript">
(function(){
var sub$ = jQuery.sub();

sub$.fn.myCustomMethod = function(){
      return &#039;just for me&#039;;
    };

sub$(document).ready(function() {
      sub$(&#039;body&#039;).myCustomMethod() // &#039;just for me&#039;
    });
})();

typeof jQuery(&#039;body&#039;).myCustomMethod // undefined
</pre>
<p>Cette version inclut également des améliorations de performance puisque la gestion de certaines méthodes de traversée de l&#8217;arbre DOM ont largement été optimisées comme les méthodes: .children(), .prev(), and .next(). Ces améliorations sont particulièrement importantes sous webkit (Chrome et Safari), mais elles sont également intéressantes sous Internet Explorer, puisqu&#8217;elles permettent de faire décoller un peu les performances de notre cher navigateur.</p>
<p>A ce jour quelques 4500 tests passent avec succès sur un nombre impressionnant de browsers (dont IE6, mais également Firebox 4 beta), ce qui pousse au respect au vue de l&#8217;hétérogénéité de ce joyeux petit monde.</p>
<p>Pour finir sur une note intéressante, le système de build de jQuery est maintenant basé sur l&#8217;environnement serveur JavaScript: <a href="http://nodejs.org/" title="NodeJS" >NodeJS</a>, ce qui est plutôt original, mais qui permet au navigateur de réduire sa dépendance envers Java/Rhino, et de se tourner vers de nouvelles solutions JavaScript innovantes.</p>
<p>Une road map de la librairie est disponible à l&#8217;adresse suivante: <a href="http://docs.jquery.com/Roadmap" title="httpdocsjquerycomRoadmap" >http://docs.jquery.com/Roadmap</a>.</p>
<p>Presque 3 longs mois après la sortie de la version précédente, jQuery Mobile vient de sortir sa troisième version alpha, accompagnant à une semaine d&#8217;intervalle la release de son grand frère jQuery en version 1.5.0. L&#8217;attente ne fut pas vaine, puisque de nombreuses améliorations sont au rendez-vous:</p>
<ul>
<li>Quelques 150 bugs fixés, environs 250 nouveaux tests unitaires</li>
<li>Une amélioration substantielle de la navigation et du core de la librairie</li>
<li>Un support de première classe pour de nouveaux browsers mobiles: Firefox Mobile (Fennec), Opera Mobile / Mini. Un support de première classe est également proche pour les plateformes Windows Phone 7 et Nokia.</li>
<li>Un support amélioré des browsers des plateformes iOS, Android, BlackBerry 6, Palm WebOS, et de nose browsers de bureau.</li>
<li>La prise en charge d&#8217;un date picker, non packagé dans la version. La prise en charge de nouveaux composants devrait arriver dans les prochaines versions (Progress Bar, Spinner, Time Picket)</li>
<li>La prise en charge du clavier a été améliorée et permet de mieux simuler un comportement natif au sein du navigateur.</li>
<li>De très nombreuses autres améliorations ont été intégrées à cette version. Une liste exhaustive peut être trouvée sur le blog de <a href="http://jquerymobile.com/2011/02/jquery-mobile-alpha-3-released/" title="jQuery Mobile" >jQuery Mobile</a>.</li>
</ul>
<p>Ce qu&#8217;il faut retenir également, c&#8217;est l&#8217;annonce d&#8217;une bêta dans le mois qui va suivre, puis la sortie de la release 1.0 dans la foulée. Les objectifs fixés sont d&#8217;améliorer les performances générales de la librairie,<br />
d&#8217;améliorer l&#8217;expérience utilisateur et la réactivité, et de fournir un support à un nombre plus important de browsers et plateformes mobiles. Bien que le sujet ne soit pas vraiment abordé dans le billet de l&#8217;annonce de cette sortie, on devrait également voir dans un avenir proche, une meilleure prise en charge de nos chères tablettes: iPad, PlayBook, et compagnie (après la sortie de la 1.0 ?).</p>
<p>Bien que l&#8217;annonce de cette release soit réjouissante pour le monde des développeurs mobiles, il n&#8217;en reste pas moins vrai que le niveau de performance souffre encore fortement la comparaison avec les applications natives (Gestion de liste), et la gestion de la navigation entre les différents écrans présente encore quelques dysfonctionnements. Il n&#8217;y a pas de doute que ce type de défauts seront rapidement gommés avec la sortie des prochaines versions.</p>
<p>Vous pouvez retrouvez ces informations sur le site de <a href="http://jquerymobile.com" title="jQuery Mobile" >jQuery Mobile</a>, leur <a href="http://jquerymobile.com/blog" title="blog" >blog</a> et les suivre sur twitter via le compte: <a href="http://twitter.com/jquerymobile" title="jquerymobile" >@jquerymobile</a>.</p>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/ZEAz4WaPMjg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2011/02/sortie-de-jquerymobile-et-son-grand-frere-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2011/02/sortie-de-jquerymobile-et-son-grand-frere-jquery/</feedburner:origLink></item>
		<item>
		<title>Créer un composant Apache Camel de connexion à l’APNS – 3 sur 3</title>
		<link>http://feedproxy.google.com/~r/helyx/rss/~3/lqLVi7ABcaA/</link>
		<comments>http://blog.helyx.org/2010/11/creer-un-composant-apache-camel-de-connexion-a-l%e2%80%99apns-%e2%80%93-3-sur-3/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 07:00:46 +0000</pubDate>
		<dc:creator>Alexis Kinsella</dc:creator>
				<category><![CDATA[Camel]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Apns]]></category>
		<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://www.helyx.org/?p=314</guid>
		<description><![CDATA[Nous avons vu dans un premier article comment initier le développement d&#8217;un composant Apache Camel, puis dans un second comment implémenter ses différentes classes. A ce stade de notre développement nous sommes déjà en mesure d&#8217;utiliser pleinement notre composant, mais nous ne pouvons pas encore en assurer sa qualité. Pour cela, il est nécessaire d&#8217;ajouter [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons vu dans un <a href="http://www.helyx.org/archives/318" title="premier article" >premier article</a> comment initier le développement d&#8217;un composant Apache Camel, puis dans un <a href="http://www.helyx.org/archives/316" title="second article" >second</a> comment implémenter ses différentes classes. </p>
<p>A ce stade de notre développement nous sommes déjà en mesure d&#8217;utiliser pleinement notre composant, mais nous ne pouvons pas encore en assurer sa qualité. Pour cela, il est nécessaire d&#8217;ajouter à notre composant différentes classes de test. Bien que la testabilité de frameworks d&#8217;intégration puisse parfois paraître difficile, le projet Apache Camel fournit tous les outils nécessaires permettant de répondre à ce besoin. Nous verrons donc dans cet article comment tester le composant que nous avons développé. </p>
<p>Pour finir, nous verrons comment intégrer notre développement à un projet Camel, ainsi que les limites de notre composant et les solutions pour résoudre ces limitations.</p>
<h3><a name="TesterlaclasseApnsConsumer"></a>Tester la classe ApnsConsumer</h3>
<p>Bien que le projet Apache Camel permette de travailler naturellement avec Spring, nous nous attarderons dans un premier temps sur les méthodes permettant de tester notre composant sur un mode standalone. Pour cela, nous étendrons la classe <em>CamelTestSupport</em>. Cette dernière fournit les méthodes nécessaires pour effectuer différentes assertions sur les valeurs attendues en fin de traitement, en particulier sur des endpoints de type <em>MockEndpoint</em>.</p>
<p>Nous devons tout d&#8217;abord implémenter les 2 méthodes suivantes:</p>
<table class="tablo">
<thead>
<th> Méthode </th>
<th> Description </th>
</thead>
<tbody>
<tr>
<td> createCamelContext() </td>
<td> Permet de créer le contexte Camel qui sera utilisé par le test </td>
</tr>
<tr>
<td> createRouteBuilder() </td>
<td> Permet de construire la route qui sera appelée par le test. Idéalement, la route doit se terminer par l&#8217;appel d&#8217;un MockEpoint </td>
</tr>
</tbody>
</table>
<p>Avant l&#8217;exécution de nos tests, un serveur APNS bouchonné doit être lancé. Il enverra sur le flux feedback des données factices.</p>
<p>L&#8217;objectif de ce test est de valider que le endpoint <em>apns:consumer</em> est capable de consommer les informations de test renvoyées par le flux feedback du serveur bouchonné. Le endpoint Camel <em>mock:result</em> nous permet de valider les assertions nécessaires sur les messages reçus par ce endpoint.</p>
<p>Le endpoint <em>apns:consumer</em> est configuré pour poller le flux feedback de l&#8217;APNS toutes les 500ms. Le test ne doit donc pas durer raisonnablement plus de 5 secondes en tenant compte du temps d&#8217;attente d&#8217;une seconde avant les assertions et du temps de démarrage du serveur bouchon APNS. Un timeout de 5 secondes est donc placé sur le test pour s&#8217;assurer que ce dernier tombe en erreur si un événement bloquant inattendu empêche le test de se terminer.</p>
<pre class="brush: java">
public class ApnsConsumerTest extends CamelTestSupport {

    ApnsServerStub server;

    public ApnsConsumerTest() {
    	super();
    }

    /**
     * Démarrage du serveur bouchonné simulant l&#039;APNS
     */
    @Before
    public void startup() throws InterruptedException {
        server = ApnsServerStub.prepareAndStartServer(FixedCertificates.TEST_GATEWAY_PORT, FixedCertificates.TEST_FEEDBACK_PORT);
    }

    /**
     * Arrêt du serveur bouchonné simulant l&#039;APNS
     */
    @After
    public void stop() {
        server.stop();
    }

    /**
     * Test de l&#039;ApnsConsumer. L&#039;objectif est de vérifier que le flux feedback est
     * bien consommé par la route Camel. Pour cela on vérifie après consommation
     * que le endpoint MockEndpoint a bien reçu les messages.
     */
    @Test(timeout=5000)
    public void testConsumer() throws Exception {

    	byte[] deviceTokenBytes = ApnsUtils.createRandomDeviceTokenBytes();
        String deviceToken = ApnsUtils.encodeHexToken(deviceTokenBytes);

        MockEndpoint mock = getMockEndpoint(&quot;mock:result&quot;);
        mock.expectedMessageCount(1);
        mock.message(0).body().isInstanceOf(InactiveDevice.class);

        byte[] feedBackBytes = ApnsUtils.generateFeedbackBytes(deviceTokenBytes);
        server.toSend.write(feedBackBytes);

        Thread.sleep(1000);

        assertMockEndpointsSatisfied();

        InactiveDevice inactiveDevice = (InactiveDevice)mock.getExchanges().get(0).getIn().getBody();
        assertNotNull(inactiveDevice);
        assertNotNull(inactiveDevice.getDate());
        assertNotNull(inactiveDevice.getDeviceToken());
        assertEquals(deviceToken, inactiveDevice.getDeviceToken());
    }

    /**
     * Création et configuration du contexte Camel avec une configuration de test.
     * Enregistrement du composant APNS, et configuration de l&#039;ApnsService
     */
    protected CamelContext createCamelContext() throws Exception {
        CamelContext camelContext = super.createCamelContext();

        ApnsServiceFactory apnsServiceFactory = ApnsUtils.createDefaultTestConfiguration();
        ApnsService apnsService = apnsServiceFactory.getApnsService();

        ApnsComponent apnsComponent = new ApnsComponent(apnsService);

        camelContext.addComponent(&quot;apns&quot;, apnsComponent);

        return camelContext;
    }

    /**
     * Création de la route Camel permettant de simuler la consommation du flux
     * feedback de l&#039;APNS
     */
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from(&quot;apns:consumer?initialDelay=500&amp;amp;amp;amp;amp;delay=500&amp;amp;amp;amp;amp;timeUnit=MILLISECONDS&quot;)
                	.to(&quot;log:com.apache.camel.component.apns?showAll=true&amp;amp;amp;amp;amp;multiline=true&quot;)
                	.to(&quot;mock:result&quot;);
            }
        };
    }

}
</pre>
<h3><a name="TesterlaclasseApnsProducer"></a>Tester la classe ApnsProducer</h3>
<p>De la même façon que nous nous y sommes pris pour la classe de test <em>ApnsConsumerTest</em>, nous allons étendre la classe <em>CamelTestSupport</em> pour tester notre classe <em>ApnsProducer</em>. L&#8217;objectif est de vérifier que le serveur bouchonné reçoit bien les messages produits.</p>
<pre class="brush: java">
public class ApnsProducerTest extends CamelTestSupport {

    private ApnsServerStub server;
    private String FAKE_TOKEN = &quot;19308314834701ACD8313AEBD92AEFDE192120371FE13982392831701318B943&quot;;

    public ApnsProducerTest() {
    	super();
    }

    /**
     * Démarrage du serveur bouchonné simulant l&#039;APNS
     */
    @Before
    public void startup() {
        server = ApnsServerStub.prepareAndStartServer(FixedCertificates.TEST_GATEWAY_PORT, FixedCertificates.TEST_FEEDBACK_PORT);
    }

    /**
     * Arrêt du serveur bouchonné simulant l&#039;APNS
     */
    @After
    public void stop() {
        server.stop();
    }

    /**
     * Test de l&#039;ApnsProducer. L&#039;objectif est de vérifier que le serveur APNS a
     * bien reçu les notifications envoyées.
     * Pour cela on vérifie après production des notifications que le serveur bouchonné
     * a bien reçu les messages: On s&#039;assure que les tableaux de bytes de la notification
     * produite et du contenu reçu par le serveur sont bien égaux.
     */
    @Test(timeout=2000)
    public void testProducer() throws Exception {
    	String message = &quot;Hello World&quot;;
    	String messagePayload = APNS.newPayload().alertBody(message).build();

        ApnsNotification apnsNotification = new ApnsNotification(FAKE_TOKEN, messagePayload);
        server.stopAt(apnsNotification.length());

        template.sendBody(&quot;direct:test&quot;, message);

        server.messages.acquire();
        assertArrayEquals(apnsNotification.marshall(), server.received.toByteArray());
    }

    /**
     * Création et configuration du contexte Camel avec une configuration de test.
     * Enregistrement du composant APNS, et configuration de l&#039;ApnsService
     */
    protected CamelContext createCamelContext() throws Exception {
        CamelContext camelContext = super.createCamelContext();

        ApnsServiceFactory apnsServiceFactory = ApnsUtils.createDefaultTestConfiguration();
        ApnsService apnsService = apnsServiceFactory.getApnsService();

        ApnsComponent apnsComponent = new ApnsComponent(apnsService);
        camelContext.addComponent(&quot;apns&quot;, apnsComponent);

        return camelContext;
    }

    /**
     * Création de la route Camel permettant de simuler la production de messages
     * à destination des serveurs APNS.
     */
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from(&quot;direct:test&quot;).
                setHeader(ApnsConstants.HEADER_TOKENS, constant(FAKE_TOKEN)).
                to(&quot;apns:notify&quot;);
            }
        };
    }
}
</pre>
<h3><a name="TesterlintgrationduncomposantC"></a>Tester l&#8217;intégration d&#8217;un composant Camel avec Spring</h3>
<p>Les configurations Camel sont souvent déclarées par des fichiers de configuration Spring. C&#8217;est pourquoi il est nécessaire de tester l&#8217;intégration du composant dans une configuration Spring. Un bon moyen d&#8217;automatiser ce type de test est d&#8217;utiliser les classes de support JUnit fournies par Spring ( _AbstractJUnit4SpringContextTests_ ).</p>
<p>L&#8217;ensemble de la configuration est déclarée dans le fichier <em>SpringApnsConsumerTest-context.xml</em> associé au test unitaire. Les différents beans utilisés par la classe de test sont injectés via les annotations <em>@Autowired</em> et <em>@EndpointInject(uri = &#8220;mock:result&#8221;)</em>.</p>
<pre class="brush: xml">
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xmlns:camel=&quot;http://camel.apache.org/schema/spring&quot;
       xsi:schemaLocation=&quot;
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd&quot;&gt;

	&lt;bean id=&quot;apnsServiceFactory&quot; class=&quot;org.apache.camel.component.apns.factory.ApnsServiceFactory&quot;&gt;
		&lt;property name=&quot;feedbackHost&quot; value=&quot;localhost&quot; /&gt;
		&lt;property name=&quot;feedbackPort&quot; value=&quot;7843&quot; /&gt;
		&lt;property name=&quot;gatewayHost&quot; value=&quot;localhost&quot; /&gt;
		&lt;property name=&quot;gatewayPort&quot; value=&quot;7654&quot; /&gt;
		&lt;property name=&quot;sslContext&quot; ref=&quot;sslContext&quot; /&gt;
	&lt;/bean&gt;

	&lt;!-- Déclaration de l&#039;ApnsService, utilisé par l&#039;ApnsComponent --&gt;
	&lt;bean id=&quot;apnsService&quot; factory-bean=&quot;apnsServiceFactory&quot; factory-method=&quot;getApnsService&quot; /&gt;

	&lt;bean id=&quot;sslContext&quot; class=&quot;org.apache.camel.component.apns.util.FixedCertificates&quot; factory-method=&quot;clientContext&quot;/&gt;

	&lt;!-- Déclaration de l&#039;ApnsComponent. Le scheme utilisé pour la création des endpoints --&gt;
	&lt;!-- sera l&#039;Id utilisé pour la création du bean --&gt;
	&lt;bean id=&quot;apns&quot; class=&quot;org.apache.camel.component.apns.ApnsComponent&quot;&gt;
		&lt;property name=&quot;apnsService&quot; ref=&quot;apnsService&quot; /&gt;
	&lt;/bean&gt;

	&lt;!-- Déclaration du context Camel, et de la route de test: &#039;apns-test&#039; --&gt;
	&lt;!-- Les message reçus par le flux feedback seront envoyés vers le endpoint mock:result --&gt;
	&lt;camelcontext id=&quot;camel-apns-test&quot; xmlns=&quot;http://camel.apache.org/schema/spring&quot;&gt;

		&lt;route id=&quot;apns-test&quot;&gt;
			&lt;from uri=&quot;apns:consumer?initialDelay=500&amp;amp;amp;amp;amp;delay=500&amp;amp;amp;amp;amp;timeUnit=MILLISECONDS&quot; /&gt;
			&lt;to uri=&quot;log:org.apache.camel.component.apns?showAll=true&amp;amp;amp;amp;amp;multiline=true&quot; /&gt;
			&lt;to uri=&quot;mock:result&quot; /&gt;
		&lt;/route&gt;

	&lt;/camelcontext&gt;

&lt;/beans&gt;
</pre>
<p>Une fois la déclaration du composant Camel effectuée via le fichier de configuration Spring, il ne reste plus qu&#8217;à injecter les différents beans configurés dans les propriétés de la classe de test. Le contenu du test en lui-même reste identique, cependant la partie configuration a disparu ce qui rend le test plus lisible. Afin de faire disparaître du test ce qui peut encore en parasiter sa lisibilité, une classe de test parent peut être créée pour contenir les méthodes d&#8217;initialisation et d&#8217;arrêt du serveur APNS de test.</p>
<pre class="brush: java">
@ContextConfiguration
public class SpringApnsConsumerTest extends AbstractJUnit4SpringContextTests {

    ApnsServerStub server;

    /**
     * Injection du context Camel déclaré via Spring
     */
    @Autowired
    protected CamelContext camelContext;

    /**
     * Injection du endpoint Camel &quot;mock:result&quot; déclaré via Spring
     */
    @EndpointInject(uri = &quot;mock:result&quot;)
    protected MockEndpoint mock;

    public SpringApnsConsumerTest() {
    	super();
    }

    /**
     * Démarrage du serveur bouchonné simulant l&#039;APNS
     */
    @Before
    public void startup() throws InterruptedException {
        server = ApnsServerStub.prepareAndStartServer(FixedCertificates.TEST_GATEWAY_PORT, FixedCertificates.TEST_FEEDBACK_PORT);
    }

    /**
     * Arrêt du serveur bouchonné simulant l&#039;APNS
     */
    @After
    public void stop() {
        server.stop();
    }

    /**
     * Test du consommateur
     */
    @Test(timeout=5000)
    public void testConsumer() throws Exception {

    	byte[] deviceTokenBytes = ApnsUtils.createRandomDeviceTokenBytes();
        String deviceToken = ApnsUtils.encodeHexToken(deviceTokenBytes);

        mock.expectedMessageCount(1);
        mock.message(0).body().isInstanceOf(InactiveDevice.class);

        byte[] feedBackBytes = ApnsUtils.generateFeedbackBytes(deviceTokenBytes);
        server.toSend.write(feedBackBytes);

        Thread.sleep(1000);

        mock.assertIsSatisfied();

        InactiveDevice inactiveDevice = (InactiveDevice)mock.getExchanges().get(0).getIn().getBody();
        Assert.assertNotNull(inactiveDevice);
        Assert.assertNotNull(inactiveDevice.getDate());
        Assert.assertNotNull(inactiveDevice.getDeviceToken());
        Assert.assertEquals(deviceToken, inactiveDevice.getDeviceToken());
    }

}
</pre>
<h3><a name="Limitationsducomposantactuel"></a>Limitations du composant actuel</h3>
<p>Dans un soucis de simplicité, le composant présenté est limité fonctionnellement et ne propose qu&#8217;un ensemble réduit de fonctionnalités. L&#8217;implémentation proposée dans ce billet nous oblige à déclarer les tokens à notifier directement au niveau de la route. Cependant une implémentation plus complète pourrait permettre d&#8217;exploiter des en-têtes par exemple pour rendre la sélection de token à notifier plus dynamique. </p>
<p>Heureusement, la richesse du framework Apache Camel nous permet de passer outre cette restriction et d&#8217;obtenir l&#8217;aspect dynamique souhaité en utilisant le pattern <a href="http://camel.apache.org/recipient-list.html" title="Recipient List" >Recipient List</a>, qui permet par exemple l&#8217;extraction des URIs de destination depuis un en-tête de message produit au préalable.</p>
<pre class="brush: java">
RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        from(&quot;direct:a&quot;).recipientList(
        header(&quot;recipientListHeader&quot;).tokenize(&quot;,&quot;));
    }
};
</pre>
<p>Dans cet exemple, l&#8217;en-tête <em>recipientListHeader</em> contiendrait les différentes URIs séparées par des virgules.</p>
<h3><a name="Utilisationducomposantdansunpr"></a>Utilisation du composant dans un projet</h3>
<p>Pour utiliser le composant développé dans cette série d&#8217;articles, il suffit de l&#8217;importer en tant que dépendance Maven dans votre projet Camel et de déclarer le repository qui permettra de le charger à défaut de l&#8217;avoir déjà dans son répository local.</p>
<p>Ce qui donne les lignes suivantes à ajouter dans le pom de votre projet:</p>
<ul>
<li>La dépendance Maven:</li>
</ul>
<pre class="brush: xml">
&lt;dependency&gt;
    &lt;groupid&gt;org.apache.camel&lt;/groupid&gt;
    &lt;artifactid&gt;camel-apns&lt;/artifactid&gt;
    &lt;version&gt;2.4.0&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<ul>
<li>Le repository Maven qui met à disposition le composant:</li>
</ul>
<pre class="brush: xml">
&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;camel-apns.repo-release&lt;/id&gt;
        &lt;url&gt;http://camel-apns.googlecode.com/svn/maven/public/repository/release/&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
</pre>
<h3><a name="Exemplesdutilisation"></a>Exemples d&#8217;utilisation</h3>
<p>Afin de donner une vision synthétique de l&#8217;usage de notre composant, voici un condensé de quelques exemples d&#8217;utilisation:</p>
<ul>
<li>Consommation du flux feedback avec une configuration Java </li>
</ul>
<pre class="brush: java">
      from(&quot;apns:consumer&quot;)
            .to(&quot;log:com.apache.camel.component.apns?showAll=true&amp;amp;amp;amp;amp;multiline=true&quot;)
            .to(&quot;mock:result&quot;);
</pre>
<ul>
<li>Envoi de notifications avec une configuration Java</li>
</ul>
<pre class="brush: java">
      from(&quot;direct:test&quot;)
            .setHeader(ApnsConstants.HEADER_TOKENS, constant(FAKE_TOKEN))
            to(&quot;apns:notify&quot;);
</pre>
<ul>
<li>Envoi d&#8217;une notification avec une configuration Spring</li>
</ul>
<pre class="brush: xml">
&lt;camelcontext id=&quot;camel-apns-test&quot; xmlns=&quot;http://camel.apache.org/schema/spring&quot;&gt;

	&lt;route id=&quot;apns-test&quot;&gt;
		&lt;from uri=&quot;apns:consumer&quot; /&gt;
		&lt;to uri=&quot;log:org.apache.camel.component.apns?showAll=true&amp;amp;amp;amp;amp;multiline=true&quot; /&gt;
		&lt;to uri=&quot;mock:result&quot; /&gt;
	&lt;/route&gt;

&lt;/camelcontext&gt;
</pre>
<h3><a name="Conclusion"></a>Conclusion</h3>
<p>Nous avons vu dans cet article comment créer et tester un composant Camel qui communique avec les serveurs de notifications d&#8217;Apple. Les API du framework ont été pensées pour faciliter le développement de nouveaux composants, et vous permettront d&#8217;implémenter et de tester facilement les composants dont vous avez besoin. Vous pouvez consulter le code source du composant camel-apns présenté dans cette série d&#8217;article sur sa page <a href="http://code.google.com/p/camel-apns" title="Google code - Projet camel-apns" >Google Code</a>.</p>
<h3><a name="Liensutiles"></a>Liens utiles</h3>
<p>Le site google code du composant &#8216;camel-apns&#8217; présenté dans le billet:</p>
<ul>
<li><a href="http://code.google.com/p/camel-apns" title="httpcodegooglecompcamelapns" >http://code.google.com/p/camel-apns</a></li>
</ul>
<p>D&#8217;autres liens utiles sur le développement de composants Camel:</p>
<ul>
<li><a href="http://camel.apache.org/testing.html" title="Crer des tests unitaires Apache Camel" >Créer des tests unitaires Apache Camel</a></li>
<li><a href="http://camel.apache.org/test.html" title="Tester un composant Apache Camel" >Tester un composant Apache Camel</a></li>
</ul>
<p>Précédentes parties de l&#8217;article:</p>
<ul>
<li><a href="http://www.helyx.org/archives/314" title="Crer un composant Apache Camel de connexion  lAPNS  1 sur 3" >Créer un composant Apache Camel de connexion à l&#8217;APNS &#8211; 1 sur 3</a></li>
<li><a href="http://www.helyx.org/archives/316" title="Crer un composant Apache Camel de connexion  lAPNS  2 sur 3" >Créer un composant Apache Camel de connexion à l&#8217;APNS &#8211; 2 sur 3</a></li>
</ul>
<style type="text/css">table.tablo { border-collapse:collapse; border: 1px solid #6C626C; width:95%; font: normal normal normal 1.1em/normal Arial, sans-serif; } table.tablo thead { background: #EFEFEF; border-bottom: 1px solid #6C626C; border-top: 1px solid #6C626C; color: #4F2F4F; } table.tablo thead th { padding: 5px; } table.tablo tbody tr { border: 1px solid #6C626C; } table.tablo tbody tr td { padding: 5px; }</style>
<img src="http://feeds.feedburner.com/~r/helyx/rss/~4/lqLVi7ABcaA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.helyx.org/2010/11/creer-un-composant-apache-camel-de-connexion-a-l%e2%80%99apns-%e2%80%93-3-sur-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.helyx.org/2010/11/creer-un-composant-apache-camel-de-connexion-a-l%e2%80%99apns-%e2%80%93-3-sur-3/</feedburner:origLink></item>
	</channel>
</rss>

