<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.netapsys.fr/index.php/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/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Netapsys Blog</title>
  <link>http://blog.netapsys.fr/index.php/</link>
  <atom:link href="http://blog.netapsys.fr/index.php/feed/author/abderrazek_chine/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Wed, 08 Feb 2012 21:50:52 +0100</pubDate>
  <copyright>Netapsys 2008 - 2011</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>L'apport du framework Spring</title>
    <link>http://blog.netapsys.fr/index.php/post/2012/01/02/Spring-et-son-apport</link>
    <guid isPermaLink="false">urn:md5:614e339ab78ceed1f446397b95b91ae8</guid>
    <pubDate>Mon, 23 Jan 2012 08:00:00 +0100</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
            
    <description>&lt;p&gt;L'objet de ce billet est d'expliciter l'apport du framework Spring dans nos développements.
&lt;br /&gt;
Les concepts de Spring IoC sont présentés accompagnés d'exemple pratique.
&lt;br /&gt;
L'idée est de partir des critères qualifiant un code de &quot;mauvais&quot; puis d'indiquer les moyens de le corriger ou le contourner.
&lt;br /&gt;
On s’appuie sur le framework Spring pour améliorer le code et ceci de manière non intrusive. &lt;br /&gt;
&lt;br /&gt;
Le concept central dans le framework Spring est: &lt;br /&gt;&quot;le cycle de vie d'un composant, son assemblage et la gestion de ses dépendances doivent se faire en dehors du composant lui-même&quot;&lt;br /&gt;
Il découle que le code de &quot;plomberie&quot; pour gérer les instances de classes (beans) ne sont plus à faire par le développeur.&lt;br /&gt;
Une connaissance sommaire de Spring facilite la lecture de ce billet.
&lt;br /&gt;
Dans l'exemple pratique de ce billet, on recourt aux annotations pour l'injection des dépendances entre les instances de classes (beans).&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt;: Quels sont les critères d'un mauvais code?
&lt;br /&gt;
De manière conceptuelle, les critères d'un mauvais code (ou mauvaise conception) sont au nombre de trois (retenons R.F.I ):
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;1- Un code Rigide&lt;br /&gt;
2- Un code Fragile&lt;br /&gt;
3- Un code Immobile&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Un code rigide est un code qui est difficile de modifier car toute modification impacte toutes les parties (couches) de l'application.
&lt;br /&gt;
Un code fragile c'est un code où la simple modification d'une partie (couche) de l'application a pour conséquence de casser d'autres parties (couches) .
&lt;br /&gt;
Un code Immobile c'est un code non réutilisable ailleurs car il est tellement lié à l'application.
&lt;br /&gt;
Voici un premier code simple  mettant en évidence la présence de l'un de ces trois critères (&lt;strong&gt;RFI&lt;/strong&gt;):
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt; 
/*classe dao*/
2. public class Dao implements IDao{
3.   public String getInfo(){
    //.... code 
4.    return &amp;quot;dao&amp;quot;
    }

/*interface IService*/
5. public interface IService { getInfo();}

/*classe Service*/
6. public class Service implements IService{
7.    private Dao dao;
8.    public String getInfo(){
9.     return dao.getInfo();
       }
       //... etc     
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
A la ligne 7 la couche service dépend d'un détail d'implémentation car son attribut 'dao' pointe sur la classe d'implémentation. Ce qui rend le code rigide et fragile.&lt;br /&gt;
&lt;br /&gt;
Pour contourner ceci, dans la classe Service, l'attribut doit pointer sur l'interface IDao à créer.
Mais c'est insuffisant car à un  moment ou un autre l'attribut 'dao' doit être instancié dans le service.
&lt;br /&gt;
Or l'opérateur 'new' d'instanciation doit porter sur une implémentation. Ainsi, le service est toujours lié au détail d'implémentation.&lt;br /&gt;
Nous souhaitons que la couche service n'a aucune référence sur les implémentations.&lt;br /&gt;
&lt;br /&gt;
Pour corriger ces facteurs, deux principes sont à respecter (principes de dépendances ):&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;P1&lt;/strong&gt;.  Les modules de haut niveau ne devrait pas dépendre de modules de bas niveau, les deux doivent dépendre des couches abstraites&lt;br /&gt;
&lt;strong&gt;P2&lt;/strong&gt;.  Les parties abstraites ne devraient pas dépendre des détails (d'implémentation), ces détails doivent dépendre uniquement des abstractions.
&lt;br /&gt;
&lt;br /&gt;
Spring avec le concept IoC va nous permettre de contourner complètement les facteurs RFI.&lt;br /&gt;
Nous allons procéder à la mise en place en reprenant l'exemple précédent.
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
/*interface IDao*/
public interface IDao{ String getInfo();}

/*classe dao*/
@Repository
public class Dao implements IDao{
public String getInfo(){
    //.... code 
      return &amp;quot;&amp;lt;dao/&amp;gt;&amp;quot;
 }
/*interface IService*/
public interface IService { getInfo();}

/*classe Service*/
@Service
public class Service implements IService{
     @Autowired
     private IDao dao; /**** ligne modifiée ****/
     public String getInfo(){
       return dao.getInfo();
    }     
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Notez la présences des annotations @Repository et @Service de Spring ajoutées dans les classes d'implémentation.&lt;br /&gt;
L'autre modification consiste à injecter, via l'annotation @Autowired de Spring, une instance de 'dao'.&lt;br /&gt;
Toutes ces annotations servent à configurer Spring. On peut bien évidemment obtenir le même résultat par de la configuration XML.
Par conséquence, la classe de détail Service ne dépend que de l'interface IDao.&lt;br /&gt;
Ainsi, nous obtenons une classe testable sans connaitre les détails d'implémentation.&lt;br /&gt;
On peut, par exemple, la tester juste avec un bouchon (mock) de la classe Dao.&lt;br /&gt;
En résumé, le couplage entre la couche service et celle de dao est faible.&lt;br /&gt;
Le framework Spring sera configuré afin de gérer les beans, les dépendances entre les beans et leur cycle de vie.&lt;br /&gt;
La figure suivante illustre cela &lt;img src=&quot;http://blog.netapsys.fr/public/ach/springIoC.png&quot; alt=&quot;springIoC.png&quot; /&gt;&lt;br /&gt;
Pour ce faire, voici le fichier de configuration de spring qui vient en complément des annotations précédentes:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;
 xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;
 xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;
 xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd&amp;quot;
 default-autowire=&amp;quot;byName&amp;quot; default-lazy-init=&amp;quot;true&amp;quot;&amp;gt;
   &amp;lt;context:component-scan base-package=&amp;quot;fr.netapsys.tb&amp;quot;/&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Bien sûr, le fichier est maigre et il le restera surtout que l'on utilise que les annotations.&lt;br /&gt;
la ligne context:component-scan précise les packages où Spring doit chercher les beans à injecter.&lt;br /&gt;
Mais cela n'est pas suffisant comme nous le verrons ci-après.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Question&lt;/strong&gt;: Que signifie un bean?&lt;br /&gt;
C'est une instance de classe simple (POJO) managée par Spring. C'est à dire, une classe instanciée et assemblée par Spring,
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Question&lt;/strong&gt;: A ce stade et juste en lisant le fichier de configuration de spring, quels sont les (nos) beans managés par Spring?
&lt;br /&gt;
Il y a deux beans&amp;nbsp;: &lt;em&gt;'dao&lt;/em&gt;' et &lt;em&gt;'service&lt;/em&gt;' puisque les deux classes sont correctement annotées (@Repository et @Service) &lt;br /&gt;et surtout que les deux classes se trouvent dans le package  du base-package du scan: 'fr.netapsys.tb'.&lt;br /&gt;
&lt;br /&gt;
Attention, l'absence d'annotation appropriée sur une classe ou lorsque le base-package du scan n'englobe pas cette classe produisent une exception générée par Spring.&lt;br /&gt;
&lt;br /&gt;
Enfin, voici les étapes de crétaion dans eclipse d'un projet simple permettant de pratiquer les concepts évoqués:&lt;br /&gt;
&lt;br /&gt;
1- Créer un projet java standard (java 5 ou +)&lt;br /&gt;
&lt;br /&gt;
2- Ajouter les jars suivants:&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;commons-logging,log4j,spring-beans,spring-core,spring-context&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
3- Ajouter au projet les packages:&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;    fr.netapsys.tb.dao,  fr.netapsys.tb.services&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
4- Ajouter le fichier Spring &lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;  Nommez-le spring-context.xml. Il contient donc une ligne:&lt;br /&gt;  
  &amp;lt;context:component-scan base-package=&quot;fr.netapsys.tb &quot;/&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
5- Ajouter l'interface IDao et son implémentation Dao:&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;  L'interface déclare l'unique méthode: String getInfo(); &lt;br /&gt;
  L'implémentation ne fait que retourner la chaîne &quot;&amp;lt;dao/&amp;gt;&quot;. &lt;br /&gt;
  Ces deux classes sont dans le package fr.netapsys.tb.dao&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
6- Ajouter la classe IMyService et son implémentation MyService:&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;  L'interface IMyService déclare une méthode : String info();&lt;br /&gt;
  MyService a un attribut de type IDao :&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
   public class MyService implements IMyService{
     private IDao dao;
    public String info(){ return dao.getInfos() ;}
 }  
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
@Service
   public class MyService implements IMyService{
     @Resource private IDao dao;
    public String info(){ return dao.getInfos() ;}
 }
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
7. Vérifier que vous annotez bien les classes Dao et Service. Sans ces annotations, Spring ne pourra pas voir ces beans dans le package de scan &lt;br /&gt;
&lt;br /&gt;
8- Pour tester, ajoutez une classe Main puis insérez ces deux lignes dans sa méthode statique main :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
ApplicationContext appCtx= new ClassPathXmlApplicationContext(&amp;quot;spring-context.xml&amp;quot;);

IMyService service=(IMyService) appCtx.getBean(&amp;quot;myService&amp;quot;);
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
La classe Main est dans le package fr.netapsys.tb.client&lt;br /&gt;
&lt;br /&gt;
Voilà, vous avez donc tous les éléments pour tester par vous même l'intégration de spring et surtout découvrir son réel apport.&lt;br /&gt;
&lt;br /&gt;
Dans la seconde partie de ce billet nous répondons à :&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;- Que doit-on utiliser BeanFactory ou ApplicationContext?&lt;br /&gt;
- Que doit-on préféter les annotations ou la configuration par XML?&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2012/01/02/Spring-et-son-apport#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2012/01/02/Spring-et-son-apport#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/361</wfw:commentRss>
      </item>
    
  <item>
    <title>Eclipse: Rafraîchir automatiquement (Refresh automatically)</title>
    <link>http://blog.netapsys.fr/index.php/post/2012/01/05/Eclipse%3A-Rafra%C3%AEchir-automatiquement-%28Refresh-automtatically%29</link>
    <guid isPermaLink="false">urn:md5:7554c4f950bf31cc31fa12f9ba240293</guid>
    <pubDate>Thu, 05 Jan 2012 13:54:00 +0100</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
            
    <description>&lt;p&gt;On répond ici à la question, que tout développeur utilisant L'IDE Eclipse, aurait posé au moins une fois :&lt;br /&gt;
Peut-on rafraichir automatiquement sans incessamment appuyer sur la touche &quot;F5&quot; ou passer par le menu?&lt;br /&gt;
La réponse est oui.&lt;br /&gt;
Voici les détails.&lt;/p&gt;    &lt;p&gt;Dans Eclipse ( à partir de version 3.7) et c'est vrai aussi pour STS (Springsource Tool Suite) choisir dans le menu:&lt;/p&gt;


&lt;p&gt;Window -&amp;gt; Préférences -&amp;gt; Général  -&amp;gt; Workspace --&amp;gt; Cocher les cases de Refresh.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;La figure suivante pour Eclipse indigo:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.netapsys.fr/public/ach/refreshAutomatic_Indigo.PNG&quot; alt=&quot;refreshAutomatic_Indigo.PNG&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-après est une illustration pour STS :&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.netapsys.fr/public/ach/refreshAutomatic_STS.PNG&quot; alt=&quot;refreshAutomatic_STS.PNG&quot; /&gt;&lt;/p&gt;




&lt;p&gt;Enjoy,&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2012/01/05/Eclipse%3A-Rafra%C3%AEchir-automatiquement-%28Refresh-automtatically%29#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2012/01/05/Eclipse%3A-Rafra%C3%AEchir-automatiquement-%28Refresh-automtatically%29#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/367</wfw:commentRss>
      </item>
    
  <item>
    <title>Les Web Servlet Filters et le cryptage -1ère partie</title>
    <link>http://blog.netapsys.fr/index.php/post/2011/08/16/LesWeb-Servlet-Filters-et-le-cryptage</link>
    <guid isPermaLink="false">urn:md5:d059cac4b11c46b7b120ce2ab1f90ef2</guid>
    <pubDate>Fri, 19 Aug 2011 20:08:00 +0200</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
            
    <description>&lt;p&gt;L'objectif du billet est d'expliquer par des exemples concrets la notion de « &lt;strong&gt;Filter &lt;/strong&gt;» (ou Web Filter, en français Filtre).&lt;br /&gt;
Pour vraiment comprendre la notion de « Servlet Filter » il faudrait les voir en action sur des exemples réels.&lt;br /&gt;
C'est justement ce que nous présentons ci-dessous.&lt;br /&gt;
La première partie de ce billet monte une démo simple mais très utile car elle détaille la création d'une « Servlet Filter » qui transforme la requête HTTP POST en simulant le cryptage du mot de passe.&lt;/p&gt;


&lt;p&gt;Aucun pré-requis n'est exigé pour cette partie.&lt;/p&gt;


&lt;p&gt;Dans la seconde partie, la démo s'intéresse à l'intégration du « Filter » à une application Web existante
basée sur spring-security 2.x. Plus précisément, la « Servlet Filter » agit sur les « Filtres » de spring-security.
&lt;br /&gt;
Cette seconde partie, d'un niveau très avancé, est réservée à ceux connaissant parfaitement spring et spring-security.
&lt;br /&gt;
Ce qui est commun entre les deux parties est que nous partons d'une application Web &lt;strong&gt;existante&lt;/strong&gt; et nous ajoutons les transformations utiles avec le filtre sans modifier le code java/jsp. Seul le fichier descripteur «&amp;nbsp;web.xml&amp;nbsp;» sera mis à jour.
&lt;br /&gt;
NOTE. Les dépendances nécessaires seront indiquées.&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Commençons par répondre aux questions fondamentales suivantes.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;&lt;ins&gt;Question1&lt;/ins&gt;&lt;/strong&gt;. C'est quoi une servlet Filter?&lt;/p&gt;


&lt;p&gt;Les spécifications Servlet v2.3 introduit un nouvel composant nommé «Servlet Filter» qui permet d'intercepter dynamiquement les requêtes et les réponses des méthodes HTTP Get/Post afin de les transformer (pré ou post-traitement).
La servlet «Filter» diffère d'une servlet standard car elle ne produit pas de réponse à une requête.&lt;/p&gt;


&lt;p&gt;NOTA. L'interception d'un flux (stream ouvert) lié à une requête/réponse n'est pas chose aisée pour des raisons, entre autres, de sécurité. L'encapsulation des objet de type ServletRequest garantit que les paramètres de la requête ne seront pas altérés.
C'est pourquoi des règles strictes sont à observer. Le seul moyen de transformer la requête (ou la réponse) est d'envelopper (d'emballer) la requête/réponse interceptée dans une nouvelle classe «Wrapper» qui hérite de HttpServletRequestWrapper ou de HttpServletResponseWrapper.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.netapsys.fr/public/webfiltres/fig1_tb_filters.gif&quot; alt=&quot;fig1_tb_filters.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Définition du filter extraite du site Oracle:
The Java Servlet specification version 2.3 introduces a new component type, called a filter.
A filter dynamically intercepts requests and responses to transform or use the information
contained in the requests or responses. Filters typically do not themselves create responses, but
instead provide universal functions that can be &quot;attached&quot; to any type of servlet or JSP page.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;ins&gt;Question2&lt;/ins&gt;&lt;/strong&gt;. Comment écrire un nouveau Filter?&lt;/p&gt;


&lt;p&gt;La «servlet Filter» doit implémenter l'interface javax.servlet.Filter qui déclare trois méthodes permettant de greffer les transformations. Ces méthodes (toutes void) sont :&lt;/p&gt;

&lt;pre&gt;doFilter(HttpServletRequest rq,HttpServletResponse rp,FilterChain ch)
throws ServletException,IOException;&lt;/pre&gt;


&lt;pre&gt;init(FilterConfig fConfig) throws ServletException;&lt;/pre&gt;


&lt;pre&gt;destroy();&lt;/pre&gt;

&lt;p&gt;La méthode principale est «doFilter». Elle centralise le code des transformations voulues, et c'est ici que le chaînage doit être réalisé avec l'appel suivant ch.doFilter(req,rep) ce qui permet de passer la main aux autres Filtres jusqu'à la servlet ou la jsp finale.&lt;/p&gt;


&lt;p&gt;Passons à la pratique.&lt;/p&gt;



&lt;p&gt;Développons d'abord un exemple simple et pratique.&lt;/p&gt;


&lt;p&gt;Mais avant, préparons ensemble l'environnement en commençant par le projet Web (existant) avant de lui rajouter le Filter.&lt;/p&gt;


&lt;p&gt;1- Créer sous eclipse, un projet «Dynamic Web Project» nommé «demo1». Indiquer « Tomcat » comme serveur conteneur servlet.&lt;/p&gt;


&lt;p&gt;2- Créer une servlet nommée MyServlet dont le code se résume à:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; [java]
	final String NAME=&amp;quot;j_username&amp;quot;;
	final String PWD=&amp;quot;j_password&amp;quot;;
    	public MyServlet() {
        super();
    	}
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
	throws ServletException, IOException {
		doPost(req, resp);
				
	}
	protected void doPost(HttpServletRequest req,HttpServletResponse resp) 
	throws ServletException, IOException {
		String nom=req.getParameter(NAME);
		String pwd=req.getParameter(PWD);
		
		PrintWriter pwriter=resp.getWriter();
		pwriter.println(&amp;quot;&amp;lt;h1&amp;gt;nom=&amp;quot;+nom+&amp;quot;, pwd=&amp;quot;+pwd);
		
	}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
La page jsp nommé «login.jsp» qui contient le formulaire de   saisie du couple nom/password. Le code jsp est :
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; [jsp]
   &amp;lt;html&amp;gt;
   &amp;lt;body&amp;gt;
   &amp;lt;form action=&amp;quot;MyServlet&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;
   &amp;lt;label&amp;gt;Nom : &amp;lt;/label&amp;gt;&amp;lt;input id=&amp;quot;j_username&amp;quot; name=&amp;quot;j_username&amp;quot; value=&amp;quot;TOTO&amp;quot;/&amp;gt;
   &amp;lt;label&amp;gt;Identifiant : &amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;j_password&amp;quot;  
    name=&amp;quot;j_password&amp;quot; value=&amp;quot;TOTOLEVRAI&amp;quot;/&amp;gt;
   &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;
   &amp;lt;/form&amp;gt;
   &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Notez l'action du formulaire (balise &amp;lt;form&amp;gt;) est MyServlet.
Et les deux champs de saisie sont nommés respectivement 'j_username' et 'j_password'.&lt;/p&gt;


&lt;p&gt;Testons que tout fonctionne bien en saisissant dans le navigateur l'Url :&lt;br /&gt;
&lt;a href=&quot;http://localhost:8080/demo1/login.jsp&quot; title=&quot;login&quot;&gt;http://localhost:8080/demo1/login.jsp&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Saisir le nom 'toto' et son password 'TOTOLEVRAI' et MyServlet affiche ceci :
nom=toto, pwd=TOTOLEVRAI&lt;/p&gt;



&lt;p&gt;Voici donc l'application Web existante.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Elle est bien simple et le contenu de son descripteur « web.xml » est, pour l'instant, bien maigre :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; [xml]
   &amp;lt;servlet&amp;gt;
    &amp;lt;description&amp;gt;&amp;lt;/description&amp;gt;
    &amp;lt;display-name&amp;gt;MyServlet&amp;lt;/display-name&amp;gt;
    &amp;lt;servlet-name&amp;gt;MyServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;[NOM_PACKAGE].MyServlet&amp;lt;/servlet-class&amp;gt;
   &amp;lt;/servlet&amp;gt;
   &amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;MyServlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/MyServlet&amp;lt;/url-pattern&amp;gt;
   &amp;lt;/servlet-mapping&amp;gt;
    &amp;lt;welcome-file-list&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;
   &amp;lt;/welcome-file-list&amp;gt;
  
&lt;/pre&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Attention, il faudrait compléter ce fichier avec le nom de votre &lt;strong&gt;package&lt;/strong&gt; de MyServlet ci-dessus.&lt;/p&gt;


&lt;p&gt;Pour la suite, supposons que notre client  exige de ne pas afficher ni stocker en clair les mots de passe.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Évidemment c'est ici le «Filter» entre en jeu. &lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ecrivons une classe Servlet Filter, nommée MyFilter.
Celle-ci va s'appuyer sur une autre, nommée MyRequestWrapper qui hérite de HttpServletRequestWrapper et qui permet d'envelopper la requête en entrée et lui greffer les transformations utiles.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;L'idée intéressante est que, dans MyRequestWrapper, la méthode String getParameter (String param) définie dans la classe mère est surchargée.&lt;br /&gt;
Le décorateur assure ainsi que l'application Web existante continue à fonctionner correctement alors que la valeur du paramètre &quot;j_pasword&quot; a été transformé.&lt;br /&gt;
En principe, d'autres méthodes sont à surcharger mais pour notre démo cela est suffisant.&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;La création de ce «Filter» se fait en trois étapes :&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Étape 1&lt;/strong&gt;. Écrire la classe enveloppe MyRequestWrapper.java :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; [java]
public class MyRequestWrapper extends HttpServletRequestWrapper {

	public MyRequestWrapper(HttpServletRequest request) {
		super(request);
	}
	//surcharger la méthode getParameter
	public String getParameter(String param){
		if(param.equals(&amp;quot;j_password&amp;quot;)){
			return &amp;quot;Xyuty/Rcryptedendur!=&amp;quot;;
		}else{
			return super.getParameter(param);
            }
	}
  }

&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Étape 2&lt;/strong&gt;. Écrire la classe Filter nommé «MyFilter» dont voici son contenu :&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; [java]
 import java.io.IOException;
 import javax.servlet.*;

 public class MyFilter implements Filter {

   private FilterConfig fConfig;
   public MyFilter() {
        super();
    }
   public void doFilter(ServletRequest req,ServletResponse resp,FilterChain ch) 
   throws IOException, ServletException {
	String pwd=(String) request. getParameter(&amp;quot;j_password&amp;quot;);
	if (req instanceof HttpServletRequest &amp;amp;&amp;amp; pwd!=null ){
	  MyRequestWrapper requestWrapper=new 
	  MyRequestWrapper((HttpServletRequest)req);
	  ch.doFilter(requestWrapper, resp);
	}else{
	   // pass the request along the filter chain
	   ch.doFilter(request, response);
	 }
	}
	public void init(FilterConfig fConfig) throws ServletException {
		this.fConfig=fConfig;
	}
	public void destroy() {fConfig=null;}
 }
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Étape 3&lt;/strong&gt;. Compléter le fichier «web.xml» afin d'ajouter la déclaration du Filter comme suit :&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;filter&amp;gt;
  &amp;lt;filter-name&amp;gt;myFilter&amp;lt;/filter-name&amp;gt;
   &amp;lt;filter-class&amp;gt;[NOM_PACKAGE].MyFilter&amp;lt;/filter-class&amp;gt;
  &amp;lt;/filter&amp;gt;
  &amp;lt;filter-mapping&amp;gt;
   &amp;lt;filter-name&amp;gt;myFilter&amp;lt;/filter-name&amp;gt;
   &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/filter-mapping&amp;gt;

&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Adaptez ce fichier avec le nom de votre package et relancer l'Url précédente dans le navigateur, le résultat affiché est :&lt;/p&gt;


&lt;p&gt;nom=toto, pwd=Xyuty/Rcryptedendur!=&lt;/p&gt;


&lt;p&gt;Voilà la première démo est terminée. Les étapes nécessaires de création d'une «Servlet Filter» permettant d'effectuer des transformations du flux de la requête sont explicitées.&lt;/p&gt;


&lt;p&gt;Donc, nous avons simulé le cryptage du mot de passe avec une chaîne écrite en dur. Nous aurions dû appeler une méthode qui effectue réellement le cryptage. C'est ce que nous ferons dans la seconde partie.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2011/08/16/LesWeb-Servlet-Filters-et-le-cryptage#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2011/08/16/LesWeb-Servlet-Filters-et-le-cryptage#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/289</wfw:commentRss>
      </item>
    
  <item>
    <title>Le duo Spring et Scala  en 20 minutes</title>
    <link>http://blog.netapsys.fr/index.php/post/2011/06/24/Le-duo-Spring-et-Scala-en-20-minutes</link>
    <guid isPermaLink="false">urn:md5:264a31dca6bd15cc4709b349e1507db5</guid>
    <pubDate>Fri, 24 Jun 2011 06:58:00 +0200</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
            
    <description>&lt;p&gt;&lt;br /&gt;
Réunir le duo &quot;Scala&quot; et &quot;Spring&quot; dans une démo est une belle entreprise.&lt;br /&gt;Combiner le meilleur des deux rapidement est une expérience excitante!:)&lt;br /&gt;
A Netapsys, Spring est bien présent dans tous les projets J2EE.&lt;br /&gt;
Scala aura-t-il le même sort? Ce qui est sûr, Scala a tous les atouts pour.&lt;br /&gt;
&lt;br /&gt;
Sur le net, bien que ce sujet est peu abordé mais vous trouvez &lt;a href=&quot;http://www.infoq.com/articles/scala_and_spring&quot;&gt;ici&lt;/a&gt; un article intéressant sur ce thème.&lt;br /&gt;
Ce billet vous présente une démo qui montre comment, en 20 minutes, réaliser cette expérience (magique :)).&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;La démo reprend l'exemple d'envoi de mail (voir &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/20/En-java%2C-comment-tester-en-simulant-l-envoi-%28en-masse%29-de-mail&quot;&gt;ici&lt;/a&gt;) que je recommande sa lecture :).&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Passons aux choses pratiques...
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;ins&gt;Prérequis&lt;/ins&gt;&lt;/strong&gt;: &lt;br /&gt;
Ajouter au projet &lt;strong&gt;scala&lt;/strong&gt; créé sous eclipse les dépendances :&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;spring-2.5.6.jar, spring-test-2.5.6.jar,  jsr250-api-1.0.jar, &lt;br /&gt;
mail-1.2.4.jar, activation-1.1.jar, &lt;br /&gt;
Junit-4.4.jar, commons-loggings-1.1.1.jar.&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;NOTE&lt;/em&gt;.&lt;/strong&gt; Les numéros de versions sont données à titre indicative.&lt;br /&gt;
Je recommande JUnit-4.4 afin d'éviter un bug connu dans la suivante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ACTE 1&lt;/strong&gt;: Fichier de Spring&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Créer un fichier xml et placer le dans le répertoire &lt;em&gt;src&lt;/em&gt;.&lt;br /&gt;
Ce fichier ne contient qu'une seule déclaration du bean JavaMailSender de l'API Spring.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;
 xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; 
 xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;
 xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;
 xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd&amp;quot;&amp;gt;
	
 &amp;lt;context:component-scan base-package=
    &amp;quot;fr.netapsys.blog.simulatemail&amp;quot; /&amp;gt;	
 &amp;lt;bean id=&amp;quot;javaMailSender&amp;quot; 
  class=&amp;quot;org.springframework.mail.javamail.JavaMailSenderImpl&amp;quot;&amp;gt;
   &amp;lt;property name=&amp;quot;host&amp;quot; value=&amp;quot;localhost&amp;quot; /&amp;gt;
 &amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;ACTE 2&lt;/strong&gt;: Un trait IMailSender&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le code scala du trait (interface) est:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
package fr.netapsys.blog.springmail
trait IMailSender {
  def send(to:String,from:String,body:String)
  def send(to:String,from:String,subject:String,body:String)
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Rien à dire de particulier. un trait bien ordinaire!.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;ACTE 3&lt;/strong&gt;: Une classe MailSender&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;em&gt;MailSender&lt;/em&gt; est la seule classe (service) scala qui gère l'envoi de mail.&lt;br /&gt;
Elle étend le trait &quot;IMailSender&quot;&lt;br /&gt;
Elle s'appuie sur l'API Spring org.springframework.mail.javamail.Spring JavaMailSender.&lt;br /&gt;
Voici le contenu de &lt;em&gt;MailSender.scala&lt;/em&gt;:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
package fr.netapsys.blog.springmail
import javax.mail.internet.MimeMessage
import org.springframework.mail.javamail._
import org.springframework.stereotype.Service
import javax.annotation.Resource
@Service(&amp;quot;mailSender&amp;quot;)
class MailSender  extends IMailSender {
var javaMailSender:JavaMailSender=null
def send(to: String, from: String,subject:String, body: String){
    javaMailSender.send( 
       new MimeMessagePreparator() {
	 override def prepare( mimeMessage:MimeMessage) {
	  val helper = new MimeMessageHelper(mimeMessage, false)
	  helper.setTo(to); helper.setFrom(from)
	  helper.setSubject(&amp;quot;NO SUBJECT!!&amp;quot;)
	  if(subject!=null) helper.setSubject(subject)
	  helper.setText(body, true)
	}		
    }
 )
}

 def send(to: String, from: String, body: String)=
                 send(to,from,null,body)
  
 @Resource
 def setJavaMailSender(jMailSender:JavaMailSender) {
  this.javaMailSender = jMailSender;
 }
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Comme en java, voir &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/20/En-java%2C-comment-tester-en-simulant-l-envoi-%28en-masse%29-de-mail&quot;&gt;billet&lt;/a&gt;, la méthode &lt;em&gt;send&lt;/em&gt; de &lt;em&gt;JavaMailSender&lt;/em&gt; prend en argument&lt;br /&gt;
l'interface &lt;em&gt;MimeMessagePreparator&lt;/em&gt; ayant une seule méthode nommée &lt;br /&gt;
&lt;em&gt;prepare&lt;/em&gt; surchargée dans ce code.&lt;br /&gt;
Ce qui explique la présence du terme réservé &quot;override&quot; devant &lt;em&gt;def prepare&lt;/em&gt;.&lt;br /&gt;
L'annotation de Spring @Service permet d'injecter ce service comme nous le verrons&lt;br /&gt;
dans la classe object &quot;Main&quot; ci-après.&lt;br /&gt;
Le setter annoté avec @Resource permet d'injecter la variable JavaMailSender.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;ACTE 4&lt;/em&gt;&lt;/strong&gt;: Une classe  Main avec simulation de l'envoi&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
package fr.netapsys.blog.springmail
import javax.annotation.Resource
import org.springframework.mail.javamail._
import org.springframework.context.support._
import org.springframework.context.ApplicationContext

object Main extends App{
//init Spring AppContext
val ctx:ApplicationContext = new 
    ClassPathXmlApplicationContext(&amp;quot;spring-mail.xml&amp;quot;)
// get the only bean from spring ctx
val mailSender:IMailSender= 
    ctx.getBean(&amp;quot;mailSender&amp;quot;).asInstanceOf[IMailSender]
//call method send
mailSender.send(&amp;quot;a.c@n.fr&amp;quot;,&amp;quot;from@from.fr&amp;quot;,
     &amp;quot;Scala and Spring form a couple of shock!&amp;quot;)
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Avant d'exécuter ce &quot;Main&quot;, télécharger &lt;a href=&quot;http://sites.google.com/site/tririgadevelopment/smtp.jar?attredirects=0&quot;&gt;smtp.jar&lt;/a&gt; &lt;br /&gt;
Déposer ce jar dans un répertoire nommons-le SMTP_REP.&lt;br /&gt;
Dans SMTP_REP, lancer avec la console Dos, la commande &quot;jar -java smtp.jar&quot; et laisser la console ouverte.&lt;br /&gt;
Le &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/20/En-java%2C-comment-tester-en-simulant-l-envoi-%28en-masse%29-de-mail&quot;&gt;billet&lt;/a&gt; détaille ce point.&lt;br /&gt;
Enfin, dans eclipse, clic droit sur &quot;Main&quot; Run as Scala Application.&lt;br /&gt;
Les résultats sont affichés dans la console Dos et des fichiers logs sont rajoutés dans le répertoire SMTP_REP.&lt;br /&gt;
C'est la fonction &quot;send&quot; ayant trois arguments qui est utilisée dans le &quot;Main&quot;.&lt;br /&gt;
Voilà, j'ai bien dit que c'était simple mais surtout rapide.&lt;br /&gt;
Vous avez le meilleur de Spring et de Scala entre vos mains.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Et si on évoque les &quot;Closures&quot; dans scala, les &quot;Free variable&quot; et les 'Open Terms&quot;?&lt;br /&gt;
Ah non! on va laisser tout ça à une prochaine fois disons après le bronzage de l'été:)&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2011/06/24/Le-duo-Spring-et-Scala-en-20-minutes#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2011/06/24/Le-duo-Spring-et-Scala-en-20-minutes#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/278</wfw:commentRss>
      </item>
    
  <item>
    <title>Langage Scala [3ème partie]</title>
    <link>http://blog.netapsys.fr/index.php/post/2011/06/22/Langage-Scala-%5B3%C3%A8me-partie%5D</link>
    <guid isPermaLink="false">urn:md5:570e50ddbb0ed880c5d61090a08d4cdd</guid>
    <pubDate>Wed, 22 Jun 2011 21:56:00 +0200</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Scala</category>
            
    <description>&lt;p&gt;Nous avons vu dans la seconde partie quelque concepts de  scala qui vous ont donné l'envie de poursuivre la découverte de scala.&lt;br /&gt;
L'apprentissage de scala nous donne l'opportunité de redécouvrir ce que nous connaissons au quotidien: le monde java/j2ee.&lt;br /&gt;
Et nous encourage aussi à porter un regard critique sur le code que nous produisons.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ce qui est sûr est que la liste des grands clients séduits par scala s'allonge: Sony, SAP, Siemens, EDF,...&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Nous avons évoqué le concept &quot;tout est fonction&quot; dans scala, plus précisément, une fonction est un objet avec la méthode &quot;apply&quot;. &lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le plan de cette 3ème partie est comme suit:&lt;/p&gt;


&lt;pre&gt;
-  Connexion JDBC,
-  Retour sur les constructeurs et les annotations&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Avec ces annotations, c'est fini la galère des getters/setters (même s'ils sont générés par EDI).
&lt;br /&gt;
Les démos sont testés avec eclipse sous windows.
&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Démo 1&lt;/strong&gt; JDBC&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;Le code suivant, déjà présenté dans la seconde partie, est remanié et complété avec try-finally afin de libérer les ressources jdbc.&lt;br /&gt;
L'url pointe sur une base informix, vous pouvez l'adapter à votre base, mysql ou toute autre base fera l'affaire.&lt;br /&gt;
Les éléments en majuscule dans l'url doivent être vérifiés.&lt;br /&gt;
Enfin, n'hésitez pas à réécrire la requête SQL simplement avec le nom correct de votre table.&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
package fr.netapsys.blog.jdbc
import java.sql._
object MainJdbc extends App {
	@throws(classOf[SQLException])
	def connect:Connection ={
		classOf[com.informix.jdbc.IfxDriver].newInstance
		DriverManager.getConnection(
                    &amp;quot;jdbc:informix-sqli://localhost:PORT/BD:informixserver=SERVER&amp;quot;, 
                    &amp;quot;informix&amp;quot;, &amp;quot;administrateur&amp;quot;)
	}
        // la fonction connect affecté à l'attribut con
	var con=connect
	var rs:ResultSet=null
	var stm:Statement=null
	try{ 
		stm= con.createStatement
		rs=stm.executeQuery (&amp;quot;select count(*) nb from agent&amp;quot;)
		if(rs.next) 
		 Console.println(&amp;quot;Nb agents=&amp;quot;+rs.getInt(&amp;quot;nb&amp;quot;))
	}finally{
		if(null!=rs)rs.close
		if(null!=stm)stm.close
		if(null!=con)con.close
	}		  
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Vous notez bien qu'une fonction nommée &quot;connect&quot; est affectée à une variable nommée &quot;con&quot;. &lt;br /&gt;
Une fonction dans scala est un objet tout simplement. Nous illustrons ce point intéressant ci-après.&lt;br /&gt;
En attendant,  vous constatez que &lt;em&gt;MainJdbc&lt;/em&gt; est un object qui ne définit pas de méthode &quot;&lt;em&gt;main&lt;/em&gt;&quot;.&lt;br /&gt;
C'est la seconde façon de définir une classe &quot;main&quot;.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Je reviendrai aussi sur les annotations afin d'en rajouter d'autres.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Démo 2&lt;/strong&gt; Les constructeurs et les annotations&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;L'exemple suivant illustre la déclaration d'un constructeur principal et avec l'annotation @BeanProperty du package scala.reflect, nous avons les getters/setters sans écrire du code (de plomberie).&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
package fr.netapys.blog.constructeurs
import scala.reflect.BeanProperty

class Etablissement(@BeanProperty var raisonSociale:String , @BeanProperty var id:String) {

	@Override
	override def toString():String={
		&amp;quot;Rs='&amp;quot;+getRaisonSociale() + &amp;quot;' id=&amp;quot;+ getId()
	}
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Notez que les setters/getters sont appelés dans la méthode toString surchargée ici.&lt;br /&gt;
Les getters/setters sont générés par scala car&amp;nbsp;:
- la présence de l'annotation @BeanProperty
- les arguments du constructeur sont des &quot;&lt;strong&gt;var&lt;/strong&gt;&quot; (d'où les setters générés)&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Le code de la classe &quot;object&quot; permet de tester notre exemple volontairement simple :&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
object MainEtablissement extends App{
	val etab:Etablissement = new Etablissement(&amp;quot;rs1&amp;quot;,&amp;quot;02A&amp;quot;)	
	etab.setRaisonSociale(&amp;quot;new rs&amp;quot;)	
	println( etab )
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Je vous laisse découvrir la sortie de la console en cliquant droit sur cette classe &quot;MainEtablissement&quot; puis Run as Scala Application.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Pour finir, j'aborderai prochainement le mariage heureux du duo  Spring et Scala.&lt;br /&gt; Ca promet.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2011/06/22/Langage-Scala-%5B3%C3%A8me-partie%5D#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2011/06/22/Langage-Scala-%5B3%C3%A8me-partie%5D#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/275</wfw:commentRss>
      </item>
    
  <item>
    <title>Langage Scala [2ème partie]</title>
    <link>http://blog.netapsys.fr/index.php/post/2011/06/21/Langage-Scala-%5B2%C3%A8me-partie%5D</link>
    <guid isPermaLink="false">urn:md5:35aede973bf16268eb01e4206a0d21e1</guid>
    <pubDate>Tue, 21 Jun 2011 11:32:00 +0200</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Scala</category>
            
    <description>&lt;p&gt;Nous avons vu dans la première partie une introduction de scala avec des démos de ses concepts de base.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ces démos, j'espère, vous ont donné l'envie de découvrir ce langage fort intéressant.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Dans le passé, l'informatique a été révolutionnée avec le concept &quot;tout est objet&quot; et il me semble qu'un
nouveau concept &quot;tout est fonction&quot; va marquer l'informatique de demain. &lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Scala tente de rapprocher ces deux concepts en donnant de la liberté aux développeurs de faire le choix&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Scala impose un typage statique strict mais lève les restrictions imposées par certains concepts java. Nous y reviendrons dans la 3ème partie.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;L'attrait de scala est dans le fait que les meilleures choses qui existent dans les langages récents (objet ou fonctionnel) sont désormais à portée de main.&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;Passons à la pratique...&lt;/p&gt;


&lt;p&gt;Le plan de ce billet est comme suit:&lt;/p&gt;

&lt;pre&gt;
- Lecture de fichier dans scala;
- Notion de traits (interface ou classe abstraite)
- Connection JDBC dans scala&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Démo 1&lt;/strong&gt;. Lecture de fichier&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ce bout de code déjà présenté dans la première partie.
Nous avons vu qu'une seule ligne permet de lire le contenu d'un fichier&amp;nbsp;:
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;  
	fromFile(&amp;quot;nom_fichier&amp;quot;)

&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Simple et rapide car pas de checked exception dans scala.
N'oubliez pas de faire l'import de scala.io.Source.fromFile

&lt;br /&gt;
Si le fichier n'existe pas il peut être judicieux de récupérer l'exception
pour la traiter dans le programme. &lt;br /&gt;
Ceci peut se faire, avec java.io.FileNotFoundException, comme suit:
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
	try{
		  fromFile(&amp;quot;nom_fichier&amp;quot;)
	catch{
	    case e:FileNotFoundException =&amp;gt; {
		logger.error(e.getMessage())
		//traitement de reprise a faire...
	    }
      }
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;

Un point intéressant est de constater qu'en scala il y a un seul bloc try-catch.
Avec le mot clé &quot;case&quot; on peut traiter toutes sorte d'exception dans le même bloc catch.
&lt;br /&gt;
Un billet sera consacré au mot clé &quot;case&quot; prochainement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;
&lt;strong&gt;Démo 2&lt;/strong&gt;. Notion de trait&lt;/p&gt;


&lt;p&gt;La notion de trait peut être considérée comme proche de l'interface ou une classe abstraite dans java.
Un trait peut contenir de l'implémentation comme dans les classes abstraites java.
&lt;br /&gt;
Mais encore une fois c'est complètement différent de java.
&lt;br /&gt;
La notion de trait permet d'implémenter, à un dosage calculé, l'héritage multiple.
Bien évidemment, les inconvénients de l'héritage multiple ne sont pas complètement levés.
Avec la notion de trait, ils peuvent être contournés.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Vous dites que rien de nouveau ici mais si.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Avec les exemples ci-après, nous allons nous rendre compte de l'utilité des traits.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;  * &lt;strong&gt;Démo 2.1&lt;/strong&gt; Exemple simple&lt;br /&gt;&lt;/pre&gt;


&lt;p&gt;
Un trait se déclare avec le mot clé &quot;trait&quot; de scala, écrivons ces deux lignes dans un fichier IVoiture.scala.&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;pre&gt;		
	trait IVoiture {
	   def avancer():Unit
	}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;La classe qui étend (&lt;em&gt;extends&lt;/em&gt; car pas de implements dans scala) ce trait est nommée Voiture:
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
class Voiture extends IVoiture {
    val MESSAGE=&amp;quot;Ma voiture avance...&amp;quot;
    override def avancer()  { 
	println(MESSAGE) 
	()  //renvoi par defaut value() qui siginifie void
    }
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;
* &lt;strong&gt;Démo 2.2&lt;/strong&gt;. Exemple avancé (cette partie un peu difficile est optionnelle pour la suite)&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;
C'est un peu verbeux et long comme exemple.&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Il est même inutile pour le résultat obtenu mais il permet de s'exercer sur les notions déjà vues et d'illustrer l'intérêt de la notion &quot;trait&quot;.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Cet exemple inspiré d'un projet réel qui, en croisant de nombreux référentiels, tente de fiabiliser les données sur les activités des entreprises.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ici, la donnée d'activité qui correspond au code Ape dans l'INSEE est comparé à un autre code d'activité du référentiel FINESS.
&lt;br /&gt;
Le but ici est de définir trois traits et de montrer ensuite comment peut-on adapter le comportement des classes.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le comportement de ces classes peuvent être adaptées en fonction de l'un des traits (polymorhisme sans héritage ni composition).&lt;/p&gt;


&lt;p&gt;Je sais que ce n'est pas clair!&lt;/p&gt;


&lt;p&gt;Écrivons quelques lignes de code puis lançons l'exécution qui nous permettra d'y revenir avec des explications claires.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;
# - Premier trait IReferentiel dont voici le contenu:
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
   trait IReferentiel {
	def getCodeActivite(id:String):String	
  }
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;
# - Le second nommé IRefINSEE qui étend le précédent:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
trait IRefInsee extends IReferentiel {
  abstract override def getCodeActivite(id:String): String ={
	super.getCodeActivite(id)+ &amp;quot; FINESS: '&amp;quot; + findByIdActivite(id)+&amp;quot;&amp;quot;
  }
  private def findByIdActivite(id:String):String ={
   id match{
     case &amp;quot;8610Z&amp;quot; =&amp;gt; &amp;quot;101&amp;quot;
     case _ =&amp;gt; throw new 
         IllegalArgumentException(&amp;quot;idActivite &amp;quot;+id+&amp;quot; not correct &amp;quot;)	
    }
  }
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;

# - Le 3ème trait nommé IRefFiness&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
trait IRefFiness extends IReferentiel {
 abstract override def getCodeActivite(id:String): String = { 
   super.getCodeActivite(id)+&amp;quot; INSEE:'&amp;quot;+findByIdActivite(id)+&amp;quot;&amp;quot; 
 }
 private def findByIdActivite(id:String):String={
   id match{
    case &amp;quot;101&amp;quot; =&amp;gt; &amp;quot;8610Z&amp;quot;
    case _ =&amp;gt; throw new 
            IllegalArgumentException(&amp;quot; id=&amp;quot;+id+&amp;quot; not correct &amp;quot;)	
   }
 }
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Et une classe &quot;Entreprise&quot; du modèle dont voici le contenu:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; 
class Entreprise (nom:String,identifiantActivite:String) 
extends IReferentiel {
  override def getCodeActivite(identifiantActivite:String): String = {
	   &amp;quot; FROM REFERENTIEL &amp;quot;  
}		 
override def toString():String={
   &amp;quot;Entreprise(nom=&amp;quot;+nom+&amp;quot; idActivite=&amp;quot;+identifiantActivite+
    &amp;quot; codeActivite='&amp;quot;+getCodeActivite(identifiantActivite)+&amp;quot;')&amp;quot;	
}  
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;

&lt;br /&gt;
Enfin, écrivons un &lt;em&gt;object&lt;/em&gt; Main pour test:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
object MainTraits {
    def main(args:Array[String]):Unit={
      val entrep:Entreprise=new 
               Entreprise(&amp;quot;EntrepF1&amp;quot;,&amp;quot;125&amp;quot;) with IRefFiness 
      println(entrep)

      val entrepInsee:Entreprise=new 
           Entreprise(&amp;quot;EntrepSirene1&amp;quot;,&amp;quot;8610Z&amp;quot;) with IRefInsee 
       println(entrepInsee)
   }
}	
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;

&lt;br /&gt;
Vous constatez que l'attribut &lt;em&gt;entrep&lt;/em&gt; est déclaré en ajoutant en fin de ligne &quot;with IRefFiness&quot; ou &quot;with IRefInsee&quot;.
Ceci déterminera le comportement de l'instance de cette classe.&lt;br /&gt;
Voici un aperçu des résultats que vous devriez obtenir en cliquant droit sur &quot;MainTraits&quot; puis Run As &quot;scala application&quot;  :&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt; 
Entreprise(nom=EntrepF1 idActivite=125 codeActivite=' FROM REFERENTIEL  INSEE:'8623Z')
Entreprise(nom=EntrepSirene1 idActivite=8610Z codeActivite=' FROM REFERENTIEL  FINESS: '101')
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Pour finir, un bout de code scala pour se connecter à une base (ici c'est Informix car je n'en vois pas beaucoup d'exemples sur le net )&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
import java.sql.{SQLException,DriverManager,Statement,Connection}
import java.sql.ResultSet
object MainJdbc extends App {
 
 @throws(classOf[SQLException])
 def connect:Connection ={
     classOf[com.informix.jdbc.IfxDriver].newInstance
     DriverManager.getConnection(
       &amp;quot;jdbc:informix-sqli://localhost:PORT/BD:informixserver=IFX_SERVER&amp;quot;, &amp;quot;U&amp;quot;, &amp;quot;P&amp;quot;)
 }	
 val con:Connection=connect 
 val stm:Statement= con.createStatement
 val rs=stm.executeQuery (&amp;quot;select count(*) nb from TABLE&amp;quot;)
 var nb=0
 if(rs.next) Console.println(&amp;quot;Nb=&amp;quot;+rs.getInt(&amp;quot;nb&amp;quot;)
			  
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Nous introduisons dans cet exemple, quelques notions intéressantes illustrant, entre autres, le concept &quot;&lt;strong&gt;tout est fonction&lt;/strong&gt;&quot;.&lt;br /&gt;
Vous notez bien qu'une fonction nommée &quot;connect&quot; est affectée à une variable nommée &quot;con&quot;. &lt;br /&gt;
L'object &lt;em&gt;MainJdbc&lt;/em&gt; ne contient pas de méthode &quot;&lt;em&gt;main&lt;/em&gt;&quot;.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Je vais devoir m'arrêter là, nous détaillerons ces nouveautés au prochain billet où je reviendrai sur les annotations.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
A la prochaine fois.
&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2011/06/21/Langage-Scala-%5B2%C3%A8me-partie%5D#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2011/06/21/Langage-Scala-%5B2%C3%A8me-partie%5D#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/273</wfw:commentRss>
      </item>
    
  <item>
    <title>En java, comment tester en simulant l'envoi de mail?</title>
    <link>http://blog.netapsys.fr/index.php/post/2011/06/20/En-java%2C-comment-tester-en-simulant-l-envoi-%28en-masse%29-de-mail</link>
    <guid isPermaLink="false">urn:md5:299d83338c7f448255ae2b743d6121d0</guid>
    <pubDate>Mon, 20 Jun 2011 21:26:00 +0200</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
            
    <description>&lt;p&gt;L'objet de ce billet est de répondre à la question posée dans le titre. Précisément, en mode &lt;strong&gt;non connecté&lt;/strong&gt;, comment simuler l'envoi de mail?&lt;br /&gt;
Ici, on ne traite pas la notion d'envoi en masse.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;C'est un problème récurrent qui s'impose avant ou durant les tests/recettes des programmes java envoyant des mails (surtout en masse).
&lt;br /&gt;
L'utilisation du serveur mail de l'entreprise (ou de gmail) peut être pénalisant surtout lorsqu'il s'agit d'envoi en masse ou encore durant les mises au point.
En six actes, nous donnons la démarche accompagnée d'une démo. &lt;br /&gt;
La démo s'appuie sur Spring bien qu'il n'est pas nécessaire ici (mais difficile de s'en passer).&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;En effet avec Spring, nous écrivons beaucoup moins de plomberie de l'API mail java.&lt;br /&gt;
La démo est un projet Java standard.
Toutes les indications de configuration des jar nécessaires ou de Spring sont détaillées.
&lt;br /&gt;
La démo est réalisée sous windows mais le principe est le même pour les machines linux.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Passons à la pratique...
&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Acte 1&lt;/strong&gt;: Télécharger &lt;a href=&quot;http://sites.google.com/site/tririgadevelopment/smtp.jar?attredirects=0&quot;&gt;smtp.jar&lt;/a&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Acte 2&lt;/strong&gt;: Déposer ce jar dans un répertoire de votre choix, nommons-le SMTP_REP
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Acte 3&lt;/strong&gt;: Avec la console, se déplacer dans le répertoire SMTP_JAR puis lancer la commande: &lt;em&gt;java -jar smtp.jar&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;                    Laisser la console ouverte.&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Acte 4&lt;/strong&gt;:  Configurer le classpath du projet java&lt;/p&gt;


&lt;pre&gt;Créer sous eclipse un projet java standard. Ajouter les jars suivants:
 spring-2.5.6.jar, spring-test-2.5.6.jar
 mail-1.4.2.jar, activation-1.1.jar&lt;br /&gt;
 JUnit-4.4.jar ( éviter de prendre JUnit 4.5 bugué?)&lt;br /&gt;
 jsr250-api-1.0.jar
 commons-logging-1.1.1.jar&lt;/pre&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Acte 5&lt;/strong&gt;: Créer un fichier de configuration de Spring nommé &lt;em&gt;spring-mail.xml&lt;/em&gt; dont voici son contenu:
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt; [code xml]

&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;
 xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; 
 xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;
xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;
xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd&amp;quot;&amp;gt;

&amp;lt;!-- component-scan necessaire pour l'injection autowiring --&amp;gt;
  &amp;lt;context:component-scan base-package=
      &amp;quot;fr.netapsys.blog.simulatemail&amp;quot; /&amp;gt;
	
&amp;lt;bean id=&amp;quot;mailSender&amp;quot; 
       class=&amp;quot;org.springframework.mail.javamail.JavaMailSenderImpl&amp;quot;&amp;gt;
	&amp;lt;property name=&amp;quot;host&amp;quot; value=&amp;quot;localhost&amp;quot; /&amp;gt; 
	&amp;lt;property name=&amp;quot;javaMailProperties&amp;quot;&amp;gt;
			&amp;lt;props&amp;gt;
				&amp;lt;prop key=&amp;quot;mail.debug&amp;quot;&amp;gt;false&amp;lt;/prop&amp;gt;
			&amp;lt;/props&amp;gt;
	&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
La seule chose à signaler est que nous allons utiliser la classe de Spring nommée &lt;em&gt;JavaMailSenderImpl&lt;/em&gt;.&lt;br /&gt;
La propriété  &quot;host&quot; pointe vers &quot;localhost&quot;. C'est ce que nous désirons et que nous expliquons plus loin.&lt;br /&gt;
Le reste des propriétés ne sont pas utiles pour notre démo.
Eventuellement, lorsque mail.debug est à true,  les logs du serveur mail sont verbeux.
&lt;br /&gt;
Les commentaires insérés dans le fichier sont utiles.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Acte 6&lt;/strong&gt;: Ecrivons un peu de code java , une seule classe nommée &lt;em&gt;fr.netapsys.blog.simulatemail.MailSenderSpring&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt; [code JAVA]

package fr.netapsys.blog.simulatemail;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.*;
@Service
public class MailSenderSpring {
   private JavaMailSender mailSender;						
   public void send(final String mailTo, final String from,  final String subject,
        final String bodyMail) throws MailSendException, MailException {
    // classe anonyme Preparator
    MimeMessagePreparator preparator=new MimeMessagePreparator() {
	public void prepare(MimeMessage mimeMessage) 
               throws MessagingException {
    MimeMessageHelper helper=null;
    // use the true flag to indicate a multipart message
    helper = new MimeMessageHelper(mimeMessage, false);
    helper.setTo(mailTo);
    helper.setFrom(from);
    helper.setSubject(subject);
    helper.setText(bodyMail, true);
    }
    };
   this.mailSender.send(preparator);
}
@Resource(name=&amp;quot;mailSender&amp;quot;)
  public void setMailSender(JavaMailSender mailSender) {
    this.mailSender = mailSender;
  }
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Acte 7&lt;/strong&gt;: Un test unitaire avec Junit: Ajouter dans eclipse une classe Junit test case nommée &quot;TestSenderMail&quot;
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt; [code java]

package fr.netapsys.blog.tests;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import fr.netapsys.blog.simulatemail.MailSenderSpring;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (locations = {&amp;quot;classpath*:spring-mail.xml&amp;quot; }) 
public class TestSenderMail {
 @Resource
 protected  MailSenderSpring mailSenderSpring;
	
 @Test public void testSendMail() {
  mailSenderSpring.send( &amp;quot;toto@g.fr&amp;quot;,&amp;quot;from@m.fr&amp;quot;,&amp;quot;sujet tst mail&amp;quot;,&amp;quot; body ....&amp;quot;);
	//no Assert !
 }
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Dans eclipse, clique droit sur la classe Junit puis run as Junit Test. &lt;br /&gt;&lt;/p&gt;


&lt;p&gt;On obtient sur la console Dos laissé ouverte quelques messages utiles sur l'ouverture d'une session smtp.
Et dans le répertoire SMTP_REP, des fichiers logs et un .mht qui récapitulent les éléments liés à l'envoi de mail.
Je vous laissent les découvrir.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;:&lt;/p&gt;


&lt;p&gt;C'est simple!.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;En résumé, lancer smtp.jar et configurer votre mailSession ou les propriétés de votre serveur mail pointant vers localhost et le tour est joué.&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;


&lt;p&gt;Billet inspiré de la lecture de &lt;a href=&quot;http://www.tririga.info/2008/02/simulated-smtp.html&quot;&gt;tririga&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2011/06/20/En-java%2C-comment-tester-en-simulant-l-envoi-%28en-masse%29-de-mail#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2011/06/20/En-java%2C-comment-tester-en-simulant-l-envoi-%28en-masse%29-de-mail#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/272</wfw:commentRss>
      </item>
    
  <item>
    <title>Langage Scala [1ère partie]</title>
    <link>http://blog.netapsys.fr/index.php/post/2011/06/14/Langage-Scala-%5B1%C3%A8re-partie%5D</link>
    <guid isPermaLink="false">urn:md5:93ed17a2137ab2be025c33b03b6c012a</guid>
    <pubDate>Thu, 16 Jun 2011 18:02:00 +0200</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Scala</category>
            
    <description>&lt;p&gt;En quelques démos, nous allons illustrer l’intérêt (et la puissance) du langage Scala. Ces démonstrations sont réalisées sous Windows avec Eclipse Helios  et le plugin scala.
Vous dites encore un nouveau langage à apprendre! Rassurez-vous, j’ai eu la même réaction que vous.
Sachez que le site social Twitter utilise Scala (en abandonnant Ruby).
Il faut préciser que Scala est un langage &lt;strong&gt;pur&lt;/strong&gt; objet et en plus:&lt;/p&gt;

&lt;pre&gt; * scala compilé produit du « bytecode » exécutable dans la JVM,
 * la syntaxe de Scala est proche de Java,
 * l’API java est supporté dans Scala,&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Sachez qu'aucun prérequis n'est nécessaire (peut être faire l'exemple HelloWorld &lt;a href=&quot;http://www.scala-lang.org/docu/files/ScalaTutorial.pdf&quot;&gt;ici&lt;/a&gt;).
&lt;br /&gt;
Le plan du billet est le suivant&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une introduction pour tenter d’expliquer l’utilité de Scala,&lt;/li&gt;
&lt;li&gt;un premier exemple pour illustrer l’intérêt de Scala,&lt;/li&gt;
&lt;li&gt;plusieurs démo sur les concepts de Scala.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Les démos sont réalisées sous Eclipse Helios avec installation du plugin scala (url update: &lt;a href=&quot;http://download.scala-ide.org/releases/2.0.0-beta&quot;&gt;http://download.scala-ide.org/releases/2.0.0-beta&lt;/a&gt;).
Sinon, on peut directement tester les morceaux de code scala sur le site &lt;a href=&quot;http://www.simplyscala.com/&quot;&gt;http://www.simplyscala.com/&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Pour la suite, nous donnons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un premier exemple, autre que le fameux HelloWorld qui, dans ce contexte n'apporte pas grand chose,&lt;/li&gt;
&lt;li&gt;plusieurs démo sur les concepts de Scala.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Scala n’est pas un concurrent (direct) à Java. Scala concilie la programmation fonctionnelle et celle orientée objet (OOP).&lt;/p&gt;


&lt;p&gt;L’orientée objet introduit, à juste titre, une couche d’abstraction utilisant à bon escient, j’ose espérer, les concepts de «&amp;nbsp;design pattern&amp;nbsp;»
afin de construire une solution maintenable et robuste.&lt;br /&gt;
Sauf que les contraintes des langages orientées objet font que des kilomètres de code utile (appelés aussi de la plomberie ) sont écrits
pour réaliser cette solution technique. &lt;br /&gt;
Scala concilie les deux approches en permettant, par exemple, de passer une nouvelle fonction en argument aux méthodes existantes.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Passons à la pratique..... c'est toujours mieux que les discours!
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;ins&gt;&lt;strong&gt;DEMO 1&lt;/strong&gt;&lt;/ins&gt;:
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Après l’installation du plugin dans Eclipse, cliquer open  new scala project ==&amp;gt; saisir le nom du projet «&amp;nbsp;firstscalaproj» par exemple.
Vérifier que le JDK est de version 1.5 ou + puis ==&amp;gt; «&amp;nbsp;next&amp;nbsp;»  ==&amp;gt; «&amp;nbsp;finish&amp;nbsp;»
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le projet créé avec les librairies de scala dans le «&amp;nbsp;classpath» et un répertoire «&amp;nbsp;src&amp;nbsp;» vide pour l’instant.
Clic droit sur «&amp;nbsp;src&amp;nbsp;» ==&amp;gt; new package nommé «&amp;nbsp;fr.netapsys.blog.exemple1 ».
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Clic droit sur «&amp;nbsp;src&amp;nbsp;» ==&amp;gt; new «&amp;nbsp;Scala Object&amp;nbsp;» puis saisir le nom de  la classe «&amp;nbsp;FirstExemple&amp;nbsp;» et saisir le nom du package ==&amp;gt; finish.
Une classe, par défaut publique, est créée dans le package avec, pour l'instant peu de lignes&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt; /*scala*/
package fr.netapsys.blog.exemple1

object FirstExemple {
}
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Nous la complétons pour ajouter l’équivalent de la méthode main de java comme suit&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt; **scala**  FirstExemple.scala
1 package fr.netapsys.blog.exemple1
2 import System.out.println
 3 object FirstExemple {

 4   def main(args: Array[String]): Unit = {
	//function
 5	def afficheListe(liste: List[Int],msg:String) {
 6	  println(&amp;quot;Affichage &amp;quot;+msg+&amp;quot; : &amp;quot;+liste)
	}
 7	val entiers = List(-1, 1, 2, 3, 4, 5, 6)
 8	afficheListe(entiers,&amp;quot;de la liste&amp;quot;)

	/* filtre fonctionnel */
 9	val positifs = entiers.filter(_ &amp;gt; 0)
10	afficheListe(positifs,&amp;quot;des entiers positifs &amp;quot;)
	/* other filter fonctionnel */
11	val grands = entiers.filter(2&amp;lt;)  //_ &amp;gt; 2)
12	afficheListe(grands,&amp;quot;des entiers plus grands que 2 &amp;quot;)

	////un peu de fonctionnel ...interessant
13	val intermeds = positifs.filter(x =&amp;gt; x &amp;gt; 1 &amp;amp;&amp;amp; x &amp;lt; 6)
14	afficheListe(intermeds, &amp;quot;des entiers entre 2 et 5 &amp;quot;)

15	val exist=intermeds.exists(_==8)
16	if(exist) println(&amp;quot;existe!&amp;quot;)
17	else println (&amp;quot;n'existe pas!&amp;quot;)
	//Enfin, une seconde façon d’afficher la liste
18	intermeds.foreach(println)		
19  }
20 }
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ecoutez, je sais bien ce que vous dites! On n’est loin de java et puis c’est assez … PERListe / Rubyiste. &lt;br /&gt;
Rassurez vous, nous décortiquons tout ce code pas à pas plus loin.
&lt;br /&gt;
Mais avant, exécutons cette classe dans Eclipse par un clic droit sur «&amp;nbsp;FirstExemple.scala&amp;nbsp;» ==&amp;gt; Run as ==&amp;gt; Scala Application.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le résultat de l'exécution est donné ci-dessous&amp;nbsp;:
&lt;img src=&quot;http://blog.netapsys.fr/public/images/scala/capture_billet_scala_blog.png&quot; alt=&quot;resultat_exec_ex1&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Expliquons un peu&amp;nbsp;:
Dans Scala  et contrairement à java, une classe est par défaut publique. Un même fichier d'extension .scala peut contenir plusieurs classes.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Déclaration de classe (objet)&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;-	Toute classe est publique donc pas de modificateur de visibilité
-	Elle peut être abstraite comme en java. Scala va plus loin que java puisque même ses attributs peuvent être abstraits.
-	On distingue une classe particulière nommé «&amp;nbsp;object&amp;nbsp;» utilisée dans ce démo. Elle reproduit le contexte statique de java. En scala l’objet est une instance singleton et donc ne nécessite pas d’être instanciée. Enfin, signalons qu’à la différence de java, le contexte statique n’existe pas.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Déclaration d’attributs&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;La syntaxe de déclaration d’un attribut est comme suit&amp;nbsp;:
&lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/14/[indicateur de visibilité&quot; title=&quot;[indicateur de visibilité&quot;&gt;[indicateur de visibilité&lt;/a&gt;] (val&lt;strong&gt;|&lt;/strong&gt;var) nom_attribut &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/14/[:Type&quot; title=&quot;[:Type&quot;&gt;[:Type&lt;/a&gt;&lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/14/=Valeur&quot; title=&quot;=Valeur&quot;&gt;=Valeur&lt;/a&gt;]&lt;/p&gt;


&lt;p&gt;Tout ce qui est entre crochets &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/14/[&quot; title=&quot;[&quot;&gt;[&lt;/a&gt;] est optionnel.&lt;/p&gt;


&lt;p&gt;L’indicateur de visibilité est optionnel peut prendre la valeur «&amp;nbsp;private ou protected ». Quand rien n’est mentionné il est par défaut publique et donc accessible à l’extérieur de la classe.
Le symbole (var|val) indique qu’il peut être soit un attribut muable soit un immuable. Le choix est ici exclusif.
Notez que «val» est l’équivalent de «&amp;nbsp;final&amp;nbsp;» en java.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;L’option &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2011/06/14/[:Type&quot; title=&quot;[:Type&quot;&gt;[:Type&lt;/a&gt;] permet de préciser le type de l’attribut &lt;strong&gt;Int&lt;/strong&gt;, &lt;strong&gt;String&lt;/strong&gt;, &lt;strong&gt;Number&lt;/strong&gt;, ..etc
Le système d’inférence de scala détermine le type d’un attribut au moment de l’affectation.
Par exemple,&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt; 
private val nb:Int=9

var str:String

private var k:Int=_

val pStr=&amp;quot;&amp;quot;

var abstrAttribut:Int

&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Donc, le champ &lt;em&gt;nb&lt;/em&gt; est un objet &lt;em&gt;&lt;strong&gt;Int&lt;/strong&gt;&lt;/em&gt; initialisé à 9.  &lt;br /&gt;
k est un &lt;strong&gt;Int&lt;/strong&gt; initialisé avec la valeur par défaut (0 pour Int). Scala infère à pStr son type, ici &lt;strong&gt;String&lt;/strong&gt;, à partir de la valeur d'init.
&lt;br /&gt;
Enfin, le champ &lt;strong&gt;&lt;em&gt;Int&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;abstrAttribut&lt;/em&gt; est abstrait puisqu'il n'est pas initialisé.
&lt;br /&gt;
Attention, si un champ n’est pas initialisé alors il est considéré comme abstrait. Scala étend le domaine «&amp;nbsp;abstrait&amp;nbsp;» et va plus loin que java.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Déclaration des constructeurs&lt;/strong&gt;
&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;Parlons des constructeurs de classes de scala qui sont &lt;strong&gt;légèrement&lt;/strong&gt; (j’ai bien dit légèrement) différents de java mais pas de quoi nous décourager!&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le constructeur principal (et non le constructeur par défaut) se déclare en une seule ligne comme dans cet exemple&amp;nbsp;:
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;
class Entreprise(var raisonSociale :String,var id :Int)
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Et c’est tout! Oui on a défini deux attributs de la classe et le constructeur qui prend en paramètres ces deux attributs. C'est concis.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Voilà,  on peut instancier la classe comme suit :&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;
Entrep :Entreprise=new Entreprise(“Pharamcie toto”,1)
&lt;/pre&gt;



&lt;p&gt;Je crois que nous avons les éléments utiles pour détailler notre démo1.&lt;/p&gt;


&lt;pre&gt;&lt;strong&gt;object&lt;/strong&gt; de notre démo1 n'a pas besoin de constructeur (c'est une instance reproduisant le contexte statique connu dans java).&lt;/pre&gt;


&lt;p&gt;La fonction/méthode &lt;strong&gt;def main&lt;/strong&gt; est le point d'entrée (Ligne numérotée 4) et elle indique qu'elle prend en argument un tableau de String identique à java.
Elle retourne un type &lt;strong&gt;Unit&lt;/strong&gt; et avec le signe &quot;&lt;strong&gt;=&lt;/strong&gt;&quot; elle précise ce qu'elle doit retourner. Le type scala.Unit  est l'équivalent de void en java.
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ligne 5, juste après avoir défini la fonction &lt;strong&gt;def afficheListe&lt;/strong&gt; qui elle prend comme arguments une &lt;strong&gt;List&lt;/strong&gt; et un &lt;strong&gt;String&lt;/strong&gt;. Rien de nouveau sous le ciel scala! Oui, pour l'instant!
Ligne 7, on déclare un attribut  List initialisée. L'inférence de scala détermine le type c'est à dire une liste Int. Ligne 8 affiche cette liste.&lt;/p&gt;


&lt;p&gt;A Ligne 9 arrive aux &quot;trucs&quot; intéressants: On passe à la fonction filter de List une nouvelle fonction qui est&amp;nbsp;: &quot;_ &amp;gt; 0&quot;
&lt;br /&gt;
Ainsi, comme résultat du filtre on obtient les entiers positifs. Cette forme abrégée aurait pu être écrite sous la forme explicite: &quot;x=&amp;gt;x&amp;gt;0&quot;
&lt;br /&gt;
Si vous êtes encore là, c'est que vous commencer à adopter scala.&lt;br /&gt;
Poursuivons, à la ligne 13 une autre fonction sous une forme plus  élaborée &lt;br /&gt;
&lt;em&gt;x=&amp;gt; x&amp;gt;2 &amp;amp;&amp;amp; x=&amp;gt;x&amp;lt;6&lt;/em&gt;
&lt;br /&gt;
qui permet de ne retenir que les entiers qui sont conformes aux deux conditions.
On obtient donc que les entiers compris (strictement) entre 2 et 6 comme la capture ci-dessus le confirme.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
A la ligne 18, encore une autre façon de passer une fonction (ici System.out.println importée en haut) à la méhode foreach de List.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;On peut aussi, passer le Logger de log4j ou toute autre méthode de trace comme suit&amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;
val logger:Logger= Logger.getLogger(this.getClass().getName())

interms.foreach(logger.trace)

&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Ajouter log4j.jar au classpath du projet et, dans le code, la ligne&lt;/p&gt;
&lt;pre&gt;
import org.apache.log4j.Logger.
&lt;/pre&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Vous avez un aperçu de la richesse et la puissance de scala avec ces premiers exemples où l'emploi des filtres de scala. Ces filtres peuvent être adaptés et enrichis de manière simple.&lt;br /&gt;
&lt;br /&gt;
En java c'était aussi possible (avec les classes anonymes bien qu'il y a des contraintes à respecter mais trop limité pour la récupération du binding contexte ). Mais, en java, le prix à payer est fort!
Peut-être que les closures dans les futures versions java (closures abandonnés dans java 7?) .&lt;/p&gt;


&lt;p&gt;Dans les prochains billets nous détaillerons, entre autres, le code ci-après permettant de lire un fichier&amp;nbsp;:
&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
        var contenu=&amp;quot;&amp;quot;
	val nomFichier=&amp;quot;test.txt&amp;quot;
	try{
	 contenu = fromFile(nomFichier).mkString
	}catch{
	   case e:FileNotFoundException =&amp;gt; e.getMessage()
	   logger.error(&amp;quot;Fichier &amp;quot;+nomFichier)
	   System.exit(1)
	}	
        logger.info(&amp;quot;contenu du fichier :
&amp;quot;+contenu)		
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
NOTE: En fait, une ligne suffit car le catch de l'exception est optionnel. En réalité, dans scala, Il n'y a pas de checked exception. &lt;br /&gt;
Pensez à l'import  scala.io.Source.fromFile et java.io.FileNotFoundException.&lt;br /&gt;
Là il faut que je m'arrête! On reparlera de tout cela prochainement.
&lt;br /&gt;&lt;/p&gt;



&lt;p&gt;En attendant, enjoy!
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;ins&gt;NOTE&lt;/ins&gt;: A la fin de la rédaction de cette première partie, j'ai découvert ce très bon article, en français, &lt;a href=&quot;http://www.siteduzero.com/tutoriel-3-320936-pourquoi-scala.html&quot;&gt;site&lt;/a&gt; que je conseille sa lecture.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2011/06/14/Langage-Scala-%5B1%C3%A8re-partie%5D#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2011/06/14/Langage-Scala-%5B1%C3%A8re-partie%5D#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/269</wfw:commentRss>
      </item>
    
  <item>
    <title>AGILE &amp; MORE EFFICIENT : Test JUnit, EasyMock &amp; Spring</title>
    <link>http://blog.netapsys.fr/index.php/post/2010/03/24/AGILE-MORE-EFFICIENT-%3A-Test-JUnit-EasyMock-Spring</link>
    <guid isPermaLink="false">urn:md5:fbcb266a97c46e14b20f3732c46919f2</guid>
    <pubDate>Wed, 24 Mar 2010 08:11:00 +0100</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
        <category>agile</category><category>easymock</category><category>efficient</category><category>junit</category><category>mockito</category><category>test</category><category>tests unitaires</category><category>unitaire</category>    
    <description>&lt;p&gt;Ce billet aborde l'aspect purement technique de mise en oeuvre de l'agilité dans le développement d'applications robustes.&lt;br /&gt;
Il s'inscrit dans la continuité du séminaire de Netapsys sur le thème &quot;Agile &amp;amp; more efficient&quot;.&lt;br /&gt;
Il présente les tests JUnit 4.x et EasyMock sous Spring afin de concrétiser &quot;être agile&quot;.&lt;br /&gt;
EasyMock permet de simuler l'accès aux fonctionnalités des couches applicatives, par exemple la couche DAO.&lt;br /&gt;
Un des piliers de l'agilité est TDD (Test Driven Development).&lt;br /&gt;
Le TDD est une approche évolutive de réalisation de projets basés sur les tests avant même de produire du code effectif.&lt;br /&gt;
TDD combine le TFD (Test First development) et le refactoring afin d'arriver à affiner / définir les spécifications. &lt;br /&gt;
Easymock et JUnit constituent donc les briques afin de réaliser le TDD via les tests unitaires et d'intégration.&lt;br /&gt;
En fait, les tests unitaires sont faciles à mettre en place mais les tests d'intégration restent encore difficiles.&lt;br /&gt;
Et le coût de réaliser les tests d'intégration est pesant.&lt;br /&gt;
Et EasyMock permet la mise en place des tests sans pour autant avoir développé une ligne de code d'implémentation des couches applicatives.
Tous ces aspects vont être explicités ci-dessous.&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;
Nous démarrons avec un projet exemple simple qui permet de comprendre les notions importantes dans EasyMock.
&lt;br /&gt;
1- &lt;ins&gt;Le projet exemple&lt;/ins&gt;:
&lt;br /&gt;
&lt;br /&gt;
Comme notre objectif est de faire du TDD, nous allons écrire uniquement les interfaces puis enchaîner avec les tests sur des classes simulées (moquées) par EasyMock.
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/***interface couche dao**/&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; IContactDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  	&lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; save&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Contact contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Et celle de service:
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/***interface couche service*****/&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; IService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  	&lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; save&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Contact contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; setContactDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;IDao dao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Et l'entité Contact est un POJO simple:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;easymock&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;entites&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import java.io.Serializable;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import fr.netapsys.easymock.common.BaseObject;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Contact &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;Serializable&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;long&lt;/span&gt; serialVersionUID = -1511337412528984583L&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;int&lt;/span&gt; id&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;String&lt;/span&gt; nom&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;String&lt;/span&gt; prenom&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;String&lt;/span&gt; mail&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; Contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;super&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;	
&amp;nbsp;
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//Setters/getters omis		&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Donc nous avons en place les briques techniques qui vont servir à pratiquer le TDD et favoriser les échanges avec le client.&lt;br /&gt;
Écrivons les tests avant de commencer les développement pur et dur des couches dao, service et web(back &amp;amp; front).
&lt;br /&gt;
La classe de test est simple néanmoins consistante afin d'illustrer réellement l'apport des test mock.&lt;br /&gt;
&lt;br /&gt;
2- &lt;ins&gt;Classe JUnit4 test &lt;/ins&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;easymock&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;tests&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.apache.log4j.Logger;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.junit.Assert;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.junit.Before;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.junit.Test;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.junit.runner.RunWith;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.springframework.test.context.ContextConfiguration;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import fr.netapsys.easymock.entites.Contact;&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import fr.netapsys.easymock.interfaces.*;&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//**** notez cet import *****&lt;/span&gt;
&lt;span style=&quot;color: #a1a100;&quot;&gt;import static org.easymock.EasyMock.*;&lt;/span&gt;
&amp;nbsp;
@RunWith &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;SpringJUnit4ClassRunner.&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
@ContextConfiguration &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;locations = &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;classpath:spring.xml&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; 
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; TestEasyMock &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;final&lt;/span&gt; Logger logger=Logger.&lt;span style=&quot;color: #006600;&quot;&gt;getLogger&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;getClass&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; IContactDao contactDao&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; IContactService contactService&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	@Before &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; setUp&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		contactDao=createMock&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;IContactDao.&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		contactService= createMock&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;IContactService.&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
	@SuppressWarnings&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;nls&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
	@Test &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; testSave&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
			Contact contact=&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//************** createMock, expect, replay, call &amp;amp; verify		&lt;/span&gt;
			expect&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contactDao.&lt;span style=&quot;color: #006600;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;andReturn&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;saveContactInDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;			
			replay&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contactDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			contactDao.&lt;span style=&quot;color: #006600;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			verify&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contactDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;			
			&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//appel au service&lt;/span&gt;
			expect&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contactService.&lt;span style=&quot;color: #006600;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;andReturn&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;saveContactInService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			replay&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contactService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			Contact c=contactService.&lt;span style=&quot;color: #006600;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			logger.&lt;span style=&quot;color: #006600;&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;Contact retrieved by service :&amp;quot;&lt;/span&gt;+contact.&lt;span style=&quot;color: #006600;&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			verify&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contactService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
			&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;Assert&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;assertTrue&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;  c.&lt;span style=&quot;color: #006600;&quot;&gt;getNom&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;equals&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;contact.&lt;span style=&quot;color: #006600;&quot;&gt;getNom&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; c.&lt;span style=&quot;color: #006600;&quot;&gt;getId&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;==&lt;span style=&quot;color: #cc66cc;&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; c.&lt;span style=&quot;color: #006600;&quot;&gt;getMail&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;equals&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;mail@mail.fr&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
	@SuppressWarnings&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;nls&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; Contact saveContactInDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Contact contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		Contact contact2Return=contact&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		contact.&lt;span style=&quot;color: #006600;&quot;&gt;setNom&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Easymock&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		contact.&lt;span style=&quot;color: #006600;&quot;&gt;setPrenom&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//setter id &lt;/span&gt;
		contact2Return.&lt;span style=&quot;color: #006600;&quot;&gt;setId&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; contact2Return&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;	
	@SuppressWarnings&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;nls&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; Contact saveContactInService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Contact contact&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		Contact contact2Return=contact&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//contactDao.save(contact);&lt;/span&gt;
		contact2Return.&lt;span style=&quot;color: #006600;&quot;&gt;setMail&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;mail@mail.fr&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;		
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; contact2Return&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
NB. Le fichier spring.xml est pour l'instant vide. Il ne contient que les déclarations des namespaces.&lt;br /&gt;
La seconde partie de ce billet revient sur ce fichier de configuration pour aller plus loin dans l'utilisation de l'api easymock combiné avec spring.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;3- &lt;ins&gt;Exécutions des tests&lt;/ins&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
La première capture illustre que le test JUnit répond bien:
&lt;br /&gt;
&lt;img src=&quot;http://blog.netapsys.fr/public/easymock/easymock_test.JPG&quot; alt=&quot;captureJunit0&quot; /&gt;
&lt;br /&gt;
Avec une sortie sur la console qui ressemble à:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;TestEasyMock.java&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;Contact retrieved by service :&lt;span style=&quot;color: #b100b1; font-weight: bold;&quot;&gt;fr.netapsys.easymock.entites.Contact@17050f5&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;/span&gt;
  id=&lt;span style=&quot;color: #cc66cc;&quot;&gt;1&lt;/span&gt;
  nom=Easymock
  prenom=test
  mail=mail@mail.fr
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Easymock est utilisé par spring et le projet apache strutstestcase. Néanmoins, à mon avis, il est plus ou moins intuitif à pratiquer.&lt;br /&gt;
Son concurrent MOCKITO séduit par la simplicité d'emploi.&lt;br /&gt;
EasyMock se comporte comme un &quot;recorder&quot; et par conséquent nécessite généralement les étapes suivantes:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;createMock,  ( &lt;em&gt;C'est ce que a été fait dans la méthode annotée par @Before&lt;/em&gt; )&lt;br /&gt;
expect,        (&lt;em&gt;C'est ce qui a été fait dans le corps de la méthode testSave&lt;/em&gt;) &lt;br /&gt;
replay,     (&lt;em&gt;idem&lt;/em&gt;)&lt;br /&gt;
call,          (&lt;em&gt;idem&lt;/em&gt;)&lt;br /&gt;
verify.      (&lt;em&gt;idem. A noter que cet appel peut générer une exception incompréhensible si l'ordre des étapes n'est pas respecté&lt;/em&gt;)&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
La prochaine fois, nous introduirons l'auto-injection Spring des beans de la couche service en simulant (en moquant) uniquement la couche DAO.&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2010/03/24/AGILE-MORE-EFFICIENT-%3A-Test-JUnit-EasyMock-Spring#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2010/03/24/AGILE-MORE-EFFICIENT-%3A-Test-JUnit-EasyMock-Spring#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/140</wfw:commentRss>
      </item>
    
  <item>
    <title>Spring annotations vs standards annotations: Que choisir entre @Autowired et @Resource?</title>
    <link>http://blog.netapsys.fr/index.php/post/2010/03/05/Spring-annotations-vs-standards-annotations%3A-Que-choisir-entre-Autowired-et-Resource</link>
    <guid isPermaLink="false">urn:md5:dcc690928f9aabe1260c165b35520ddf</guid>
    <pubDate>Sun, 07 Mar 2010 19:32:00 +0100</pubDate>
    <dc:creator>Abderrazek CHINE</dc:creator>
        <category>Java J2EE</category>
        <category>@Autowired</category><category>@Repository</category><category>@Resource</category><category>@Service</category><category>Annotation</category><category>Autowire</category><category>BeanCreationException</category><category>Junit</category><category>NoSuchBeanDefinitionException</category><category>Spring</category><category>Test</category>    
    <description>&lt;p&gt;&lt;br /&gt;
L'objet de ce billet, en deux parties, est de comparer l'annotation standard @Resource du package &lt;em&gt;javax.annotation.Resource&lt;/em&gt; à celle de &lt;br /&gt;
spring @Autowired du package org.springframework.beans.factory.annotation.&lt;br /&gt;
Nous verrons les situations où nous sommes obligés de favoriser les annotations standards.&lt;br /&gt;
&lt;br /&gt;
L'utilisation des annotations réduit considérablement la verbosité des fichiers de configuration de Spring.&lt;br /&gt;
C'est aussi le même constat pour d'autres frameworks.&lt;br /&gt;
En effet, le principe &quot;convention Over configuration&quot; participe à cette diffusion.&lt;br /&gt;
Certes, les &quot;pour&quot; et les &quot;contre&quot; ne manqueront pas d'arguments pour débattre.&lt;br /&gt;Mais ceci n'est pas l'objet de ce billet.&lt;br /&gt;
L'objectif ici est de comparer ces deux types d'annotations.&lt;br /&gt;
Pour cela, nous nous appuyons sur un projet java simple, sans maven, que vous pouvez créer sous Eclipse en suivant les étapes décrites ci-après.&lt;br /&gt;
Nous écrivons d'abord un projet avec les annotations de Spring puis nous illustrons les difficultés qui nous amèneront à introduire les annotations standards.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ins&gt;&lt;strong&gt;PREMIERE PARTIE&lt;/strong&gt;&lt;/ins&gt;: Annotations Spring @Autowired, @Service &amp;amp; cie
&lt;br /&gt;
Dans cette première partie, le projet java exemple ci-après n'utilise que les annotations de Spring.&lt;br /&gt;
&lt;br /&gt;
&lt;ins&gt;Pré-requis&lt;/ins&gt;:
&lt;br /&gt;
Le projet java standard doit avoir les librairies nécessaires suivantes&amp;nbsp;: spring-2.5.6.jar, spring-test-2.5.6.jar et Junit 4.4.jar ( apache-commons-**.jar). &lt;br /&gt;
Notez qu'il faudrait observer ces versions pour contourner un bug connu. Aussi, ne laissez pas eclipse choisir pour vous la librairie JUnit4 à ajouter dans le classpath du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Configuration de Spring&lt;/strong&gt;
&lt;br /&gt;
Un fichier de Spring très léger nommé &quot;&lt;em&gt;spring-context.xml&lt;/em&gt;&quot; qui contient ces deux lignes:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;version&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;encoding&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;beans&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;xmlns&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;xmlns:xsi&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;
 &lt;span style=&quot;color: #000066;&quot;&gt;xmlns:p&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;xmlns:context&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;/span&gt;
 &lt;span style=&quot;color: #000066;&quot;&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&amp;quot;&lt;/span&gt; 
 &lt;span style=&quot;color: #000066;&quot;&gt;default-autowire&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;byName&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;context:component-scan&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;base-package&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;fr.netapsys.exemple.dao&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;	
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;context:component-scan&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;base-package&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;fr.netapsys.exemple.service&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;	
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;lt;/beans&lt;span style=&quot;font-weight: bold; color: black;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Les classes java du projet sont ordinaires bien que les différentes couches sont bien séparées.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Couche entités&lt;/strong&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//la classe Entreprise &lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;exemple&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;entites&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Entreprise &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;implements&lt;/span&gt; &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;Serializable&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	 &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;int&lt;/span&gt; id&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	 &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; etat&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	 &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; setEtat&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; etat&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;etat&lt;/span&gt;=etat&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;		
	 &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; 
	 &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; isEtat&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; etat&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//autres setters/getters ......omis&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;String&lt;/span&gt; toString&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Entreprise (id=&amp;quot;&lt;/span&gt;+id+&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot; etat=&amp;quot;&lt;/span&gt;+etat+&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Couche DAO&lt;/strong&gt;
&lt;br /&gt;
L'interface:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;exemple&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;dao&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;interface&lt;/span&gt; IEntrepriseDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; createEntreprise&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Entreprise e&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Notez l'annotation @Repository pour indiquer à Spring que cette classe appartient à la couche DAO.&lt;br /&gt;
&lt;br /&gt;
Et l'implémentation donne:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;exemple&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;dao&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
@&lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;Repository&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;entrepriseDao&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; EntrepriseDao &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;implements&lt;/span&gt; IEntrepriseDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
	 &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; createEntreprise&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Entreprise entrep&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	 &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//do something...&lt;/span&gt;
            &lt;span style=&quot;color: #aaaadd; font-weight: bold;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;creating in dao &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
             &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	 &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Couche service&lt;/strong&gt;
&lt;br /&gt;
L'interface:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;exemple&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;interface&lt;/span&gt; IEntrepriseService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; createEntrerpise&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Entrerpise entrep&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
L'implémentation:
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;exemple&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
@Service&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;entrepriseService&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; EntrepriseService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; IEntrepriseDao entrepriseDao&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	@Autowired
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; setEntrepriseDao&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
	 &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; createEntreprise&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Entreprise entrep&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
	  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; entrepriseDao.&lt;span style=&quot;color: #006600;&quot;&gt;createEntreprise&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;entreprise&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	 &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Notez l'annotation @Autowired sur le setter de l'attribut entrepriseDao.&lt;br /&gt;
&lt;br /&gt;
Ajoutons une classe de JUnit 4.4 nommée TestAnnotations.java qui contient ceci:&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;package&lt;/span&gt; fr.&lt;span style=&quot;color: #006600;&quot;&gt;netapsys&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;exemple&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;tests&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/*****imports omis*****/&lt;/span&gt;
@RunWith&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;SpringJUnit4ClassRunner.&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
@ContextConfiguration&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;locations = &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;classpath:spring-context.xml&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; 
&amp;nbsp;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; TestAnnotationsSpring &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; IEntrepriseService service&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	@Autowired
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; setEntrepriseService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;IEntrepriseService entrep&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;service&lt;/span&gt;=entrep&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
	@Test &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; test1&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
		Entreprise entrep=&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Entreprise&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		entrep.&lt;span style=&quot;color: #006600;&quot;&gt;setId&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #993333;&quot;&gt;boolean&lt;/span&gt; retour=service.&lt;span style=&quot;color: #006600;&quot;&gt;createEntreprise&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;entrep&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;Assert&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;assertTrue&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;retour&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; 
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;
Observez l'annotation @RunWith de JUnit4 et celle de @ContextConfiguration de Spring.&lt;br /&gt;
Elles permettent d'exécuter ce test JUnit en laissant à Spring le soin de charger son contexte à partir des fichiers mentionnés dans &lt;em&gt;locations&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
L'exécution de ce test dans eclipse, clic-droit, run as Junit Test, donne le résultat :&lt;br /&gt;
&lt;img src=&quot;http://blog.netapsys.fr/public/annotations/capture1_JUnit.JPG&quot; alt=&quot;junit_1&quot; /&gt;
&lt;br /&gt;
OK, tout cela fonctionne bien.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Mais&lt;/strong&gt; si on rajoute une nouvelle classe de service, nommée EntrepriseServiceImpl2 dans la trace ci-dessous, qui implémente l'interface IEntrepriseService, notre test JUnit cesse de fonctionner!!!!&lt;br /&gt;
Et on obtient une  &quot;BeanCreationException&quot; dont la trace est donnée ci-dessous:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Autowiring of methods failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire method:
public void fr.netapsys.exemples.tests.TestAnnotationsSpring.setEntrepriseService(fr.netapsys.exemple.service.IEntrepriseService); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type&lt;/p&gt;

&lt;pre&gt;  fr.netapsys.exemple.service.IEntrepriseService  is defined: expected single matching bean but found 2:
 entrepriseService, entrepriseServiceImpl2&lt;/pre&gt;

&lt;p&gt;at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues
............
.........
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type &lt;a href=&quot;http://blog.netapsys.fr/index.php/post/2010/03/05/fr.netapsys.exemple.service.IEntrepriseService&quot; title=&quot;fr.netapsys.exemple.service.IEntrepriseService&quot;&gt;fr.netapsys.exemple.service.IEntrep...&lt;/a&gt; is defined:&lt;/p&gt;

&lt;pre&gt;   expected single matching bean but found 2: entrepriseService, entrepriseServiceImpl2&lt;/pre&gt;

&lt;p&gt;''
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pourquoi donc? Et comment contourner cela?
&lt;br /&gt;
La seconde partie de ce billet donne avec détails la réponse à ces deux questions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.netapsys.fr/index.php/post/2010/03/05/Spring-annotations-vs-standards-annotations%3A-Que-choisir-entre-Autowired-et-Resource#comment-form</comments>
      <wfw:comment>http://blog.netapsys.fr/index.php/post/2010/03/05/Spring-annotations-vs-standards-annotations%3A-Que-choisir-entre-Autowired-et-Resource#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.netapsys.fr/index.php/feed/atom/comments/135</wfw:commentRss>
      </item>
    
</channel>
</rss>
