jueves, 31 de marzo de 2016

Remplazar variables groovy dado un string dinámico y un modelo

Algo que es muy  util en groovy son los GString, que nos permiten rápidamente armar un string en base a variables.
Ej : "variable a vale :${a}" 

Algunas veces necesitamos dado un GString y un modelo obtener ese texto remplazado.
Esto se empieza a complicar cuando necesitamos que ese texto sea dinámico, ya que no podemos simplemente harcodearlo en el código, y este requerimiento muchas veces viene cuando necesitamos crear alguna especie de ABM, como un sistema de templates para alguna utilidad, mensajes predefinidos, etc.
Una de las formas de solucionar esto, es usando un SimpleTemplateEngine, que bindeandolo con el modelo podemos obtener el remplazo de las variables.

Por lo que un caso de uso interesante, es tener un ABM, permitir dinámicamente agregar/quitar variables, y luego al procesarlo solamente es obtener el string dinámico desde la base, y aplicarle nuestro modelo.


Dejo el Snippet de código:


1
2
3
4
5
def getGstring(subject, binding ){
        def engine = new SimpleTemplateEngine()
        def template = engine.createTemplate(subject).make(binding).toString()
        return template
    }

miércoles, 23 de marzo de 2016

Snippets de código a html

Buscando como poner los snippets de código en un formato "lindo" me encontre con la web
hilite.me

La web le pones el snippet como texto ,y te devuelve el html ya formateado, con los estilos inline, ideal para postearlo en un blog por ejemplo :p

Pasear fechas que no sabemos el formato

Muchas veces ocurre que necesitamos en base a un string pasear fechas.
Lo normal es escribir una regex para esa fecha en particular, pero cuando queremos darnos cuenta(si consumimos distintos servicios) nos encontramos que tenemos distintas regex distribuidas por todo el código.

La mejor forma que encontré de lidiar con esto, es tener las regex más comunes que usamos en la empresa, y un fallback genérico con el formato mínimo que suelen compartir, y realmente nos ha dado buenos resultados.
Dejo el snippet en groovy, la idea es pasarle el string, y que te devuelta la fecha parseada, haciendo el best-effort por parsearla lo más precisamente posible. Debemos hacer el chequeo de NULL ya que este método puede no devolvernos la fecha en caso que no pueda parsear el string. Además depende de el manejo de logs que tengamos, puede que si no tengamos cuidado contaminemos los logs importantes con esto(en los casos que falla)



    def parseDateTime(String date){
        def returnDate
        for(it in ["yyyy-MM-dd'T'HH:mm:sss'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", "yyyy-MM-dd"]){
            try{
                returnDate =  new Date().parse(it, date)
                break
            }catch (Exception e){
                log.info "${date} no pudo ser parseado con el dateFormat ${it}"
            }
        }
        return returnDate
    }