Modification de template Velocity au runtime

Velocity est un moteur de template Open Source Java de la fondation Apache. Nous utilisons Velocity depuis pas mal de temps pour tout ce qui est rapport aux fusions (Mail, publipostage,…).
Jusqu’à présent nous l’utilisions sous sa forme la plus “traditionnelle”, basée sur des fichier template (.vm), que nous chargions au runtime pour être fusionnés à une map de paramètres :

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

  // Initialisation du moteur velocity
VelocityEngine engine = new VelocityEngine();
engine.init();
// Chargement du template
Template template = engine.getTemplate( "test.vm" );
// Création du contexte
VelocityContext context = new VelocityContext();
context.put("nom", "Durand");
// Exécution du template dans une String
StringWriter writer = new StringWriter();
template.merge( context, writer );System.out.println( writer.toString() );

[/pastacode]

Dernièrement nous avons eu le besoin de composer une variable sur la base de plusieurs autres. Il s’agit de faire un peu plus que de la concaténation ; nous avons donc laissé nos utilisateurs créer leur propres variables de la sorte :

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

 politesse = &civilite &nom &prenom

[/pastacode]

Mais nous devions à ce moment là modifier nos template au runtime. Velocity offre pour cela une méthode evaluate qui permet d’évaluer un template (sous forme de String) :

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

StringWriter result = new StringWriter();
try {
velocityEngine.evaluate(velocityContext, result, "template", template);
} catch (Exception e)...

[/pastacode]

Ceci nous a permis de stocker les modèles en base de données sans avoir ensuite à recréer des InputStream ou autre pour les fusionner.

Nous modifions les modèles au runtime en leur ajoutant les variables créées par les utilisateurs.