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

    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.

  • Popular posts from this blog

    Kafka Streams with Java 15

    Rust and Java Interoperability

    HMAC in Java