Auteur

Ludovic Chaboud-Paupi

Fil des billets

Par Ludovic Chaboud-Paupi, le 20 mai 2013

TDD : Test Driven Development 2/2 - Mise en pratique

Dans le post précédent TDD : Test Driven Development 1/2 - Principes, nous avons vu les principes théoriques du Test Driven Development.

Nous allons maintenant mettre en pratique le cycle de développement du TDD.

Pour rappel, les étapes du cycle du TDD sont :

  • Définir la fonctionnalité à l'aide du test => Le test est en échec
  • Implémenter => Le test est en succès, la couverture est à 100%
  • Réécrire / Simplifier => Le test est en succès, la couverture est à 100%

Cycle du TDD

Nous allons voir dans ce post une mise en pratique du TDD avec comme exemple le workflow d'un article d'un blog.

 
Lire la suite
Par Ludovic Chaboud-Paupi, le 30 avril 2013

TDD : Test Driven Development - Partie 1 - Principes

Le développement piloté par les tests ou TDD "Test Driven Development" nous impose de commencer par écrire les tests unitaires avant le code de la vraie classe d'implémentation.

Ce fonctionnement apporte de nombreux avantages, mais est difficile à appréhender car il change notre logique d'écriture du code.

Nous avons à écrire le contrat que doit réaliser la méthode testée AVANT d'écrire cette méthode. Ce contrat est écrit dans le test unitaire et impose le comportement d'une méthode en fonction de données de départ.

Ce post a pour objectif de vous présenter les principes du TDD ainsi que le cycle de développement en mode TDD. Un second post vous présentera une démonstration du TDD.

 
Lire la suite
Par Ludovic Chaboud-Paupi, le 30 novembre 2012
Catégorie : Java J2EE

Trier efficacement les objets en Java - 2ème partie : Guava

Le tri d'objets en Java s'effectue à l'aide de méthodes et de classes de comparaisons.

Cependant, l'écriture de ces méthodes peut vite devenir fastidieuse et être source d'erreurs lorsque les objets à comparer ont beaucoup de propriétés à tester.

Voyons comment la bibliothèque Guava de Google peut nous aider à simplifier l'écriture de ces méthodes.

Guava : Ordering et ComparisonChain

Nous verrons ainsi l'utilisation des classes Ordering et ComparisonChain de Guava.

 
Lire la suite
Par Ludovic Chaboud-Paupi, le 30 octobre 2012
Catégorie : Java J2EE

Trier efficacement les objets en Java - 1ère partie

Le tri d'objets en Java est facilité par l'utilisation de méthodes de comparaison.

Nous allons voir dans cette première partie quel est le contrat de ces méthodes, comment les écrire et comment s'effectue le tri d'objets en Java à l'aide de ces méthodes.

Nous verrons ainsi l'utilité de l'interface Comparable et de la classe Comparator.

Comparaison d'objets

Les méthodes de comparaison permettent de trier une liste d'objets. Pour cela, ces méthodes consistent, pour deux instances d'un même objet, à comparer chacune de leurs propriétés et à indiquer quelle instance se situe avant l'autre selon l'ordre voulu.

Le contrat de ces méthodes de comparaison est défini par :

Lire la suite
Par Ludovic Chaboud-Paupi, le 25 octobre 2012
Catégorie : Java J2EE

Guava : Classer les éléments d'une collection

Pour certains algorithmes, nous avons besoin de classer des éléments selon une de leur propriété.

Nous allons voir dans un premier temps comment classer une liste d'objets de manière classique, puis nous verrons comment le faire plus simplement à l'aide des bibliothèques common-collections d'Apache et guava de Google.

Cas pratique

Nous prenons comme exemple la liste de livres d'une bibliothèque.

Nous souhaitons avoir le classement des ouvrages selon leur auteur de la manière suivante :

 - Auteur : Jules Vernes
    - Cinq semaines en ballon, 1863
    - Voyage au centre de la Terre, 1864
    - De la Terre à la Lune, 1865
 - Auteur : Rudyard Kipling
    - Le livre de la jungle, 1894
    - Le second livre de la jungle, 1895


Lire la suite
Par Ludovic Chaboud-Paupi, le 20 octobre 2012
Catégorie : Java J2EE

Predicate In Action

Habituellement, la recherche d'éléments dans une liste consiste à écrire une boucle de parcours d'éléments, un test pour savoir si l'élément parcouru est un de ceux que l'on cherche, puis à ajouter cet élément dans la liste de résultats. L'écriture de ce code est redondant, source d'erreurs et peut devenir complexe à lire et à maintenir.

Les prédicats permettent de simplifier l'écriture de méthodes de recherche d'éléments dans une liste.

En effet, l'interface Predicate permet d'externaliser la méthode de sélection des éléments recherchés.

Nous nous concentrons sur l'intention : que les éléments trouvés correspondent bien à ce que nous cherchons.

Ainsi, nous verrons une recherche classique de livres correspondant à certains critères. Ensuite nous verrons comment les bibliothèques common-collections d'Apache et guava de Google nous permettent de simplifier l'écriture de cette recherche à l'aide notamment de l'interface Predicate.


