Início > Programação > Formatação de E-mail Com Velocity

Formatação de E-mail Com Velocity

Precisava enviar um e-mail no formato HTML após a efetivação de um cadastro. A primeira coisa que pensei foi criar um simples arquivo TXT com tags HTML e outras tags para marcar os pontos de inserção de valores após o parse. Apresentei um protótipo para um colega e ele me perguntou porque não usei o Velocity. Faz tempo que ouço falar dele, mas nunca sequer me aventurei a fazer um Hello World.

Gastei algumas horas estudando e achei bastante intuitivo. O produto final é tão simples e elegante que me fez acreditar que aquilo que estava tentando fazer antes era uma gambiarra. Criei um arquivo chamado “template.vm” – pode ser qualquer extensão – com um formato mais ou menos como abaixo:

#if ($cliente.Especial == "true")
  #set( $concederDesconto = "Sim" )
#else
  #set( $concederDesconto = "Não" )
#end
$dateFormatter.format('dd/MM/yyyy', $pedido.Data)
<h3>$pedido.Id</h3>
#foreach ($produto in $produtos)
$produto.Nome
#end

Com o Velocity, é possível definir variáveis, utilizar condicionais, loops, etc. O código abaixo é quase o mesmo que o do GUJ. Não criei os POJOs, pois o exemplo é apenas para dar uma idéia do que é possível fazer com o Velocity:

public class VelocityListProcess{
	public static void main(String args[]) throws Exception{
		Properties loaderProperties = new Properties();
		loaderProperties.put("resource.loader", "class");
		loaderProperties.put("class.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
		VelocityEngine ve = new VelocityEngine();
		ve.init(loaderProperties);

		VelocityContext context = new VelocityContext();

		Template template = ve.getTemplate("br/com/mail/template.vm");

		List produtos = new ArrayList();
		produtos.add(new Produto("Produto 1")));
		produtos.add(new Produto("Produto 2")));

		Pedido pedido = new Pedido(1);

		Cliente cliente = new Cliente("José");

		context.put("dateFormatter", new DateFormatter());
		context.put("cliente", cliente);
		context.put("pedido", pedido);
		context.put("produtos", produtos);
		StringWriter writer = new StringWriter();

		template.merge(context, writer);

		System.out.println(writer.toString());
	}
}

Veja o uso da propriedade “class.resource.loader.class” com ClasspathResourceLoader passada para a inicialização do VelocityEngine. Não consegui de forma alguma referenciar o arquivo “template.vm” mesmo que ele estivesse no mesmo pacote da classe que o utiliza. Achei a solução aqui. Se aquela propriedade estiver settada com uma instância de ClasspathResourceLoader, o Velocity irá delegar a “descoberta” do recurso para o ClassLoader. Se o template estiver no classpath, funcionará. Para mais detalhes do uso dos Resource Loaders do Velocity bem como da VTL, dê uma olhada nas referências.

Note que no arquivo “template.vm” há uma propriedade chamada “dateFormatter” cujo valor é uma instância da classe abaixo que passo para o contexto do Velocity via classe Java. O método “format” recebe um formato de data e um objeto Date:

public class DateFormatter { 
	public String format(String format, Date date) { 
		return DateFormatUtils.format(date, format); 
	} 
} 

Conclusão

O Velocity é uma ferramenta que faz bem o que se propõe a fazer e já entrou para minha caixa de ferramentas. Gostei da possibilidade de inserir quaisquer instâncias de classes especializadas – formatação de datas, por exemplo. Outra coisa importante é submeter seu código a críticas construtivas antes de tê-lo como concluído. Mais uma dica: programe contra a interface. Assim, você diminuirá a dependência do Velocity tornando o design do seu componente mais flexível.

Referências

http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html
http://velocity.apache.org/engine/devel/vtl-reference-guide.html
http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#resourceloaders
http://tech–help.blogspot.com.br/2010/02/solved-apache-velocity-how-to-load.html

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: