Comentarios (2)
Compartir
Meneame Fresqui
Flenk Enchilame
Google Bookmark Barra Punto
Delicious    
Use durante un tiempo JasperReports para hacer reportes que tenian como output TXT filesc. Jasper es realmente una gran tool de reportes, pero cuando se trata de files ASCII simples deja muchisimo que desear. Es muy complicado manejar espacios y tabs, new lines y demas. Velocity resuelve eso sin hacer absolutamente nada.

Un tiempo atras teniamos un request de nuestros clientes de enviar notificaciones por email y/o fax. Lo primero que dije fue, OK se hace en Jasper, ahi podemos hacer vistosos PDFs para mandar x email y fax. El problema vino cuando me di cuenta que nuestro fax server solamente aceptaba ASCII text files entonces decidi aplicar Jasper TEXT. Fui ampliamente insultado por lo feo que quedaban los ASCII files. Para variar, luego de googlear un rato encontre Apache Velocity y eso soluciono mi vida ese dia.

A Apache Velocity lo podes encontrar aca.

Una vez que tenes los Jars de Velocity en tu CLASSPATH ya podes empezar a codear. Como primer tip voy a decir que Velocity busca los template files (.vm) en tu working directory. Pero la mayoria de las veces quiza quieras cambiar ese path a uno tuyo en particular. Eso se hace asi...

    // engine initialization
    Properties props = new Properties();
    props.setProperty("file.resource.loader.path", "/some/path");
    Velocity.init(props);
    
Ahora veamos un template file cualquiera, como se ven ? A este lo llamamos customer.vm

  $title                  $date

  Customer:
    Name: $name
    Address: $address
    Phone: $phone
    Fax: $fax
    
No tenes que ser ningun genio para darte cuenta que los simbolos $var son las variables, no ?    

Ya tenemos el template, ahora vamos a llenarlo con un poco de Java.

  // filling the cake
  VelocityContext context = new VelocityContext();
  context.put("title", "Address Book");
  context.put("date", new Date().toString());
  context.put("name", "Rodrigo Asensio");
  context.put("address", "1521-15X Bridford Road...");
  context.put("phone", "1 336 209 9942");
  context.put("fax", "1 336 209 9942");

Perfecto, ahora toca correr el engine de Velocity para hacer merge entre el template y las variables, obteniendo el resultado en un string en este caso ( tambien puede ser enviado a cualquier Output Stream)

  // running the engine
  Template template = Velocity.getTemplate("/some/path/customer.vm");
  StringWriter writer = new StringWriter();
  template.merge(context, writer);
  writer.flush();
  writer.close();
  String results = writer.toString();
 
Y voila! aca el resultado.

  Address Book                  Mon May 07 19:19:55 EDT 2007

  Customer:
    Name: Rodrigo Asensio
    Address: 1521-15X Bridford Road...
    Phone: 1 336 209 9942
    Fax: 1 336 209 9942

Ahora muestro un ejemplo usando una lista. Aca el template file

  #foreach($map in $items)                            ----> starts the foreach
  #set( $name = $map.get("name"))                     ----> set variables
  #set( $address = $map.get("address"))
    Name: $name                                       ----> print the variable
    Address: $address
  #end                                                ----> ends the loop

Analizando un poco este codigo vemos que hay un for loop (#foreach) que navega un objecto tipo Mapa ($map) de nombre $items. En cada iteracion setea 2 variables ( #set($name = $map.get("name") ) luego imprime las variables y al final cierra el loop (#end). Aca el codigo Java para llenar este template.

    List<Map> items = new ArrayList<Map>();
    Map<String, String> values = null;
    values = new HashMap<String, String>();  // first item list
    values.put("name", "Rodrigo Asensio");
    values.put("address", "1521-19X Bridford Road");
    items.add(values);
    
    values = new HashMap<String, String>();  // second item list
    values.put("name", "My Mom");
    values.put("address", "454 Top Ridge St");
    items.add(values);
    
    context.put(name, items);  // add to context
    
El final de este snippet es igual que el el paso anterior cuando hicimos running del Velocity Engine. El merge stuff.
    
Ok, estos ejemplos simples sirvieron para llenar un file sin mucho sentido, pero para que son realmente utiles los templates ? Veamos algunos casos.

Blogging, si, Blogspot y Wordpress usan templates para publicar los posts. (Blogspot usa XSLT transformers pero no se acerca de Wordpress, seguramente alguna tool PHP). Porque ? para que ? Al ser contendido "estatico" no hay necesidad de estar cargando una base de datos con queries que siempre seran los mismos, entonces al crear un post se genera un insert en la base de datos por seguridad y backup y tambien un output file el cual sera el archivo que vos estaras mirando en tu browser.

Fax y Emails. Enviar faxes o emails con templates predefinidos para sistemas automatizados es excelente. Actualmente tengo implementado en este software de blogging notificiones por email cuando alguien envia un comentario, les muestro el template que es source para el email que le llega.

    Comentario en $title $postUrl

    Hora: $timestamp
    Nombre: $name
    Email: $email
    URL: $url

    Comentario:
    $comment
    
Nada dificil, eh ?
Comentarios
Hola Sergio, dejame ver si entiendo bien tu pregunta.El codigo java va en un java file, como siempre, todo el codigo que va en el file .VM es simplemente texto plano con alguna referencia a variables como esta $customerID.Como lo lanzas depende de tu aplicacion, si es una webapp va a ser lanzado por por el application server que provee un servlet, si es una Desktop sera quiza lanzado por un boton presionado x el usuario y si es un proceso en background sera lanzado x una serie de condiciones.Si mi respuesta es incorrecta por favor explicate mas asi puedo darte algo mas acertado.Rodrigo
Hola! Encontré tu espacio y la verdad es que me viene como agua de mayo, pero el problema es que no sé donde metes las órdenes JAVA. ¿Las metes en el *.vm? ¿Las metes en un main? Y después...¿Lo lanzas como un "Java Aplication"?Muchas Gracias!
Agregar Comentario
Nombre
Email
URL
Comentario
Por Tags
Add to Technorati Favorites