<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://batmat.net/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Blogounage - java</title>
  <link>http://batmat.net/blog/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Sat, 28 Jan 2012 08:26:48 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Comment connaître la provenance d'une classe programmatiquement en Java</title>
    <link>http://batmat.net/blog/post/2010/01/13/Comment-connaitre-la-provenance-dune-classe-programmatiquement-en-java</link>
    <guid isPermaLink="false">urn:md5:385aa81317cbad2421f8b6bee62487eb</guid>
    <pubDate>Wed, 13 Jan 2010 18:07:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>java</category><category>programmation</category>    
    <description>    &lt;p&gt;Il est possible par programmation de savoir d'où vient une classe&amp;nbsp;: un jar&amp;nbsp;? un répertoire&amp;nbsp;? autre&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Use case classique&amp;nbsp;: vous pensez (et devez) ne plus avoir les commons-logging nulle part dans votre classpath, parce que vous êtes (intelligemment :-)) passés à &lt;a href=&quot;http://www.slf4j.org&quot;&gt;SLF4J&lt;/a&gt;. Malgré cela, il semble que cette fichue classe soit toujours trouvée, mais vous n'arrivez pas à savoir dans quel jar (ou quel répertoire si vous travaillez directement avec les .class). Résultat, ça vous fout un bazar monstre dans la configuration de vos logs. Certains continuent à apparaitre alors que vous avez demandé à ce qu'ils ne soient pas affichés...&lt;/p&gt;


&lt;p&gt;Le code est un peu sioux, alors je le mets ici au cas où ça vous servirait&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;a href=&quot;http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;me1&quot;&gt;out&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MaClasse.&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getProtectionDomain&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getCodeSource&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getLocation&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;MAJ du 15/03/2010&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Suite à l'incompréhension ci-dessous, voici quelques exemples pour illustrer ce que fait ce code&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Le code&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;a href=&quot;http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;me1&quot;&gt;out&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;org.&lt;span class=&quot;me1&quot;&gt;springframework&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;mail&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;MailSender&lt;/span&gt;.&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getProtectionDomain&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getCodeSource&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getLocation&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;a href=&quot;http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;me1&quot;&gt;out&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MyJunitTest.&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getProtectionDomain&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getCodeSource&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;getLocation&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Affiche sous Windows&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
file:/C:/m2repository/org/springframework/spring-context-support/2.5.6/spring-context-support-2.5.6.jar
file:/C:/tests/myproject-core/target/test-classes/
&lt;/pre&gt;


&lt;p&gt;J'espère que l'utilité est un peu plus claire à présent.&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2010/01/13/Comment-connaitre-la-provenance-dune-classe-programmatiquement-en-java#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2010/01/13/Comment-connaitre-la-provenance-dune-classe-programmatiquement-en-java#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/315</wfw:commentRss>
      </item>
    
  <item>
    <title>JSR 330 : Dependency Injection for Java</title>
    <link>http://batmat.net/blog/post/2009/05/29/JSR-330-%3A-Dependency-Injection-for-Java</link>
    <guid isPermaLink="false">urn:md5:6f157b7ab224a25772b80ee713f1d35a</guid>
    <pubDate>Fri, 29 May 2009 09:57:00 +0200</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>guice</category><category>injection de dépendances</category><category>java</category><category>spring</category>    
    <description>    &lt;p&gt;Récemment, SpringSource (Rod Johnson, créateur de Spring) et Google (Bob Lee, coauteur de Guice) lançaient une &lt;a href=&quot;http://docs.google.com/Doc?id=dd2fhx4z_13cw24s7dj&quot; hreflang=&quot;en&quot;&gt;proposition de &lt;acronym title=&quot;Java Specification Request&quot;&gt;JSR&lt;/acronym&gt; visant à standardiser un jeu d'annotations pour gérer l'injection de dépendances&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Cette proposition, « &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=330&quot;&gt;Dependency Injection for Java&lt;/a&gt; », est devenue une véritable JSR depuis 3 jours.&lt;/p&gt;


&lt;p&gt;Personnellement, j'ai hâte de voir ce qui va ressortir de ce travail. Notamment, je regarderai attentivement en quoi cela complètera ou s'intégrera avec les annotations de &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=250&quot;&gt;common annotations&lt;/a&gt; (JSR 250, dont sont notamment issues @PostConstruct, @PreDestroy, @Resource) et éventuellement les annotations de la spécification des EJB3 (@TransactionAttribute, notamment).&lt;/p&gt;


&lt;p&gt;Comme la spécification sera développée avec un &lt;acronym title=&quot;Source Control Manager&quot;&gt;scm&lt;/acronym&gt; et une liste de diffusion accessibles publiquement, j'essaierai de vous en dire plus à ce sujet dès que possible.&lt;/p&gt;


&lt;p&gt;À suivre.&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2009/05/29/JSR-330-%3A-Dependency-Injection-for-Java#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2009/05/29/JSR-330-%3A-Dependency-Injection-for-Java#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/307</wfw:commentRss>
      </item>
    
  <item>
    <title>Java User Group Toulouse</title>
    <link>http://batmat.net/blog/post/2009/01/30/Java-User-Group-Toulouse</link>
    <guid isPermaLink="false">urn:md5:272da35830a840e07e961c9acf912048</guid>
    <pubDate>Fri, 30 Jan 2009 10:10:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>java</category><category>jug</category><category>user group</category>    
    <description>    &lt;p&gt;Via &lt;a href=&quot;http://www.dng-consulting.com/blogs/index.php/2009/01/30/olaeacute-craeacute-ation-du-jug-toulous?blog=1&quot;&gt;Sami&lt;/a&gt;, j'apprends ce matin que ça y est, le &lt;a href=&quot;http://www.jugtoulouse.org/&quot;&gt;JUG Toulouse&lt;/a&gt; est né.
Je me suis d'ores et déjà inscrit à liste de diffusion.&lt;/p&gt;


&lt;p&gt;J'espère que je trouverai le temps de participer à ce groupe malgré les importants travaux à faire dans la maison que nous venons d'acheter.&lt;/p&gt;


&lt;p&gt;PS&amp;nbsp;: Sami, merci encore pour la bétonnière :-).&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2009/01/30/Java-User-Group-Toulouse#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2009/01/30/Java-User-Group-Toulouse#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/299</wfw:commentRss>
      </item>
    
  <item>
    <title>How to retrieve the Hibernate Session from the EntityManager interface</title>
    <link>http://batmat.net/blog/post/2008/07/13/How-to-retrieve-the-Hibernate-Session-from-the-EntityManager-interface</link>
    <guid isPermaLink="false">urn:md5:318777f7c82d121b408a1abb41df548f</guid>
    <pubDate>Sun, 13 Jul 2008 23:42:00 +0200</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>ejb3</category><category>hibernate</category><category>java</category><category>jpa</category>    
    <description>    &lt;p&gt;Well, as I myself fell into this stupid gap, I guess I'll try to help. I was quite pushed in this trap by a fallacious part of the &lt;a href=&quot;http://docs.jboss.org/ejb3/app-server/reference/build/reference/en/html/hibernate.html#d0e241&quot; hreflang=&quot;en&quot;&gt;jboss documentation&lt;/a&gt; :&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;@PersistenceContext EntityManager entityManager;&lt;br /&gt;
&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; someMethod&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; org.&lt;span class=&quot;me1&quot;&gt;jboss&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;ejb3&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;entity&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;HibernateSession&lt;/span&gt; hs = &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;HibernateSession&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;entityManager;&lt;br /&gt;
&amp;nbsp; org.&lt;span class=&quot;me1&quot;&gt;hibernate&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;Session&lt;/span&gt; session = hs.&lt;span class=&quot;me1&quot;&gt;getHibernateSession&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Let's be clear : this is totally WRONG!&lt;/strong&gt; Yes, it will work under JBoss, but as there's a standard way to do this, this is not the right way to do this.&lt;/p&gt;


&lt;p&gt;In fact, there's a dedicated method that lets you retrieve the underlying persistence manager : &lt;em&gt;EntityManager.getDelegate()&lt;/em&gt;. If you read this method's javadoc, you'll see the following :&lt;/p&gt;

