FreeMarker

nasix
FreeMarker

Bonjour,

J'utilise FreeMarker pour generer des eMail suivant un modèle stocké dans un fichier modele.txt;

Mon problème est que je ne sais pas comment récupèrer le mail généré dans une chaine String pour l'envoyer. je ne peux que l'afficher ou le stocker dans un fichier.

Voila le code de ma fonction MailGenerate()

Quote:

try{
Map root = new HashMap();
model.put("name", "name");

/* Create and adjust the configuration */

Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("C:\\rep"));
cfg.setObjectWrapper(new DefaultObjectWrapper());

/* Get the template */

String templateName = "modele.txt";
Template temp = cfg.getTemplate(templateName);

/* Create a data model */

Writer out = new OutputStreamWriter(String.out);
temp.process(model, out);

out.flush();

}catch(java.io.IOException e){

System.out.println("The error is : "+ e.getMessage());
}
catch(TemplateException e){

System.out.println("The error is : "+ e.getMessage());
}

Merci

fredericmazue

Quote:

Mon problème est que je ne sais pas comment récupèrer le mail généré dans une chaine String pour l'envoyer. je ne peux que l'afficher ou le stocker dans un fichier.

Je ne connais pas FreeMarker. Mais tel que tu présentes ton code, ce n'est pas prévu que tu puisses récupérer directement la chaîne.
Mais il y a un moyen tout simple il me semble, le bon vieux Design Pattern Decorateur :)
Pour info le pattern sera expliqué dans Programmez! 95.

En attendant, le principe est tout simple. Au lieu de passer

Writer out = new OutputStreamWriter(String.out); 

à
temp.process(model, out);

tu passes:

MyWriter out = new MyOutputStreamWriter(String.out); 

tel que

- class MyOutputStreamWriter extends OutputStreamWriter
- le constructeur reçoit une référence sur une instance de OutputStreamWriter et la conserve quelque part, par exemple dans OutputStreamWriter osw;
-et dans la classe tu redéfinis la (ou les) méthodes read (our read byte[], etc, etc, selon les besoins) tel que:

int read() {
	int i = osw.read();
	// ici convertir i et l'ajoueter à la chaîne que tu veux avoir
	return i; // et  passez muscade ;)
}

Suis-je clair ?

nasix

Merci,

mais la classe OutputStreamWriter ne possède pas méthode read.

fredericmazue

Ah !! :lol:

Quelle andouille je fais! J'ai écrit tout mon message en ayant obstinément en tête InputStreamWriter, je ne sais pas pourquoi... :oops:
Ce que je t'ai dit reste valable. Bien sur ce sont les méthodes write qu'il faut redéfinir. Mais le principe est bon :)