Geração de código com Freemaker
Ao falar nesse assunto provavelmente venha a cabeça de cada um... VELOCITY da apache. Mas hoje vou "falar" de Freemaker. O Freemaker é muito semelhante ao velocity, eles tem o mesmo propósito. A partir de um template e objetos Java, é gerado um output que pode ser html,pdf,txt,classes java,arquivos de configuração,etc...
Esse framework se destaca em relação ao velocity por que:
Tags mais evoluidas estilo java 5.0
Mas simples de programar o template
Transformation Template
Bean Wrapper
Method Call
Transformation: Com esse recurso podemos especificar uma tag e ai efetuar um determinado processamento sobre todo o conteúdo que estiver sobre essa tag.
Vou dar um exemplo de um Transformation que passa o texto para maiusculo e coloca em negrito(html).
Classe java
Arquivo de template(tran.ftl)
Classe java que faz o merge do template com os objetos java e gera o output.
Outra freature interesante é a de BeanWrapper, podemos passar uma classe do java para o template do freemaker e assim usar todos os seus recursos no template.
Classe java
template
Outro ponto muito bom o Method Call, podemos espor um metodo java para ser usado dentro do template.
Classe java
template
O Freemaker tem muitas freatures interessantes e valhe a pena conferir.
Esse framework se destaca em relação ao velocity por que:
Transformation: Com esse recurso podemos especificar uma tag e ai efetuar um determinado processamento sobre todo o conteúdo que estiver sobre essa tag.
Vou dar um exemplo de um Transformation que passa o texto para maiusculo e coloca em negrito(html).
Classe java
class UpperCaseTransform implements TemplateTransformModel {
public Writer getWriter(Writer out, Map args) {
return new UpperCaseWriter(out);
}
private class UpperCaseWriter extends Writer {
private Writer out;
UpperCaseWriter (Writer out) {
this.out = out;
}
public void write(char[] cbuf, int off, int len)
throws IOException {
out.write("<b>" + new String(cbuf, off, len).toUpperCase() + "</b>");
}
public void flush() throws IOException {
out.flush();
}
public void close() {
}
}
}
Arquivo de template(tran.ftl)
<@up>
teste
de
freemaker
</@up>
Classe java que faz o merge do template com os objetos java e gera o output.
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("C:/dir_fonte_dos_templates"));
Template t = cfg.getTemplate("tran.ftl");
Writer out = new FileWriter(new File( "C:/file_gerada.html"));
Map<String,Object> parameters = new HashMap<String, Object>();
parameters.put("up", new UpperCaseTransform());
t.process(parameters, out);
out.flush();
out.close();
System.out.println("Geração com freemaker, feita com sucesso!");
Outra freature interesante é a de BeanWrapper, podemos passar uma classe do java para o template do freemaker e assim usar todos os seus recursos no template.
Classe java
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("C:/dir_fonte_dos_templates"));
Template t = cfg.getTemplate("tran.ftl");
Writer out = new FileWriter(new File( "C:/file_gerada.html"));
BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
TemplateHashModel staticModels = wrapper.getStaticModels();
TemplateHashModel fileStatics;
fileStatics = (TemplateHashModel) staticModels.get("java.io.File");
Map<String,Object> parameters = new HashMap<String, Object>();
parameters.put("File", fileStatics);
t.process(parameters, out);
out.flush();
out.close();
System.out.println("Geração com freemaker, feita com sucesso!");
template
<center>Drives
<#list File.listRoots() as fileSystemRoot>
<li> ${fileSystemRoot}
</#list>
</center>
Outro ponto muito bom o Method Call, podemos espor um metodo java para ser usado dentro do template.
Classe java
public class MethodReverse implements TemplateMethodModel{
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() != 1) {
throw new TemplateModelException("Wrong arguments");
}
StringBuffer sb = new StringBuffer((String) args.get(0));
return new SimpleScalar(sb.reverse().toString());
}
public static void main(String[] args) throws TemplateModelException{
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("C:/dir_fonte_dos_templates"));
Template t = cfg.getTemplate("tran.ftl");
Writer out = new FileWriter(new File( "C:/file_gerada.html"));
Map<String,Object> parameters = new HashMap<String, Object>();
parameters.put("rev", new MethodReverse());
t.process(parameters, out);
out.flush();
out.close();
System.out.println("Geração com freemaker, feita com sucesso!");
}
}
template
${rev("teste")}
O Freemaker tem muitas freatures interessantes e valhe a pena conferir.