Exemple de recherche

Nous allons prendre comme exemple une bibliothèque qui dispose d'une liste de livre.

Pour chaque livre, nous disposons des informations suivantes : le titre, l'auteur et l'année de publication.

Nous recherchons les livres répondant aux critères suivant :

  • auteur : Rudyard Kipling
  • titre : le titre comporte les mots "jungle" et "grand"

Voyons comment nous pouvons effectuer cette recherche.

 
Lire la suite
Par Ludovic Chaboud-Paupi, le 30 septembre 2012
Catégorie : Java J2EE

Gestion des énumérations avec Struts

Struts en version 1 ne supporte pas, par défaut, les énumérations au niveau des valeurs postées depuis les formulaires HTML.

Je vous propose une solution pour que Struts puisse convertir directement la valeur qui a été sélectionnée dans le formulaire HTML vers la valeur de l'énumération correspondante.

Exemple d’énumération

Comme exemple, nous prenons l'énumération sur les statuts d’un dossier :

public enum DossierStatut {
  /** Statut : Brouillon. */
  BROUILLON("dossier.statut.brouillon"),
  /** Statut : Nouveau. */
  NOUVEAU("dossier.statut.nouveau"),
  /** Statut : En cours. */
  EN_COURS("dossier.statut.encours"),
  /** Statut : A valider. */
  A_VALIDER("dossier.statut.avalider"),
  /** Statut : Clos. */
  CLOS("dossier.statut.clos");
  
  /**
   * Clé de message du libellé du statut.
   */
  private final String libelle;
  
  /**
   * Constructeur.
   * @param libelle Libellé.
   */
  public DossierStatut(String libelle) {
    this.libelle = libelle;
  }

  /**
   * Retourne la clé de message du libellé.
   * @return Clé de message du libellé.
   */
  Public String getLibelle() {
    return this.libelle;
  }
}

Page de saisie d’une valeur énumérée

Nous prenons comme exemple une page de recherche de dossiers.

L’utilisateur peut saisir un ou plusieurs statuts de dossier à rechercher.

Cette page contient une liste de cases à cocher pour chacun des statuts.

Page JSP

<%@ page import="fr.netapsys.exemple.model.DossierStatut"%>

<form>

  <%-- Parcourt tous les statuts possibles du dossier --%>
  <c:forEach items="${rechercheForm.dossierStatuts}" 
             var="dossierStatut">

    <%-- Ne pas sélectionner par défaut --%>
    <c:set var="selected" value="" />
    <%-- Tester si cette valeur a été précédemment sélectionnée --%>
    <c:set var="selected">
      <c:forEach items="${rechercheForm.dossierStatutSelecteds}"
                 var="dossierStatutSelected">
        <c:if test="${dossierStatut eq dossierStatutSelected}">
          checked="checked"
        </c:if>
      </c:forEach>
    </c:set>

    <%-- Affichage de la case à cocher --%>
    <label>
      <input type="checkbox" 
             name="statuts" 
             value="${dossierStatut}"
             ${selected}
      />
      <bean message key="${dossierStatut.libelle}" />
    </label>

  </c:forEach>

</form>

La boucle « c:forEach » itère sur toutes les valeurs possibles de l'énumération DossierStatut. Ces valeurs ont été obtenues à l'aide de la méthode « getDossierStatuts » du formulaire Struts « rechercheForm ».

La variable « selected » permet d'indiquer si une des valeurs a été cochée précédemment. Pour cela, nous effectuons une recherche dans la liste des valeurs précédemment sélectionnées.

Formulaire Struts

La classe RechercheForm contient une propriété « dossierStatutSelecteds » dont le type est un tableau de valeurs de l'énumération « DossierStatut ». Cette propriété contient les valeurs sélectionnées dans la page par l'utilisateur.

La méthode « getAllDossierStatuts » retourne toutes les valeurs possibles de l'énumération de « DossierStatut ».

public RechercheForm extends ActionForm {
  /**
   * Statuts du dossier sélectionné.
   */
  private DossierStatut[] dossierStatutSelecteds;

  /**
   * {@inheritDoc}
   */
  public void reset(ActionMapping mapping,
                    HttpServletRequest request)
  {
    super.reset(mapping,
                request);
    // Réinitialiser les statuts de dossiers sélectionnés
    // à chaque soumission du formulaire de recherche
    this.dossierStatutSelecteds = null;
  }

  /**
   * Retourne les statuts de dossiers sélectionnés.
   * @return Statuts de dossiers sélectionnés.
  public DossierStatut[] getDossierStatutSelecteds() {
    return this.dossierStatutSelecteds;
  }

  /**
   * Définit les statuts de dossiers sélectionnés.
   * @param dossierStatuts Statuts de dossiers sélectionnés.
   */
  public void setDossierStatuts(DossierStatut[] dossierStatutSelecteds) {
    this.dossierStatutSelecteds = dossierStatutSelecteds;
  }

  /**
   * Retourne la liste de tous les statuts de dossier possibles.
   * @return Statuts de dossier possibles.
   */
  public List<DossierStatut> getAllDossierStatuts() {
    return DossierStatut.values();
  }
}

