Archive

Posts Tagged ‘Spring’

Spring and GWT integration

August 7th, 2007

Googling for ways to integrate GWT with Spring, I didn’t find any simple solution.

Here is what I need :

  • GWT RPC services should be Spring beans.
  • They should be POJOs NOT extending RemoteServiceServlet.
  • Mapping between Servlet paths and beans should be straightforward.

Here is what I came up with :

  • It’s a very simple Servlet that receives every RPC request.
  • It then gets a Spring bean by the name of the Servlet path used for the call.
  • The method call to the bean is done with reflection.

public class SpringDispatchService extends RemoteServiceServlet {
    private final ClassPathXmlApplicationContext context;

    public SpringDispatchServiceImpl() {
        context=new ClassPathXmlApplicationContext(”beans.xml”);
    }

    public String processCall(String payload)
        throws SerializationException {
        try {
            Object target=context.getBean(getServletName());

            RPCRequest rpcRequest=RPC.decodeRequest(
                payload,target.getClass());
            
            Method method=rpcRequest.getMethod();
            Object[] params=rpcRequest.getParameters();

            Object result=method.invoke(target,params);
            
            return RPC.encodeResponseForSuccess(method,result);
        } catch(Throwable ex) {
            return RPC.encodeResponseForFailure(null,ex);
        }
    }
}

Blog, Valtech Blog ,

Spring et Java EE5

February 12th, 2007

Spring supporte déjà le standard JPA des EJB3. Le projet Pichfork d’Interface21 vie à apporter le support complet des EJB3 à travers le support des annotations standard JEE5. Ce projet servira de base au futur Weblogic.

Blog

ExcelTemplate, la lecture de fichiers Excel facilitée

January 26th, 2007

Cet article présente un petit outil OpenSource que j’ai développé pour faciliter la lecture de jeux de test Excel dans une démarche Test Driven Requirement.

Le méthodes agiles préconisent de tester avant de développer. Pour ce faire, un outil comme Fitness permet d’écrire des tests utilisateur automatisés en utlisant un wiki et des tables HTML. Pour ma part, je préfère une approche basée sur des fichiers Excel®. Se pose alors la problématique de la lecture de ces fichiers.

POI-HSSF permet de lire un fichier Excel®. Toutefois le code à écrire est vite illisible et répétitif.
En m’inspirant (très) fortement des JdbcTemplate et JmsTemplate de Spring, j’ai commencé à concevoir un ExcelTemplate capable d’encapsuler les appels à POI-HSSF, dans le but de lire des feuilles Excel®, avec un code lisible.

Voici le résultat pour convertir un onglet donné en tableau de String :

ExcelTemplate reader = new ExcelTemplate (”a.xls”);
String[][] lines = reader.read (”TabName”);

Un autre exemple pour lire un liste de Map. Chaque ligne du fichier est représentée par une Map. La première ligne donne les clefs. Les autres lignes donnent les valeurs. Petite subtilité, le fichier est lu depuis le Classpath :

ExcelTemplate reader = new ExcelTemplate (”a.xls”,getClass());
List lineAsMaps = reader.readList (”tab”);

Il est également possible de mapper les lignes dans des POJO, de cette façon :

ExcelTemplate reader = new ExcelTemplate (”a.xls”);
List beans = reader.readBeans (”tab”, MyBean.class);

Les trois exemples précédents présentent des comportements par défaut bien pratiques. Il est toutefois possible de tout customiser par l’utilisation de classes Callback. Le code suivant lit le contenu d’un onglet avec un CellMapper permettant de personnaliser la convertion du contenu d’une cellule en objet (par exemple pour tenir compte du style de la cellule) :

String[][] lines = (String[][]) reader.read (”tab”, new MyStringCellMapper(), String.class);

Voici un autre exemple utilisant un SheetExtractor pour personnaliser complètement la lecture du contenu d’un onglet tout en déléguant au template la compléxité du parsing de la feuille :

SheetInfo sheetInfo = (SheetInfo) reader.read (”TabName”, new SheetExtractor() {
public Object extractData (HSSFSheet sheet) throws IOException, DataAccessException {
return new SheetInfo (sheet.getFirstRowNum(), sheet.getLastRowNum());
}
})

private static class SheetInfo {
public int firstRow;
public int lastRow;

public SheetInfo (int firstRow, int lastRow) {
this.firstRow = firstRow;
this.lastRow = lastRow;
}
}

Le projet est en OpenSource. Les classes reposent sur Spring et sur POI-HSSF. Le projet est construit avec Maven2 et utilise des plug’ins comme Cobertura ou Checkstyle. Il a été développé avec une approche TDD et la couverture de tests est proche des 100%.

Il me reste à écrire la documentation. Un volontaire ?

Blog ,