Archive

Posts Tagged ‘Java’

Quizz : que fait ce code ?

December 23rd, 2008 4 comments

Quizz : Que fait cette méthode ?

Question subsidiaire : comment rendre le code plus lisible (en Java) ?

public static <D, R> List<R> inParallel(int nbThreads, List<D> dataList,
final Function<D, R> dataToAction) {
  Function<D, Callable<R>> dataToCallable = new Function<D, Callable<R>>() {
    @Override
    public Callable<R> apply(final D data) {
      return new Callable<R>() {
        @Override
        public R call() {
          return dataToAction.apply(data);
        }
      };
    }
  };

  Function<Future<R>, R> futureToResult = new Function<Future<R>, R>() {
    @Override
    public R apply(Future<R> future) {
      try {
        return future.get();
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
  };

  ExecutorService executorService = Executors.newFixedThreadPool(nbThreads);

  try {
    List<Callable<R>> actions = Lists.transform(dataList, dataToCallable);
    List<Future<R>> results = executorService.invokeAll(actions);

    return Lists.transform(results, futureToResult);
  } catch (InterruptedException e) {
    throw new RuntimeException(e);
  } finally {
    executorService.shutdown();
  }
}
Tags: ,

Wanted : syntaxe pour remplacer une méthode d’un objet dans un test unitaire

December 17th, 2008 Comments off

J’utilise le framework Mockito depuis quelques mois pour simplifier l’écriture de mocks dans mes tests unitaires.
Là où EasyMock ne m’a jamais convaincu, Mockito présente une syntaxe à la fois simple et puissante. Par contre, il m’arrive de vouloir remplacer une méthode bien précise d’un objet soumis au test et là, Mockito ne m’aide pas.

Voilà ce que je suis obligé d’écrire :

final FileTemplate mockFileTemplate = new FileTemplate();

CopyFileRule rule = new CopyFileRule("src.txt", "dest.txt") {
	@Override
	protected FileTemplate createFileTemplate() {
		return mockFileTemplate;
	}
};

Voilà la syntaxe que j’aimerais avoir :

CopyFileRule rule = intercept(new CopyFileRule("src.txt", "dest.txt"));

when(rule.createFileTemplate()).thenReturn(new FileTemplate());

Connaissez-vous un outil qui permettrait de faire ça ?

Tags: ,

Améliorer la génération WSDL vers Java

November 28th, 2008 Comments off

Chaque stack SOAP Java a ses propres outils pour générer des Stubs Java à partir d’un fichier de description WSDL. A une époque, les outils Axis ou XFire généraient des Stubs franchement différents pour le même WSDL. Maintenant, les outils sont à peu près d’accord sur le format.

La description suivante :

<complextype name="CredentialsHeader">
    <sequence>
        <element name="username" type="xsd:string"/>
        <element name="password" type="xsd:string"/>
    </sequence>
</complextype>

Va générer la classe Java suivante :

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CredentialsHeader", propOrder = {"username", "password"})
public class CredentialsHeader {
    @XmlElement(required = true)
    protected String username;
    @XmlElement(required = true)
    protected String password;

    public String getUsername() {
        return username;
    }
    public void setUsername(String value) {
        this.username = value;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String value) {
        this.password = value;
    }
}

Ce POJO est minimaliste : pas de constructeur avec paramètres, pas de toString()

Résultat, le code client d’appel des WebServices est fastideux avec beaucoup d’appels de setters et les résultats renvoyés ne peuvent pas être simplement dumpés dans la console.

Bien sûr, il est possible d’ajouter tout cela à la main post-génération, ça n’a pas d’impact sur les appels de WebServices, mais c’est fastidieux.

La solution repose sur jaxb2-commons. Un ensemble de plugins qui vont enrichir la génération des Stubs.

Prenons un exemple avec Metro, la stack SOAP de Sun et un bon vieux script Ant :

< ?xml version="1.0" ?>
<project default="all" basedir=".">
    <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
        <classpath>
            <fileset dir="metro/lib">
                    <include name="**/*.jar"/>
             </fileset>
            <fileset dir="plugins">
                    <include name="**/*.jar"/>
             </fileset>
        </classpath>
    </taskdef>

    <target name="all">
        <wsimport xnocompile="true" wsdl="test.wsdl">
            <xjcarg value="-Xvalue-constructor"/>
            <xjcarg value="-Xcommons-lang"/>
        </wsimport>
    </target>
</project>
  • Le paramètre -Xvalue-constructor permet de générer des constructeurs avec paramètres en plus du constructeur par défaut.
  • Le paramètre -Xcommons-lang permet de générer les méthodes equals(), toString() et hashCode() en utilisant apache-commons-lang.
Tags: , ,

Spring JavaConfig

June 2nd, 2008 3 comments

Today, I’ve had the opportunity to test Guice on a real project. I must say that the developers really pushed the idea of statically typed IoC very far.
Read more…

Tags: , ,

H2 Database Engine

March 22nd, 2007 Comments off

I’m a big fan of HsqlDB for writing tests.

Yesterday I discovered this projet : H2 Database, written by the same author. It seems to have better performance for larger applications and better support for ACID properties.