Déclarer le plugin de conversion des valeurs postées dans Struts

A l"aide d'une classe de conversion, nous indiquons à Struts comment effectuer la conversion entre une des valeurs de l’énumération et la chaîne de caractères String contenant le nom correspondant dans l’énumération.

Exemple : l’utilisateur a sélectionné « En cours », la valeur sélectionnée et postée par le formulaire HTML est la chaîne de caractères « EN_COURS ». Le converteur va convertir cette chaîne de caractères en la valeur de l’énumération « DossierStatut.EN_COURS ».

Plugin de conversion de données

Tout d'abord nous déclarons le plugin de conversion de données.

<struts-config>
(...)

  <!-- Conversion de données postées. -->
  <plug-in
    className="fr.netapsys.exemple.web.converter.plugin.ConverterPlugin"
  />

(...)
</struts-config>

La méthode « init » de la classe du plugin « ConverterPlugin » permet d’indiquer les énumérations et la classe de conversion des énumérations.

public class ConverterPlugin
    implements PlugIn
{
  /**
   * {@inheritDoc}
   */
  public void init(final ActionServlet servlet,
                   final ModuleConfig config)
  {
    final EnumConverter enumConverter = new EnumConverter();

    // Conversion de l’énumération DossierStatut
    ConvertUtils.register(enumConverter,
                          DossierStatut.class);

    // TODO Ajouter les autres énumérations à convertir
    // ConvertUtils.register(enumConverter,
    //                       MonEnumeration.class);

  }
}

Pour définir une nouvelle énumération à supporter, il suffit d'ajouter la ligne suivante de déclaration du Converter pour cette énumération :

  ConvertUtils.register(enumConverter,
                        MonEnumeration.class);

Classe de conversion

La classe de conversion est en charge de convertir la chaîne de caractères soumise par le formulaire HTML vers la valeur de l'énumération correspondante.

Cette classe permet également l'opération inverse de conversion de la valeur de l'énumération vers une chaîne de caractères.

La classe de conversion suivante est générique et peut s’utiliser pour n’importe quel type d’énumération.

import org.apache.commons.beanutils.Converter;
import org.apache.commons.lang.StringUtils;

public class EnumConverter
    implements Converter
{

  /**
   * {@inheritDoc}
   */
  @SuppressWarnings("unchecked")
  public Object convert(final Class type,
                        final Object value)
  {
        if (value == null)
        {
            return null;
        }

        // Conversion de String vers l’énumération.
        if (value instanceof String)
        {
            final String valueAsString = StringUtils.trimToNull((String) value);
            if (valueAsString == null)
            {
                return null;
            }
            else
      {
        // Recherche de la valeur de l'énumération.
        Class<Enum> enum = (Class<Enum>) type;
        for (final Enum enumeration : (enum.getEnumConstants())
        {
          if (StringUtils.equalsIgnoreCase(valueAsString,
                                           enumeration.name()))
          {
            return enumeration;
          }
        }
        return null;
      }
    }
    // Conversion de l’énumération vers String.
    else if (type.isInstance(value))
    {
      return ((Enum) value).name();
    }
    // Type non supporté.
    else
    {
      return value;
    }
  }
}

Conclusion

Vous pouvez maintenant utiliser directement les énumérations dans vos pages JSP avec Struts.

La classe de conversion des énumérations permet d’accélérer le développement et facilite la compréhension de ce qui a été développé pour du futures évolutions.

Par Ludovic Chaboud-Paupi, le 15 juin 2012

m2eclipse : Déclarez vos projets Maven dans Eclipse

m2eclipse

m2eclipse édité par Sonatype permet le support de Maven dans l’IDE eclipse.

Ce plugin apporte des fonctionnalités notamment au niveau de l'édition des fichiers pom.xml, de la gestion et de l'actualisation des dépendances du projet dans Eclipse et de la gestion du filtrage des fichiers de ressources.

L’objectif de ce post est de vous présenter comment installer le plugin m2eclipse et comment configurer des projets existants ou créer de nouveaux projets.

Lire la suite
Par Ludovic Chaboud-Paupi, le 14 juin 2012
Catégorie : Java J2EE

SpringSource Tool Suite (STS) - Configuration des projets

SpringSource Tool Suite Suite au post précédent où je vous présentais les fonctionnalités de SpringSource Tool Suite pour l'édition des fichiers XML de Spring, je vous présente ici comment effectuer la configuration de votre projet avec ce plugin.

 
Lire la suite
Par Ludovic Chaboud-Paupi, le 13 juin 2012
Catégorie : Java J2EE

SpringSource Tool Suite (STS) - Simplifiez-vous l'écriture des fichiers XML de Spring

SpringSource Tool Suite SpringSource Tool Suite est un plugin qui permet le support de Spring dans Eclipse. Il se base sur le plugin Spring IDE.

Je vais vous présenter dans ce post les fonctionnalités de base de SpringSource Tool Suite qui sont de gérer la déclaration de beans Spring dans les fichiers XML.

Lire la suite