&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;coMULTI&quot;&gt;/**&lt;br /&gt;
&amp;nbsp;* Return the underlying provider object for the EntityManager,&lt;br /&gt;
&amp;nbsp;* if available. The result of this method is implementation&lt;br /&gt;
&amp;nbsp;* specific.&lt;br /&gt;
&amp;nbsp;* @throws IllegalStateException if this EntityManager has been closed.&lt;br /&gt;
&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AObject+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;Object&lt;/span&gt;&lt;/a&gt; getDelegate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;And the &quot;underlying provider&quot;, for Hibernate, is obviously the Hibernate &lt;em&gt;Session&lt;/em&gt; instance...&lt;/p&gt;


&lt;p&gt;So, the right way to retrieve the Session is something like the following instead :&lt;/p&gt;

&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;@PersistenceContext EntityManager entityManager;&lt;br /&gt;
&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; someMethod&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; org.&lt;span class=&quot;me1&quot;&gt;hibernate&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;Session&lt;/span&gt; session = &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;Session&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;entityManager.&lt;span class=&quot;me1&quot;&gt;getDelegate&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Under JBoss, using this code won't make a big difference. But using the standard way will let you run your code under several appservers (namely, it works like a charm&lt;sup&gt;[&lt;a href=&quot;http://batmat.net/blog/post/2008/07/13/#pnote-293-1&quot; id=&quot;rev-pnote-293-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; under JBoss 4.2.2.ga and Glassfishv2ur1 for example). If you use the bad way above, this will just crash under Glassfish, for example...&lt;/p&gt;


&lt;p&gt;I reported the &lt;a href=&quot;http://jira.jboss.com/jira/browse/JBDOCS-282&quot;&gt;corresponding documentation bug in the JBOSS tracker&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Hope this helps...&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://batmat.net/blog/post/2008/07/13/#rev-pnote-293-1&quot; id=&quot;pnote-293-1&quot;&gt;1&lt;/a&gt;] ça, c'est pour Seb&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://batmat.net/blog/post/2008/07/13/How-to-retrieve-the-Hibernate-Session-from-the-EntityManager-interface#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2008/07/13/How-to-retrieve-the-Hibernate-Session-from-the-EntityManager-interface#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/293</wfw:commentRss>
      </item>
    
  <item>
    <title>Optimisation GWT 1.4</title>
    <link>http://batmat.net/blog/post/2008/02/02/Optimisation-GWT-14</link>
    <guid isPermaLink="false">urn:md5:7ad69e85e13301ab3a034dec8be43910</guid>
    <pubDate>Sat, 02 Feb 2008 20:47:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>google</category><category>gwt</category><category>imagebundle</category><category>java</category><category>optimisation</category>    
    <description>    &lt;p&gt;Wouah, je viens de regarder l'&lt;a href=&quot;http://www.infoq.com/interviews/bruce-johnson-gwt&quot;&gt;interview de Bruce Johnson par InfoQ à propos de GWT&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Bruce explique les nombreuses optimisations qu'ils effectuent au niveau du compilateur GWT. Il explique notamment qu'ils (les développeurs GWT) cherchent sans cesse à optimiser le compilateur, pour cela il comparent par exemple les requêtes qu'une webapp classique effectue vers le serveur et les requêtes que GWT fait.&lt;/p&gt;


&lt;p&gt;Et en exemple, autour de la dixième minute, il explique l'optimisation concernant les images&amp;nbsp;: l'ImageBundle.
Dans une application classique, il y a des dizaines d'images, souvent toutes petites (icônes, fonds...). Le problème, c'est que le navigateur, même pour se voir répondre que l'image est à jour ouvre très souvent des connexions, d'autant plus qu'il y a d'image&amp;nbsp;! Ça peut créer (dixit Bruce) une contention en raison du grand nombre de sockets ouvertes côté serveur.&lt;/p&gt;


&lt;p&gt;Et bien si vous utilisez cet objet ImageBundle, &lt;strong&gt;GWT construit côté serveur une image composite&lt;/strong&gt;. Comme ça, le navigateur n'a qu'une seule image à télécharger puis vérifier, et les morceaux sont déconstruits côté client  en récupérant les bouts de la grosse image et en les plaçant au bon endroit (cf. 10m40s). C'est quand même génial comme idée.&lt;/p&gt;


&lt;p&gt;Bon après, il faut que la machine sur laquelle le navigateur tourne dépote d'autant plus, mais on n'a rien sans rien.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;PS&amp;nbsp;: Ce que je viens de dire n'est que le reflet de ce que j'ai compris de l'interview. Je n'ai pas testé cette fonctionnalité.&lt;/em&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2008/02/02/Optimisation-GWT-14#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2008/02/02/Optimisation-GWT-14#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/285</wfw:commentRss>
      </item>
    
  <item>
    <title>Ça y est, @Override fonctionne enfin comme je l'ai toujours voulu :-)</title>
    <link>http://batmat.net/blog/post/2008/02/02/Ca-y-est-Override-fonctionne-enfin-comme-je-lai-toujours-voulu-%3A-</link>
    <guid isPermaLink="false">urn:md5:1f26c44c9350fa4bfc06c0de2726d264</guid>
    <pubDate>Sat, 02 Feb 2008 15:48:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>@Override</category><category>ahé</category><category>forax</category><category>implements</category><category>java</category><category>java5</category><category>java6</category>    
    <description>    &lt;p&gt;Depuis Java 5, les annotations ont été ajoutées. L'une des premières a été @Override, une annotation destinée à informer le compilateur que la méthode ainsi annotée &lt;a href=&quot;http://batmat.net/blog/post/2005/11/26/205-surcharge-ou-redefinition&quot;&gt;redéfinit&lt;/a&gt; une méthode parente.&lt;/p&gt;


&lt;p&gt;Le problème, c'est qu'en Java 5, cette annotation ne pouvait être utilisée que sur des méthodes en provenance d'une &lt;strong&gt;classe&lt;/strong&gt; parente, pas d'une interface.&lt;/p&gt;


&lt;p&gt;Je l'ignorais jusqu'à hier soir, mais en posant la question de la justification de ce choix d'implémentation sur ma liste de diffusion favorite, c'est mon &lt;a href=&quot;http://weblogs.java.net/blog/forax/&quot;&gt;ancien prof de Java et de Génie Logiciel&lt;/a&gt; qui m'a répondu que c'était possible depuis Java 6. Cf. le &lt;a href=&quot;http://blogs.sun.com/ahe/entry/override&quot;&gt;blog de Peter Ahé&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;En clair&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;interface&lt;/span&gt; MonInterface&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; methode&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; MonImpl &lt;span class=&quot;kw2&quot;&gt;implements&lt;/span&gt; MonInterface&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;co1&quot;&gt;// L'annotation suivante est valide depuis Java6, mais produit à la compilation le &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;co1&quot;&gt;// message suivant en Java5 :&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;co1&quot;&gt;// &amp;quot;The method methode() of type MonImpl must override a superclass method&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; methode&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Ça fait un outil de plus pour augmenter la qualité du code, en l'occurrence en diminuant le risque de se retrouver avec du code mort.&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2008/02/02/Ca-y-est-Override-fonctionne-enfin-comme-je-lai-toujours-voulu-%3A-#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2008/02/02/Ca-y-est-Override-fonctionne-enfin-comme-je-lai-toujours-voulu-%3A-#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/284</wfw:commentRss>
      </item>
    
  <item>
    <title>How to load a XML Spring context lazily by default</title>
    <link>http://batmat.net/blog/post/2008/01/13/How-to-load-a-XML-Spring-context-lazily-by-default</link>
    <guid isPermaLink="false">urn:md5:854b1690185b12ec1a133cd640f91516</guid>
    <pubDate>Sun, 13 Jan 2008 17:57:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>default-lazy-init</category><category>java</category><category>lazy</category><category>spring</category>    
    <description>    &lt;p&gt;Say you want to change the default-lazy-init attribute programmatically. The most common use case for this seems to appear with unit-testing. In fact, you probably want to load everything when starting a production server, even if it costs you more time. But when testing, and particularly on your machine, you might want to inverse this behaviour. In fact, you might be interested in not loading every 1000 beans of your context when you just need less than 10 for example...&lt;/p&gt;


&lt;h3&gt;A (beginning of) solution&lt;/h3&gt;

&lt;p&gt;If you crawl Google, you might find this &lt;a href=&quot;http://www.memestorm.com/blog/lazy-bean-instantiation-in-spring-20/&quot;&gt;entry&lt;/a&gt; that links to this other one &lt;a href=&quot;http://janhoeve.blogspot.com/2007/08/speedup-development-by-making-spring.html&quot;&gt;that explains how to programatically modify the lazy-init attribute of each bean of your context&lt;/a&gt;. In fact, before the loading occurs, you can iterate through the bean list and call setLazyInit using the method &lt;code&gt;AbstractBeanDefinition.setLazyInit(true)&lt;/code&gt;. This will be roughly equivalent to manually put &lt;em&gt;lazy-init=&quot;true&quot;&lt;/em&gt; on every single bean of your context files.&lt;/p&gt;


&lt;h3&gt;The problem&lt;/h3&gt;

&lt;p&gt;The problem with this is that you override everything that was declared in the XML context file. You might want a particular bean be instantiated lazily or eagerly for some reason. But iterating through the whole list like this won't let you keep what was explicitly defined and &lt;strong&gt;only redefine the default value&lt;/strong&gt;. Another problem is that you may have to exclude some bean from this loop, ending up with a condition that really looks like an ugly hack :&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;String&lt;/span&gt;&lt;/a&gt; beanDefinitionName : context.&lt;span class=&quot;me1&quot;&gt;getBeanDefinitionNames&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; AbstractBeanDefinition beanDefinition = &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;AbstractBeanDefinition&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;context&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span class=&quot;me1&quot;&gt;getBeanDefinition&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;beanDefinitionName&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;me1&quot;&gt;err&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;beanDefinitionName&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;co1&quot;&gt;// FIXME : ugly hack&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;!&lt;span class=&quot;st0&quot;&gt;&amp;quot;org.springframework.aop.config.internalAutoProxyCreator&amp;quot;&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;beanDefinitionName&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; beanDefinition.&lt;span class=&quot;me1&quot;&gt;setLazyInit&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Having to exclude the one bean that's (according to its name) responsible for proxying beans that have to be lazy-loaded seems quite reasonable. But the thing is you obviously don't have to do it when you put the &lt;code&gt;default-lazy-init&lt;/code&gt; manually...&lt;/p&gt;


&lt;p&gt;So I looked for a way to simply replace the default value of this attribute instead. After some time digging into Spring code, I finally found it.&lt;/p&gt;


&lt;p&gt;When parsing context definition written in XML (since &lt;a href=&quot;http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/&quot; hreflang=&quot;en&quot;&gt;writing it in XML is no requirement&lt;/a&gt;), Spring will use an instance of &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/support/BeanDefinitionReader.html&quot;&gt;BeanDefinitionReader&lt;/a&gt; that will then call &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/xml/DefaultBeanDefinitionDocumentReader.html&quot;&gt;DefaultBeanDefinitionDocumentReader&lt;/a&gt;  to parse the &lt;a href=&quot;http://www.docjar.com/docs/api/org/w3c/dom/Document.html&quot;&gt;Document&lt;/a&gt; instance. Searching a bit more lets us find where the default values are initialized : &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.html&quot;&gt;BeanDefinitionParserDelegate.initDefaults()&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;LazyInitByDefaultBeanDefinitionDocumentReader&lt;/h2&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; LazyInitByDefaultBeanDefinitionDocumentReader &lt;span class=&quot;kw2&quot;&gt;extends&lt;/span&gt; DefaultBeanDefinitionDocumentReader&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;protected&lt;/span&gt; BeanDefinitionParserDelegate createHelper&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;XmlReaderContext readerContext, &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AElement+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;Element&lt;/span&gt;&lt;/a&gt; root&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root.&lt;span class=&quot;me1&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;BeanDefinitionParserDelegate.&lt;span class=&quot;me1&quot;&gt;DEFAULT_LAZY_INIT_ATTRIBUTE&lt;/span&gt;, &lt;span class=&quot;st0&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;super&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;createHelper&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;readerContext, root&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I would have preferred to use the seemingly more dedicated method &lt;code&gt;preprocessXml(Node root)]&lt;/code&gt;, but this method is called after createHelper(), so the default values are already initialized when calling preprocessXml()... So overriding preprocessXml() is &quot;too late&quot;.&lt;/p&gt;


&lt;p&gt;I think I'm going to submit a patch into the &lt;a href=&quot;http://jira.springframework.org/browse/SPR&quot;&gt;Spring bug tracker&lt;/a&gt; about this problem.&lt;/p&gt;


&lt;h2&gt;Unit-testing&lt;/h2&gt;

&lt;p&gt;When you do unit-testing with Spring, you generally inherit the &lt;code&gt;AbstractDependencyInjectionSpringContextTests&lt;/code&gt; class. Add this method redefinition to enable the &quot;lazy by default&quot; behaviour :&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;@Override&lt;br /&gt;
&lt;span class=&quot;kw2&quot;&gt;protected&lt;/span&gt; BeanDefinitionReader createBeanDefinitionReader&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;GenericApplicationContext context&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XmlBeanDefinitionReader r = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; XmlBeanDefinitionReader&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;context&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; r.&lt;span class=&quot;me1&quot;&gt;setDocumentReaderClass&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;LazyInitByDefaultBeanDefinitionDocumentReader.&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;return&lt;/span&gt; r;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;h2&gt;Plain old Java (Spring) code&lt;/h2&gt;

&lt;p&gt;When you want to create an XML context, you generally use a ClassPathXmlApplicationContext instance. If you want to modify the default behaviour like here, you have to use a GenericApplicationContext. Note that this is what is adviced in the javadoc of &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/context/support/ClassPathXmlApplicationContext.html&quot;&gt;ClassPathXmlApplicationContext&lt;/a&gt;  :&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/context/support/ClassPathXmlApplicationContext.html&quot;&gt;This is a simple, one-stop shop convenience ApplicationContext. Consider using the GenericApplicationContext class in combination with an org.springframework.beans.factory.xml.XmlBeanDefinitionReader for more flexible context setup.&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Here is the code using this GenericApplicationContext that enables the lazy-loading :&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;GenericApplicationContext context = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; GenericApplicationContext&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
XmlBeanDefinitionReader reader = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; XmlBeanDefinitionReader&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;context&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
reader.&lt;span class=&quot;me1&quot;&gt;setDocumentReaderClass&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;LazyInitByDefaultBeanDefinitionDocumentReader.&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
reader.&lt;span class=&quot;me1&quot;&gt;loadBeanDefinitions&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;/yourApplicationContext.xml&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
context.&lt;span class=&quot;me1&quot;&gt;refresh&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;When is it needed ?&lt;/h3&gt;

&lt;p&gt;At the moment, I see two reasons for enabling the lazy-loading by default :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When unit-testing, this lets you test a part of the code a bit more quickly, since not every single beans needs to be instantiated.&lt;/li&gt;
&lt;li&gt;When using code-coverage tools to evaluate a part of the code, this prevents totally unrelated code to appear with non-null percentage.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hope this small article will help some other people :-).&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2008/01/13/How-to-load-a-XML-Spring-context-lazily-by-default#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2008/01/13/How-to-load-a-XML-Spring-context-lazily-by-default#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/282</wfw:commentRss>
      </item>
    
  <item>
    <title>Utiliser les objets du domaine directement dans la couche présentation</title>
    <link>http://batmat.net/blog/post/2007/06/02/Utiliser-les-objets-du-domaine-directement-dans-la-couche-presentation</link>
    <guid isPermaLink="false">urn:md5:2c12a6ca79e764a6441fc93204f2e2f5</guid>
    <pubDate>Sat, 16 Jun 2007 23:26:00 +0200</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>commons</category><category>instanciation dynamique</category><category>introspection</category><category>java</category><category>saisie de formulaire</category><category>struts</category>    
    <description>    &lt;p&gt;Nous utilisons encore Struts 1 actuellement. Ce n'est normalement qu'une question de temps avant de passer à autre chose. Nous sommes sûrs de ne plus l'utiliser à terme. Nous connaissons donc notre source, mais pas encore la cible. Voici les nombreuses solutions qui s'offrent à nous&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Struts 2&lt;/li&gt;
&lt;li&gt;GWT&lt;/li&gt;
&lt;li&gt;.Net&lt;/li&gt;
&lt;li&gt;Flex&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Toutefois, je ne suis pas très chaud pour .Net ou Flex ou toute technologie qui nous contraigne forcément à passer par les &lt;acronym title=&quot;WebServices&quot;&gt;WS&lt;/acronym&gt; pour accéder à nos services (développés en Java). Je suis réticent à devoir obligatoirement passer par une couche WS  alors que nous pourrions garder du java de bout en bout, et ainsi économiser le marshalling/unmarshalling incessant qui va avec les WS, sans parler du problème de l'identification du graphe d'objets à sérialiser pour le renvoyer. Quoi qu'on en dise, utiliser systématiquement des WS n'est pas neutre et amène de nombreuses questions qu'on ne se pose jamais sinon (hein Séb...).&lt;/p&gt;


&lt;p&gt;Donc, pour revenir au sujet, nous ne sommes pas encore fixés sur notre future couche présentation (ou plutôt nos futures couches de présentation). Pour le moment, nous avons donc décidé de continuer à fonctionner tant bien que mal Struts 1.x avec la version 2 du socle technique que nous sortons.&lt;/p&gt;


&lt;p&gt;Or, la différence fondamentale entre notre version 1 et notre version 2 est que nous avons supprimé une &quot;transformation&quot; systématique entre deux couches. Auparavant, en effet, nos entités persistantes de couche DAO étaient systématiquement transformés en objet de couche service. Entre les deux couches, nous avions systématisé un bidouillage destiné à régler le problème que nous avons dans la couche Web dans la gestion des multiplicités 0..1.&lt;/p&gt;


&lt;h3&gt;La gestion du null de Struts 1.x&lt;/h3&gt;

&lt;p&gt;Avec Struts 1, si vous demandez par exemple le prénom d'un client null, vous n'aurez pas quelque chose de null, mais une exception. La question a été discutée il y a déjà un moment sur la liste de Struts et &lt;a href=&quot;https://issues.apache.org/struts/browse/STR-19&quot;&gt;posée sur le tracker de Struts en février 2001&lt;/a&gt; (quand je vous disais que ça faisait un moment), et Craig Mc Clanahan d'expliquer que le principe était que si vous vouliez afficher le prénom d'un client, eh bien il fallait protéger le code pour n'afficher le prénom que si le client est non null&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;XML&quot;&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;logic&lt;/span&gt;:present &lt;span class=&quot;re0&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;beanname&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;property&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;client&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;bean&lt;/span&gt;:write &lt;span class=&quot;re0&quot;&gt;property&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;client.prenom&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/logic&lt;/span&gt;:present&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Si dans l'exemple ci-dessus, on met un champ de saisie à la place du &amp;lt;bean:write /&amp;gt;, on est dans une impasse&amp;nbsp;: certes, il n'y aura pas de plantage, mais il devient alors impossible de saisir le prénom du client puisque le &lt;em&gt;textfield&lt;/em&gt; n'apparaîtra même pas...&lt;/p&gt;


&lt;p&gt;Si votre objectif est de créer le client seulement si l'utilisateur a saisi des données (exemple&amp;nbsp;: le formbean en cours gère un objet Facture qui a une &lt;a href=&quot;http://fr.wikipedia.org/wiki/Multiplicit%C3%A9&quot;&gt;multiplicité&lt;/a&gt; 0..1 vers un objet client), vous êtes obligé de créer dans votre FormBean un objet destiné à recevoir ces données. Le problème qui survient alors, c'est que si vous voulez conserver des objets &quot;propres&quot;&lt;sup&gt;[&lt;a href=&quot;http://batmat.net/blog/post/2007/06/02/#pnote-263-1&quot; id=&quot;rev-pnote-263-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;, vous devez ensuite vérifier l'instance de Client pour la remettre à null ou l'associer manuellement (si pas encore fait) à la Facture avant de transmettre la Facture à la couche service pour mettre à jour. Ouf...&lt;/p&gt;


&lt;p&gt;La longueur de l'explication ci-dessus par rapport à la complexité de ce qu'il faut gérer me paraît parler d'elle-même. Et le code qu'il faut écrire pour gérer ce cas est toujours le même...&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;avant affichage de la &lt;acronym title=&quot;Java Server Page&quot;&gt;JSP&lt;/acronym&gt;&amp;nbsp;: instancier les propriétés null pour pouvoir les afficher. Eh oui, rappel comme je l'ai dit plus haut&amp;nbsp;: la demande de la propriété &quot;a.b&quot; déclenche une exception si a est null, il faut donc s'assurer que a est non null et l'instancier le cas échéant.&lt;/li&gt;
&lt;li&gt;après soumission du formulaire de la JSP et avant de passer les données à la couche application&amp;nbsp;:  supprimer les objets 0..1 non modifiés dans la JSP.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Struts 2&lt;/h2&gt;

&lt;p&gt;Dans Struts 2, le premier point est géré différemment&amp;nbsp;: la demande de &quot;a.b&quot; si a est null renvoie simplement null. Par contre, le deuxième point est toujours à gérer manuellement et plantera si on cherche à valoriser &lt;em&gt;a.b&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Une étape a déjà été franchie, pourquoi ne pas aller plus loin&amp;nbsp;?&lt;/p&gt;


&lt;h3&gt;Une solution&lt;/h3&gt;

&lt;p&gt;Pourquoi ne pas instancier automatiquement a s'il est null lorsqu'on cherche à valoriser &lt;em&gt;a.b&lt;/em&gt;&amp;nbsp;? La question se pose d'autant que nous ne sommes pas les seuls à nous être posés la question&amp;nbsp;: ce &lt;a href=&quot;https://issues.apache.org/jira/browse/BEANUTILS-226&quot;&gt;patch&lt;/a&gt; apportait déjà les modifications nécessaires aux commons-beanutils (utilisé par Struts, c'est cette bibliothèque qui impose le comportement de lever une exception si une propriété imbriquée est demandée à l'intérieur d'un objet null)...&lt;/p&gt;


&lt;p&gt;Une autre &lt;a href=&quot;https://issues.apache.org/jira/browse/BEANUTILS-175&quot;&gt;solution&lt;/a&gt; (sans patch, cette fois) intermédiaire a été proposée pour la partie &quot;get&quot;&amp;nbsp;: mettre en place un handler externe pour gérer le cas des propriétés imbriquées (nested properties) dans un conteneur null. Cette solution est un intermédiaire intéressant parce qu'elle est très courte à implémenter et permet de faciler renvoyer null ou de lancer une autre exception dans le cas en question.&lt;/p&gt;


&lt;p&gt;Cette deuxième solution ne gère toutefois que le cas get. Peut-être le même principe serait-il utilisable pour le &quot;set&quot;. Cela permettrait de même de positionner une sorte de NestedSetterHandler qui pourrait s'occuper d'instancier les propriétés intermédiaires si besoin. Avec un fonctionnement de ce type, on pourrait même envisager de définir un handler qui serait &lt;a href=&quot;http://fr.wikipedia.org/wiki/Observateur_%28motif_de_conception%29&quot;&gt;observable&lt;/a&gt; afin de gérer à la fois l'instanciation &quot;dynamique&quot; et de pouvoir suivre les instanciations effectuées. C'est à creuser.&lt;/p&gt;


&lt;p&gt;Ce mode de fonctionnement aurait toutefois quelques inconvénients&amp;nbsp;: lorsqu'on instancie manuellement a, on sait qu'on risque de devoir l'enlever s'il n'est pas &lt;em&gt;vraiment&lt;/em&gt; saisi avant de l'envoyer à la couche service. Et que faire si on décide de faire gérer ça en standard par le service&amp;nbsp;? Imaginons par exemple qu'une adresse ait été automatiquement instanciée pour un Client. À quel composant, à quelle couche, incombe le rôle de supprimer l'adresse créée dynamiquement si le fonctionnel indique qu'elle n'est pas correcte&amp;nbsp;?&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Dommage que l'équipe de commons-beanutils soit peu réactive sur cette question à mon avis primordiale de gestion des propriétés. C'est aussi très dommage que l'idée d'avoir derrière la classe statique BeanUtils une instance de BeanUtilsBean ne soit pas poussée à son terme&amp;nbsp;: en l'état, il est en effet impossible d'utiliser de façon transparente une sous-classe BeanUtilsBean qu'on aurait adaptée à ses besoins.&lt;/p&gt;


&lt;p&gt;Je nous vois bien maintenir en interne une version patchée de commons-beanutils afin de résoudre le problème tant que nous utiliserons Struts 1, en espérant bien sûr que le &lt;a href=&quot;https://issues.apache.org/jira/browse/BEANUTILS-226&quot;&gt;patch en question&lt;/a&gt; soit finalement appliqué.&lt;/p&gt;


&lt;p&gt;En même temps, il reste la question de la gestion de la suppression des propriétés instanciées dynamiquement. Mais je ne suis pas sûr que ce soit un véritable problème, c'est un code qu'il faut de toute façon écrire. Au final, il y a actuellement les deux points suivants à gérer&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;instanciation manuelle pour gérer l'affichage&amp;nbsp;;&lt;/li&gt;
&lt;li&gt;vérification des données et suppression des créations incorrectes si les données n'ont par exemple pas été saisies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;C'est à mon sens un point qu'il serait intéressant de creuser. Avec Struts 2 par exemple, écrire un Interceptor chargé de l'instanciation dynamique ferait l'affaire pour enlever le point 1 ci-dessus.&lt;/p&gt;


&lt;p&gt;Le tout serait ensuite de définir un emplacement de choix pour faire la validation, puis la suppression des propriétés fonctionnellement &quot;inacceptables&quot;. À part ce point, je ne vois aucun frein à cette évolution. Cette question se posant pour n'importe quel formulaire de saisie, le monde de l'informatique aurait à mon sens beaucoup à gagner à trouver un véritable pattern pour gérer ce cas...&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://batmat.net/blog/post/2007/06/02/#rev-pnote-263-1&quot; id=&quot;pnote-263-1&quot;&gt;1&lt;/a&gt;] c'est à dire que &lt;em&gt;facture.getClient()&lt;/em&gt; renvoie bien null si la facture en question n'a pas de client, et non une instance bâtarde de &lt;em&gt;Client&lt;/em&gt; qu'il vous faut ensuite analyser pour savoir si c'est un vrai client ou bien simplement une instance positionnée pour gérer des contraintes de présentation.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/06/02/Utiliser-les-objets-du-domaine-directement-dans-la-couche-presentation#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/06/02/Utiliser-les-objets-du-domaine-directement-dans-la-couche-presentation#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/263</wfw:commentRss>
      </item>
    
  <item>
    <title>Martin Fowler à propos de Microsoft</title>
    <link>http://batmat.net/blog/post/2007/05/30/Martin-Fowler-a-propos-de-Microsoft</link>
    <guid isPermaLink="false">urn:md5:7faf26dcdb693b2b12e06411359d3f17</guid>
    <pubDate>Wed, 30 May 2007 22:43:00 +0200</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>.net</category><category>alphageek</category><category>java</category><category>microsoft</category><category>ruby</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://martinfowler.com/&quot; hreflang=&quot;en&quot;&gt;Martin Fowler&lt;/a&gt; a pondu ce soir un long billet sur la politique de Microsoft envers Ruby. Il parle ensuite de sa sensation selon laquelle une certaine désaffection pour la plate-forme .Net serait en cours, et que les &lt;a href=&quot;http://martinfowler.com/bliki/AlphaGeek.html&quot;&gt;AlphaGeek&lt;/a&gt;s (tiens, il faudrait un questionnaire, &lt;q&gt;êtes-vous un &lt;a href=&quot;http://martinfowler.com/bliki/AlphaGeek.html&quot;&gt;AlphaGeek&lt;/a&gt; ?&lt;/q&gt; :-)) seraient en train de quitter l'environnement de développement &lt;acronym title=&quot;Microsoft&quot;&gt;MS&lt;/acronym&gt;.&lt;/p&gt;


&lt;p&gt;Quelques morceaux choisis&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;A few years ago my (limited) contacts in Redmond told me that they were seeing a real drift of technical leaders away from the Windows platform. More recently these signs seem to be increasing.&lt;/p&gt;&lt;/blockquote&gt;


&lt;blockquote&gt;&lt;p&gt;The tools, with their rigid role-separations, actively discourage the blurry boundaries that agilists prefer.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Pour ceux qui ont récemment joué avec WPF, Blend et consorts, on voit très bien ce qu'il entend par là.&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;The attitude to open-source is a large part of this problem. When Java appeared there were yawning gaps in its portfolio [...] Those gaps and bad ideas were fixed by the open-source community. [...] .NET has also got its gaps, and again the open source community has stepped up to fill them. Yet Microsoft refuses to collaborate with these efforts, [...] Microsoft ended not just bringing out a competitive library, but deliberately making it incompatible. That's not the kind of reaction that encourages people to invest their time in the platform.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Je connais peu .Net, mais est-ce que MS travaille à l'intégration ou en tout cas encourage un projet comme NHibernate&amp;nbsp;?&lt;/p&gt;


&lt;h3&gt;Quelques liens (déjà donnés ci-dessus)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;L'article en question&amp;nbsp;: &lt;a href=&quot;http://martinfowler.com/bliki/RubyMicrosoft.html&quot;&gt;RubyMicrosoft&lt;/a&gt; chez Martin Fowler.&lt;/li&gt;
&lt;li&gt;Qu'est-ce qu'un &lt;a href=&quot;http://martinfowler.com/bliki/AlphaGeek.html&quot; hreflang=&quot;en&quot;&gt;AlphaGeek&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hanselman.com/blog/IsMicrosoftLosingTheAlphaGeeks.aspx&quot; hreflang=&quot;en&quot;&gt;Is Microsoft losing the Alpha Geeks?&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MAJ&amp;nbsp;: ajout de liens&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://codebetter.com/blogs/sam.gentile/archive/2007/05/31/microsoft-at-the-crossroads.aspx&quot;&gt;L'avis de Sam Gentile&lt;/a&gt;, un expert MS consulté par Martin Fowler pour l'écriture de son article. Martin Fowler a ajouté en fin de son billet des liens vers des réactions, dont celle de Sam.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/05/30/Martin-Fowler-a-propos-de-Microsoft#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/05/30/Martin-Fowler-a-propos-de-Microsoft#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/262</wfw:commentRss>
      </item>
    
  <item>
    <title>Sun Tech Days, mercredi 21</title>
    <link>http://batmat.net/blog/post/2007/03/25/Sun-Tech-Days-mercredi-21</link>
    <guid isPermaLink="false">urn:md5:afa03acb448de41821f996e4a1d3f43f</guid>
    <pubDate>Sun, 25 Mar 2007 16:15:00 +0200</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>java</category><category>tech days</category>    
    <description>    &lt;p&gt;Avec un peu de retard, je prends enfin le temps de faire un billet sur mon deuxième jour aux Tech Days. Cette journée a été très chargée, mais j'ai appris pleins de nouvelles choses. Évidemment, ce sont des choses à approfondir, mais je vais essayer de vous donner aussi envie de le faire. En cherchant un logiciel pour faire des vidéos de démo comme on en voit partout fleurir sur le net, je suis tombé sur Wink. C'est simplissime d'utilisation&amp;nbsp;: avec ça, plus aucune excuse pour ne pas faire de vidéo explicative de l'installation ou d'une démo d'un logiciel (et on peut générer du flash ou un .exe pur windows).&lt;/p&gt;


&lt;h3&gt;Sun Technical Keynote&lt;/h3&gt;

&lt;p&gt;Cette introduction a été l'occasion de nous montrer le langage &lt;a href=&quot;http://blogs.sun.com/chrisoliver/resource/f3.html&quot; hreflang=&quot;en&quot;&gt;F3&amp;nbsp;: Form follows function&lt;/a&gt;, censé simplifier le développement d'interfaces graphiques. C'est vrai que la partie de la démo montrant comment mettre un fond en dégradé de rouge vers bleu vers jaune (ou d'autres couleurs) a montré que c'était effectivement très simple.&lt;/p&gt;


&lt;h3&gt;Speach VMWare&lt;/h3&gt;

&lt;p&gt;En tant que sponsor Platinium, VMWare a eu droit à un speach devant tout le monde. On nous a présenté ce qu'était VMWare, pour ceux qui l'ignoraient encore. Ça a été l'occasion de parler de Lab Manager, une sorte de dépôt central dans lequel on peut stocker des machines virtuelles et les lancer depuis des postes clients. Ça a l'air intéressant dans le cas des recettes par des équipes de tests. En effet, le syndrôme du &lt;q&gt;Chez moi ça marche&lt;/q&gt;
est effectivement connu de tout informaticien. Avec ce système qui simplifie le partage d'une configuration complète (du logiciel jusqu'à l'OS et sa configuration précise), il devient possible de débugguer un problème dans les conditions qui garantissent la reproductibilité, ce qui est la première difficulté pour un développeur&amp;nbsp;: trouver les conditions permettant de reproduire le problème (essayez de corriger un problème que vous n'avez pas, pour voir !).&lt;/p&gt;


&lt;h3&gt;Java Jacket Give away&lt;/h3&gt;

&lt;p&gt;20 minutes pour un mini-show de 4 d'entre nous. Je n'ai pas osé y aller. J'ai eu une idée un peu tard, mais j'aurais dû la préparer la veille. Peut-être pour l'année prochaine :-).&lt;/p&gt;


&lt;p&gt;Le gagnant a chanté une petite chanson sur Java et a donc gagné la veste en cuir avec le logo Java :-).&lt;/p&gt;

&lt;h3&gt;Java scripting: One VM, Many Languages&lt;/h3&gt;

&lt;p&gt;Cette session a été très intéressante. La démo de Guillaume Laforge m'a notamment donné envie de me mettre au &lt;a href=&quot;http://groovy.codehaus.org/&quot;&gt;Groovy&lt;/a&gt;, pour les apports en rapidité d'écriture par rapport au Java, l'ajout des &lt;a href=&quot;http://fr.wikipedia.org/wiki/Fermeture_%28informatique%29&quot; title=&quot;closures en anglais&quot;&gt;fermetures&lt;/a&gt;, mais aussi pour sa proximité syntaxique et son intégration avec le Java. Ça peut en effet fonctionner directement avec la JVM, être mis dans un jar..., puisqu'on peut générer du pur bytecode Java. L'idée n'est pas de remplacer le Java, mais d'apporter une alternative plus puissante aux scripts shell et une syntaxe plus habituelle pour le développeur Java qui veut déployer un script de batch sur le serveur, par exemple.&lt;/p&gt;


&lt;p&gt;Cette présentation a été l'occasion de découvrir la &lt;a href=&quot;http://scripting.dev.java.net/&quot;&gt;JSR223&lt;/a&gt;, la spécification qui permet d'intégrer n'importe quel langage de script à la plate-forme Java. Javascript l'est déjà (cf. la présentation flash plus bas), JRuby, Groovy, etc. En gros, l'architecture mise en place permet à n'importe qui d'intégrer n'importe quel langage de script en implémentant simplement les interfaces de la spéc (pensez à JDBC si vous ne voyez pas ce que je veux dire).&lt;/p&gt;


&lt;h3&gt;Code Quality issues: Prevention and Detection&lt;/h3&gt;

&lt;p&gt;C'est certainement l'une des sessions dans lesquelles je me suis senti le plus à l'aise, parce que j'avais déjà mis en place un grand nombre des outils cités. Ça a toutefois été l'occasion de découvrir de nouveaux outils (Selenium, notamment).&lt;/p&gt;


&lt;p&gt;La présentation a commencé en citant Dijkstra&amp;nbsp;: &lt;q&gt;Testing can only show you bug presence, not their absence&lt;/q&gt;. Et c'est vrai que c'est bien de rappelant l'intérêt essentiel des outils de qualité de code... Ce n'est pas magique.&lt;/p&gt;


&lt;p&gt;Pour résumer&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test unitaire&amp;nbsp;: Junit, TestNg&lt;/li&gt;
&lt;li&gt;Couverture de code&amp;nbsp;: Emma (+ pleins d'autres), ce type d'outil permet de savoir quelles parties de votre code ont été testées par les tests unitaires. En gros, vous lancez tous les tests de votre projet et l'outil monitore par où ça passe. Ensuite, vous pouvez généralement savoir quelles parties ont été testées, voire même lesquelles l'ont été plusieurs fois et d'autres une seule. La plupart de ces outils possèdent des plugins pour les principaux IDE qui permettent de voir graphiquement la couverture. Bien sûr, il existe aussi des plugins pour des outils comme Maven, permettant de sortir des statistiques.&lt;/li&gt;
&lt;li&gt;Montée en charge&amp;nbsp;: JMeter, LoadRunner (j'ajouterais OpenSTA)&lt;/li&gt;
&lt;li&gt;Mock objects&amp;nbsp;: EasyMock, JMock&lt;/li&gt;
&lt;li&gt;Qualité du code&amp;nbsp;: PMD, Checstyle&lt;/li&gt;
&lt;li&gt;Test fonctionnel d'une webapp&amp;nbsp;: Selenium&lt;/li&gt;
&lt;li&gt;P6Spy pour voir la valeur des &quot;?&quot; dans les requêtes SQL paramétrées.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;TP&amp;nbsp;: Les nouveautés de Java 6&lt;/h3&gt;

&lt;p&gt;Comme j'en ai parlé plus haut, il est possible d'interfacer la JVM avec d'autres langages. Avec Java 6, vous disposez de jrunscript, un interpréteur Ecmascript (javascript normalisé).&lt;/p&gt;


&lt;p&gt;En voici une petite démo :(cliquez sur l'image pour voir la démo flash)&amp;nbsp;:
&lt;a href=&quot;http://batmat.net/dotclear/public/jrunscript.swf&quot;&gt;&lt;img src=&quot;http://batmat.net/dotclear/public/jrunscript-presentation.jpg&quot; alt=&quot;jrunscript-presentation.jpg&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;JMX, Performance et concurrence&lt;/h3&gt;

&lt;h2&gt;JMX&lt;/h2&gt;

&lt;p&gt;J'ai appris au cours de cette session que l'équipe de développement de &lt;a href=&quot;http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/&quot;&gt;JMX&lt;/a&gt; était située à Grenoble.&lt;/p&gt;


&lt;p&gt;L'objet de cette session a été principalement de développer un &lt;acronym title=&quot;Management Bean&quot;&gt;MBean&lt;/acronym&gt; et de l'exposer via le MBeanServer. Ceux qui, comme moi, ont déjà développé un MBean et joué avec &lt;a href=&quot;http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html&quot;&gt;JConsole&lt;/a&gt; juste pour voir n'auront pas été surpris.&lt;/p&gt;


&lt;p&gt;Par contre, j'en ai appris sur les différentes espaces mémoires de la JVM&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eden&amp;nbsp;: c'est l'espace mémoire où les objets à courte durée durée de vie sont stockés (la plupart en général)&amp;nbsp;;&lt;/li&gt;
&lt;li&gt;Survivor&amp;nbsp;: pour les objets qui ont une durée de vie un peu plus grande&amp;nbsp;;&lt;/li&gt;
&lt;li&gt;Tenured&amp;nbsp;: ben euu, encore plus :-).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Autre chose que les conférenciers ont dit, je n'ai pas vérifié, mais à propos des options -client et -server&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-client est toujours utilisé sous Windows, quelle que soit la machine&lt;/li&gt;
&lt;li&gt;-server est utilisé automatiquement sous Linux ou sous Solaris si la machine possède plus de 2Go de mémoire vive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Truc génial&amp;nbsp;: la possibilité de repérer des deadlocks avec un simple bouton&amp;nbsp;! (je crois que c'est un ajout dans le JConsole embarqué dans Mustang, parce que je ne me souviens pas de l'avoir dans Tiger).&lt;/p&gt;


&lt;h5&gt;JSR 262&lt;/h5&gt;

&lt;p&gt;La façon dont on accède à JMX, JMX Remote, n'est pas liée fortement à JMX. En effet, l'implémentation par défaut dans Java 5 est effectivement en RMI, mais il reste très faisable de permettre l'accès aux fonctionnalités d'un serveur JMX par n'importe quelle autre implémentation.&lt;/p&gt;


&lt;p&gt;C'est justement l'objet de la JSR 262&amp;nbsp;: implémenter une couche WebServices d'accès à JMX. Comme il existe une norme appelée &lt;a href=&quot;http://www.dmtf.org/standards/wsman/&quot;&gt;WS-Man&lt;/a&gt; qui n'est pas liée au Java. Cette implémentation permettra donc l'accès au management de la JVM d'une façon normalisée. &lt;a href=&quot;https://wiseman.dev.java.net/&quot;&gt;WiseMan&lt;/a&gt; est ainsi l'implémentation Java de WS-Man.&lt;/p&gt;


&lt;p&gt;Lors de la séance de Q/R, j'ai posé la seule question de ces deux jours à Paris&amp;nbsp;: &lt;q&gt;pourquoi n'y a-t-il pas pour les MBeans, de la même façon qu'il y a l'annotation @WebService pour les Webservices, une annotation @MBean qui indiquerait automatiquement aux MBeanServer quels sont les MBeans à exposer ?&lt;/q&gt;
Éamonn McMannus a répondu que c'était une question qu'on leur posait souvent, et que c'était justement prévu.&lt;/p&gt;

&lt;h2&gt;Performance&lt;/h2&gt;

&lt;p&gt;Bon, ils ont parlé du &lt;a href=&quot;http://batmat.net/blog/post/2004/06/09/61-utilisation-de-stringbuffer-et-autres-ruses&quot;&gt;classique StringBuffer à la place de concaténer des String&lt;/a&gt;. Attention&amp;nbsp;: depuis la version 5 de Java, la classe StringBuilder est à privilégier&amp;nbsp;: de la même manière qu'il est recommandé d'&lt;a href=&quot;http://batmat.net/blog/post/2004/06/28/66-best-practices-en-java&quot;&gt;utiliser HashMap à la place de Hashtable&lt;/a&gt;, il faut utiliser StringBuilder dans un contexte qui ne nécessite pas de synchronisation. En effet, la synchro n'est pas gratuite, donc l'utiliser de façon systématique est une grave erreur.&lt;/p&gt;


&lt;h2&gt;Concurrence&lt;/h2&gt;

&lt;p&gt;Ils ont présenté la &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html&quot;&gt;nouvelle API de gestion de la concurrence&lt;/a&gt; ajoutée au JDK5, encore peu connue.&lt;/p&gt;


&lt;h2&gt;Java Puzzle&lt;/h2&gt;

&lt;p&gt;Pour finir, on a eu droit à un &lt;em&gt;Java Puzzle&lt;/em&gt; (en anglais, &lt;em&gt;puzzled&lt;/em&gt; correspond à surpris, étonné), c'est un bout de code qui surprend ou pour lequel on n'a généralement pas une réponse évidente pour tout le monde&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; PingPong &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; main&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;String&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt; a&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AThread+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;Thread&lt;/span&gt;&lt;/a&gt; t = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AThread+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;Thread&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; run&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt; pong&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;span class=&quot;me1&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;me1&quot;&gt;out&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;Ping&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; pong&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;me1&quot;&gt;out&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;Pong&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Qu'affiche ce bout de code&amp;nbsp;?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PingPong&lt;/li&gt;
&lt;li&gt;PongPing&lt;/li&gt;
&lt;li&gt;Ça varie&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;J'avoue sans honte que j'ai répondu correctement à cette question :-). Je mettrai la réponse dans les commentaires un peu plus tard (si personne d'autre ne le fait avant, d'ailleurs).&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/03/25/Sun-Tech-Days-mercredi-21#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/03/25/Sun-Tech-Days-mercredi-21#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/252</wfw:commentRss>
      </item>
    
  <item>
    <title>Sun Tech Days de l'intérieur, mardi 20</title>
    <link>http://batmat.net/blog/post/2007/03/21/Sun-Tech-Days-de-linterieur-mardi-20</link>
    <guid isPermaLink="false">urn:md5:49b8d9856e01007f233fffb6df0d4d82</guid>
    <pubDate>Wed, 21 Mar 2007 01:11:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>java</category><category>tech days</category>    
    <description>    &lt;p&gt;J'étais donc aux &lt;a href=&quot;http://fr.sun.com/sunnews/events/2007/mar/techdays/index.jsp&quot;&gt;Tech Days&lt;/a&gt; aujourd'hui. Encouragé par des &quot;moins scrupuleux&quot; que moi, je me suis aussi levé pour dire bonjour à &lt;a href=&quot;http://blogs.sun.com/alexismp/&quot;&gt;Alexis Moussine-Pouchkine&lt;/a&gt;, que je n'osais pas déranger parce qu'il avait l'air à bloc pour préparer/peaufiner sûrement sa session de cet après-midi &lt;img src=&quot;/dotclear/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; (ce qu'il m'a confirmé ensuite, la session avec &lt;a href=&quot;http://www.microsoft.com/france/msdn/annuaire/xml/stephgou.xml&quot;&gt;Stéphane Goudeau&lt;/a&gt; sur WSIT, plus précisément :p).&lt;/p&gt;


&lt;p&gt;De façon très inégale, j'ai pris quelques notes au cours de chacune des sessions. Je vais essayer de vous faire un rapide topo de ce à quoi j'ai assisté et ce que ça m'évoque. Après, je vais dormir pour réussir à me réveiller tout à l'heure :-).&lt;/p&gt;


&lt;h3&gt;Keynote session&amp;nbsp;: James Gosling&lt;/h3&gt;

&lt;p&gt;Ça faisait longtemps que je ne n'avais pas entendu quelqu'un parler anglais, j'ai donc mis quelques minutes à m'habituer à son accent, que je qualifierais d'américain malgré le fait qu'il soit Canadien il me semble :-). Une fois lancé, j'ai ensuite pu comprendre facilement &lt;a href=&quot;http://weblogs.java.net/blog/rags/&quot;&gt;Rags&lt;/a&gt; ou &lt;a href=&quot;http://weblogs.java.net/blog/rpatel/&quot;&gt;Rima Patel&lt;/a&gt; (soit dit en passant, j'ai été amusé de remarquer qu'ils avaient tous les deux un portable Ferrari, vous savez celui &lt;a href=&quot;http://www.comparestoreprices.co.uk/images/fe/ferrari-3000-amd-notebook-laptop-pc.jpg&quot;&gt;tout en rouge&lt;/a&gt;).&lt;/p&gt;


&lt;p&gt;Pour rester dans l'anecdotique, ça ne va pas intéresser grand monde, mais comme j'avais déjà joué avec, j'ai pu remarquer que &lt;a href=&quot;http://blogs.sun.com/jag/&quot;&gt;James Gosling&lt;/a&gt; utilisait toujours &lt;a href=&quot;https://huckster.dev.java.net/&quot;&gt;Huckster&lt;/a&gt; pour faire sa présentation. J'ai trouvé ça propre et joli. J'avoue que ça m'a donné envie de l'utiliser à nouveau :-).&lt;/p&gt;


&lt;p&gt;Sinon, au niveau du contenu, James a survolé un peu tout ce qui fait Java aujourd'hui. Du client léger au mobile, en passant par les tests de l'A380 et le temps réel. Une phrase qui m'a amusé, mais finalement pas tant surpris que ça. Il a dit&amp;nbsp;: &lt;q&gt;For me, the java language is almost uninteresting.&lt;/q&gt;. Sorti du contexte, ça pourrait faire une bonne news à troll sur TSS. En fait, ce qu'il a évidemment précisé, c'est que c'est surtout la JVM et sa portabilité sur des plates-formes potentiellement très hétérogènes qui l'intéresse :-).&lt;/p&gt;


&lt;h3&gt;Sun Technical Demo(s)&lt;/h3&gt;

&lt;p&gt;En l'espace de quelques dizaines de minutes, nous avons eu droits à 6 démos. Je le dis, les deux les plus impressionnantes ont été pour moi celle de Romain Guy montrant &lt;a href=&quot;http://aerith.dev.java.net&quot;&gt;Aerith&lt;/a&gt; en fonctionnement et celle d'un certain Peter (pas entendu/noté le nom, désolé) qui m'a bluffé sur du dév sur téléphone portable. De mémoire&amp;nbsp;:&lt;/p&gt;


&lt;h2&gt;Développement client léger&lt;/h2&gt;

&lt;p&gt;Pas trop bien compris. Ça ressemblait plus à du flash qu'à du Java sur une page Web (ou alors, c'était sûrement une Applet). L'objectif était de montrer qu'on pouvait faire une jolie page web avec Java EE. Pourquoi pas.&lt;/p&gt;


&lt;h2&gt;Aerith&amp;nbsp;: Romain Guy&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://batmat.net/blog/post/2007/03/21/&quot;&gt;Aerith&lt;/a&gt; montre qu'on peut faire en Swing des applis avec un design de fou furieux. Si vous voulez tester, vous pouvez lancer assez facilement aerith directement depuis le lien Java Web Start (jnlp).&lt;/p&gt;


&lt;p&gt;Aerith est un Mashup. Il utilise les WS de Flickr, de Google Maps et la localisation Yahoo si j'ai bien compris... Époustouflant.&lt;/p&gt;


&lt;h2&gt;Développement JSF avec Netbeans&amp;nbsp;: Doris Chen&lt;/h2&gt;

&lt;p&gt;NetBeans semble effectivement bluffant de simplicité pour du dév Web. Quand je vois comment on rame pour nos JSP avec Eclipse, je m'interroge...&lt;/p&gt;


&lt;p&gt;Par contre, JSF, JSF, JSF, JSF, ou alors JSF si j'ai bien compris&lt;/p&gt;


&lt;h2&gt;Java DB&lt;/h2&gt;

&lt;p&gt;Dans un client Web (Firefox :)), Francois Orsini nous montre qu'il peut saisir des données et tuer Firefox. Lorsqu'il rouvre l'application, il retrouve ses données telle qu'il les avaient saisies sans avoir pourtant cliqué sur un bouton de soumission. En fait, par Ajax, à chaque modification de champs, le client envoie les données au serveur qui les stocke.&lt;/p&gt;


&lt;p&gt;Certes, la fonctionnalité est intéressante pour éviter le syndrôme de la perte des données dans un formulaire en cours de saisie. Mais, je ne vois pas bien le rapport direct avec Derby&amp;nbsp;: la partie la plus grosse du code me semble résider dans l'Ajax qui stocke les données au fur et à mesure, non&amp;nbsp;? N'importe quelle base côté serveur ferait ensuite l'affaire il me semble.&lt;/p&gt;


&lt;h2&gt;jMaki&amp;nbsp;: Ludovic Champenois&lt;/h2&gt;

&lt;p&gt;Sorte de wrapper à framework Javascript, jMaki a été mis à contribution pour développer rapidement quelques pages Web et montrer l'intégration simple et rapide de code Java directement dans le code Javascript. Ceci a notamment permis par exemple d'utiliser java.util.Date en plein milieu d'un code js. À creuser, à mon avis, mais très intéressant.&lt;/p&gt;


&lt;h2&gt;Développement Mobile&lt;/h2&gt;

&lt;p&gt;Si j'ai bien suivi, Peter a ensuite fait en live du remote debugging, posant en effet un point d'arrêt sur le code en cours d'exécution sur la JVM du téléphone&amp;nbsp;! Après avoir pris Doris Chen en photo avec l'appareil, il a imprimé sa photo sur l'imprimante, mais je n'ai pas bien compris ce qu'il voulait montrer. En tout cas, c'était sympa.&lt;/p&gt;


&lt;h3&gt;Glassfish&amp;nbsp;: Alexis Moussine-Pouchkine et Ludovic Champenois&lt;/h3&gt;

&lt;p&gt;L'une des principales choses que j'ai retenue, ça tombe bien parce que j'ai le sentiment que c'est l'une des choses sur lesquelles Alexis a voulu insister&amp;nbsp;: Glassfish n'est pas seulement une implémentation de référence dans le sens où on pouvait l'entendre habituellement&lt;sup&gt;[&lt;a href=&quot;http://batmat.net/blog/post/2007/03/21/#pnote-251-1&quot; id=&quot;rev-pnote-251-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;. &lt;a href=&quot;http://glassfish.java.net&quot;&gt;Glassfish&lt;/a&gt; est parfaitement utilisable en production.&lt;/p&gt;


&lt;p&gt;L'interface d'administration est agréable et l'outil asadmin permet de gérer des choses comme l'ajout de Datasources, etc.. (euu, là, chui pas sûr du tout). Glassfish intégre &lt;strong&gt;JAX-WS&lt;/strong&gt;, beaucoup plus rapide qu'Axis 2, qu'y disaient.&lt;/p&gt;


&lt;p&gt;Quelques notes en vrac&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intégration de Comet&amp;nbsp;: permet de créer des connexions persistantes HTTP, et donc de permettre au serveur de faire du callback.&lt;/li&gt;
&lt;li&gt;Shoal&amp;nbsp;: implémentation de clustering dynamique avec JXTA.&lt;/li&gt;
&lt;li&gt;L'admin se fait avec JMX&lt;/li&gt;
&lt;li&gt;Des extensions à JMX, des Application Servers Management eXtensions donc&amp;nbsp;? :-), des &lt;strong&gt;AMX&lt;/strong&gt; sont aussi présentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Extreme Gui Makeover&amp;nbsp;: Romain Guy&lt;/h3&gt;

&lt;p&gt;Là, j'ai un peu merdé. Comme je n'avais pas re-regardé le planning. Je me suis retrouvé à assister aux quelques premières minutes de la session VMWare. J'ai donc changé de salle pour aller suivre une &quot;Track&quot; a priori plus développement, plus code. J'ai pu voir quelques trucs bien agréables pour améliorer la tronche des composants Swing ou en simplifier le développement&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un peu de code maison, pas forcément difficile mais qu'il faut tout de même trouver :-),&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://swingx.dev.java.net/&quot;&gt;SwingX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timingframework.dev.java.net/&quot;&gt;Timing Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;acronym title=&quot;WebServices Interoperability Technologies&quot;&gt;WSIT&lt;/acronym&gt;&amp;nbsp;: Tangoing with .Net&lt;/h3&gt;

&lt;p&gt;Cette session a permis de rappeler les normes existantes ou en cours de développement liées à WS. C'est Rags qui s'est occupé de la partie &quot;magistrale&quot; :-). Alexis et Stéphane Goudeau (de MS), nous ont quant à eux fait une jolie démo de l'interopérabilité Java/.Net, projet sur lequel ils ont travaillé pour la DGME. Il a notamment été question d'optimisation du transport des pièces jointes avec les &lt;acronym title=&quot;WebServices&quot;&gt;WS&lt;/acronym&gt; en utilisant deux protocoles/principes (?)&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;W3C SOAP Message Transfert Optimization Mechanism&amp;nbsp;: &lt;strong&gt;MTOM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;W3C XML-binary Optimized Packaging&amp;nbsp;: &lt;strong&gt;XOP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La session s'est ainsi terminée par l'envoi depuis le code .Net d'une image affichée ensuite sur le portable d'Alexis.&lt;/p&gt;


&lt;h3&gt;SOA, WS, &lt;acronym title=&quot;Business Process Execution Language&quot;&gt;BPEL&lt;/acronym&gt;&amp;nbsp;: Rima Patel&lt;/h3&gt;

&lt;p&gt;Après la session WSIT, j'ai quitté la grande salle pour rejoindre Rima Patel afin de découvrir un peu ce qu'était BPEL, dont j'entends tant parler mais dont je ne savais toujours pas ce qu'elle permettait de faire concrètement.&lt;/p&gt;


&lt;p&gt;Cette session a été intéressante pour rappeler une fois de plus ce que doit être une Architecture Orientée Services. Un peu en vrac&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un WS est une boite noire avec une interface bien définie (elle n'a pas utilisé le mot &lt;em&gt;contrat&lt;/em&gt;, je trouve pourtant qu'il convient parfaitement bien).&lt;/li&gt;
&lt;li&gt;SOA apporte de la valeur ajoutée sur le métier, pas sur la technique. Elle a même dit&amp;nbsp;: c'est pour ça que ce sera votre CEO qui vous parlera peut-être de SOA, en raison de la valeur ajoutée métier qu'elle apporte (&lt;em&gt;Nota de moi&amp;nbsp;: et qui donc est remontée dans les articles de 01 Informatique &lt;img src=&quot;/dotclear/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a eu droit en fin de session à une démo de BPEL dans NetBeans. Comme je voulais en savoir plus sur BPEL, je suis ensuite allé au TP pour faire les exercices moi-même. J'avoue que le plugin BPEL, notamment le debugger, de netbeans est impressionnant de simplicité. Le problème, c'est que je n'ai pas eu le temps de faire le troisième exercice où on rentrait un peu plus dans le code. Les deux premiers n'étant presque que du clic-clic-bouton sur l'interface de netbeans sans forcément prendre le temps de comprendre un peu plus BPEL. Comme j'ai le support, j'essaierai de finir l'exercice pour voir s'il y a des choses intéressantes à dire.&lt;/p&gt;


&lt;p&gt;J'aurais aimé terminer la journée en allant au &quot;FOSSDAY&quot; sur &quot;Langages Libres, machines virtuelles et Web 2.0&quot;, mais j'ai préféré ne pas arriver chez moi à 21h. J'ai pu voir un peu plus la famille pour une fois que je passe dans la région parisienne (en coup de vent, en plus :p).&lt;/p&gt;


&lt;p&gt;Voilà pour aujourd'hui, bonne nuit :-).&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://batmat.net/blog/post/2007/03/21/#rev-pnote-251-1&quot; id=&quot;pnote-251-1&quot;&gt;1&lt;/a&gt;] Lorsqu'une spécification est publiée, Sun développe toujours une implémentation de référence pour montrer la faisabilité du principe. Ces implémentations sont donc souvent basiques et impropres à un usage en production. Ce n'est donc pas le cas de Glassfish.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/03/21/Sun-Tech-Days-de-linterieur-mardi-20#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/03/21/Sun-Tech-Days-de-linterieur-mardi-20#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/251</wfw:commentRss>
      </item>
    
  <item>
    <title>Sun Tech Days à Paris, les 19, 20 et 21 mars 2007</title>
    <link>http://batmat.net/blog/post/2007/03/13/Sun-Tech-Days-a-Paris-les-19-20-et-21-mars-2007</link>
    <guid isPermaLink="false">urn:md5:f26417af5d5538624b1635324ba97733</guid>
    <pubDate>Tue, 13 Mar 2007 20:41:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>java</category><category>Tech Days</category>    
    <description>    &lt;p&gt;J'&lt;a href=&quot;http://fr.sun.com/sunnews/events/2007/mar/techdays/index.jsp&quot;&gt;y serai&lt;/a&gt; le mardi 20 et le mercredi 21. Et vous&amp;nbsp;? &lt;img src=&quot;/dotclear/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/03/13/Sun-Tech-Days-a-Paris-les-19-20-et-21-mars-2007#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/03/13/Sun-Tech-Days-a-Paris-les-19-20-et-21-mars-2007#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/249</wfw:commentRss>
      </item>
    
  <item>
    <title>JSR 310 : Date and Time API</title>
    <link>http://batmat.net/blog/post/2007/02/18/JSR-310-%3A-Date-and-Time-API</link>
    <guid isPermaLink="false">urn:md5:649d57ea21013a6b6e0f00d87186ed9f</guid>
    <pubDate>Sun, 18 Feb 2007 23:11:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>java</category><category>jsr</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://jcp.org/en/jsr/detail?id=310&quot;&gt;Génial&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;L'API standard de Java manque encore aujourd'hui cruellement d'une API de traitement des dates, de calcul des durées entre deux dates et tout ce qui peut avoir un rapport avec le traitement du temps dans un programme. L'une des bibliothèques les plus connues qui comble cette lacune est &lt;a href=&quot;http://joda-time.sourceforge.net/&quot;&gt;Joda-Time&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Une &lt;a href=&quot;http://fr.wikipedia.org/wiki/Java_Community_Process&quot;&gt;JSR&lt;/a&gt; est donc en marche pour répondre à ce besoin de façon standard. Ceux qui ont déjà utilisé les classes Calendar et Date savent à quel point elles sont incomplètes et parfois même bugguées. Vivement que ce groupe de travail produise la base de ce &lt;em&gt;javax.time.*&lt;/em&gt;, base sur laquelle nous pourrons jeter un oeil afin de commenter. Ça va sûrement être très intéressant. Nous découvrirons alors notamment s'il est entrevu un chemin de migration entre la classe Date actuelle et celle qui sera conçue. A priori, les deux classes devraient en effet être rendues obsolètes&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;It is intended that this JSR will produce classes that effectively replace the need for the existing Date and Calendar APIs. Over time we look forward to other specifications being updated to us the new date and time API.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Mais le groupe de travail tentera évidemment si possible de réintégrer ces classes dans le nouveau modèle&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;In terms of design, it is intended that immutable classes will form the core. It is also intended to use interfaces, if possible, to bring the old Date and Calendar classes into the new model. The expert group will also examine if Calendar can be reimplemented internally using the new date and time classes.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Vu la base de code dans la nature qui dépend de Date/Calendar, j'espère qu'on trouvera un moyen de fusionner l'ancien et le nouveau modèle...&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/02/18/JSR-310-%3A-Date-and-Time-API#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/02/18/JSR-310-%3A-Date-and-Time-API#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/242</wfw:commentRss>
      </item>
    
  <item>
    <title>Comment fusionner plusieurs listes en une seule avec Spring [Test de coloration syntaxique :-)]</title>
    <link>http://batmat.net/blog/post/2007/01/30/Test-de-coloration-syntaxique</link>
    <guid isPermaLink="false">urn:md5:3a7a189a413d6175112943d0e907c75a</guid>
    <pubDate>Tue, 30 Jan 2007 10:05:00 +0100</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>dotclear:2</category><category>geshi</category><category>java</category><category>message de service</category><category>spring</category>    
    <description>    &lt;p&gt;Attention, fonctionnalité en test :-). Merci &lt;a href=&quot;http://qbnz.com/highlighter/&quot;&gt;GeShi&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;C'est pas mal du tout, mais il faut encore améliorer le rendu. Notamment les espaces inter-lignes. Il faut aussi que je passe en mode &quot;class&quot; et que j'écrive le code CSS associé au rendu que je veux donner à mon code.&lt;/p&gt;

&lt;pre class=&quot;geshi&quot;&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;package&lt;/span&gt; fr.&lt;span class=&quot;me1&quot;&gt;mipih&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;foundation&lt;/span&gt;.&lt;span class=&quot;me1&quot;&gt;spring&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;co2&quot;&gt;import java.util.ArrayList;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;co2&quot;&gt;import java.util.List;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;co2&quot;&gt;import org.springframework.beans.factory.config.AbstractFactoryBean;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;coMULTI&quot;&gt;/**&lt;br /&gt;
&amp;nbsp;* Classe Spring permettant de fusionner plusieurs tableaux ou listes en une seule.&lt;br /&gt;
&amp;nbsp;* &lt;br /&gt;
&amp;nbsp;* @author Baptiste Mathus&lt;br /&gt;
&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt; ListMergerFactoryBean &lt;span class=&quot;kw2&quot;&gt;extends&lt;/span&gt; AbstractFactoryBean&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&amp;lt;String&amp;gt; mergedSourceList;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;Class&lt;/span&gt; getObjectType&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;return&lt;/span&gt; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;List&lt;/span&gt;&lt;/a&gt;.&lt;span class=&quot;kw2&quot;&gt;class&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;void&lt;/span&gt; setSourceLists&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;List&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt; sourceLists&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mergedSourceList = &lt;span class=&quot;kw2&quot;&gt;new&lt;/span&gt; ArrayList&amp;lt;String&amp;gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;List&amp;lt;String&amp;gt; l : sourceLists&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mergedSourceList.&lt;span class=&quot;me1&quot;&gt;addAll&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;l&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;protected&lt;/span&gt; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AObject+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;Object&lt;/span&gt;&lt;/a&gt; createInstance&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;throws&lt;/span&gt; &lt;a href=&quot;http://www.google.com/search?q=allinurl%3AException+java.sun.com&amp;amp;bntl=1&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;Exception&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.&lt;span class=&quot;me1&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;mergedSourceList&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;kw2&quot;&gt;return&lt;/span&gt; mergedSourceList;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/01/30/Test-de-coloration-syntaxique#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/01/30/Test-de-coloration-syntaxique#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/238</wfw:commentRss>
      </item>
    
  <item>
    <title>Différence entre Session.save() et Session.persist()</title>
    <link>http://batmat.net/blog/post/2007/01/02/238-difference-entre-sessionsave-et-sessionpersist</link>
    <guid isPermaLink="false">urn:md5:ac6456303af97f4ea17ef9c65df48125</guid>
    <pubDate>Tue, 02 Jan 2007 15:28:58 +0000</pubDate>
    <dc:creator>batmat</dc:creator>
        <category>Technique</category>
        <category>hibernate</category><category>java</category>    
    <description>    &lt;p&gt;Dans la version 3 d'Hibernate, d'un point de vue strictement utilitaire, il y a deux méthodes qui ont le même objectif&amp;nbsp;: sauvegarder un objet en base (ou le rendre persistant, comme on dit).&lt;/p&gt;


&lt;p&gt;Le problème est donc de savoir laquelle il faudrait plutôt utiliser. Et bien la réponse est simple, euuuu...&lt;/p&gt;


&lt;p&gt;Traduction de ce qu'on peut lire dans la &lt;a href=&quot;http://www.hibernate.org/116.html#A22&quot;&gt;FAQ&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Je ne sais pas si je dois utiliser save() ou persist().&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Ces deux méthodes rendent persistante une instance éphémère (NdT&amp;nbsp;: transient). Toutefois, la méthode persist() ne garantit pas que la valeur de l'identifiant sera assignée immédiatement, l'assignement pourrait arriver au moment du flush.&lt;/p&gt;
&lt;p&gt;
La méthode persist() garantit aussi qu'aucun INSERT ne sera exécuté si elle est appelée en dehors d'un contexte transactionnel. Ceci est utile pour les conversations longues avec un contexte de persistance/session étendu.&lt;/p&gt;
&lt;p&gt;
La méthode save() ne garantit pas la même chose. Elle retourne un identifiant, et si un INSERT doit être exécuté pour obtenir l'identifiant it returns an identifier (e.g. générateur &quot;identity&quot;, pas &quot;sequence&quot;), cet INSERT arrive immédiatement, peu importe que vous soyez à l'intérieur ou à l'extérieur d'une transaction. Ce n'est pas bon pour les conversations longues avec un contexte de persistance/session étendu&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;En résumé, si vous faites des conversations longues, utilisez plutôt persist(). Sinon il y a peu de différence, mis à part toutefois le cascading. Celui-ci n'est propagé dans le cas de save() que si la relation est mappée &lt;em&gt;cascade=&quot;save-update&quot;&lt;/em&gt;, alors que c'est &lt;em&gt;cascade=&quot;persist&quot;&lt;/em&gt; pour persist().&lt;/p&gt;


&lt;p&gt;Notez que si vous mappez &lt;em&gt;cascade=&quot;all&quot;&lt;/em&gt;, cela inclue à la fois save-update et persist. Donc pour les relations mappées &quot;all&quot;, la sémantique de &lt;em&gt;persist()&lt;/em&gt; et de &lt;em&gt;save()&lt;/em&gt; sont à mon avis &lt;strong&gt;extrêmement proches&lt;/strong&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://batmat.net/blog/post/2007/01/02/238-difference-entre-sessionsave-et-sessionpersist#comment-form</comments>
      <wfw:comment>http://batmat.net/blog/post/2007/01/02/238-difference-entre-sessionsave-et-sessionpersist#comment-form</wfw:comment>
      <wfw:commentRss>http://batmat.net/blog/feed/rss2/comments/231</wfw:commentRss>
      </item>
    
</channel>
</rss>
