Gráficos con Grails: Plugin j2d

 Una de las cosas que me apetecía (en pasado) hacer era unos gráficos estadísticos en mi proyectito del tablero Kanban. Cosas como promedio que tarda una tarjeta desde que se empieza hasta que se termina, de tarjetas en curso, quizás algún tipo de BurnDown. Así que le pregunte a google sobre la posibilidad de hacer gráficos desde grails. Encontré un par de plugins, uno es j2d y el otro birt report. Lo de birt me sonaba a Jasper Reports y lo poquito que he jugado con ello me parecía excesivo para lo que pretendo, así que lo intenté con j2d.

En la documentación cuenta como instalarlo con un comando grails. Correcto, funciona a la primera. En la documentación cuenta un ejemplo sencillo y correcto, también funciona a la primera. Pero el ejemplo se limita a generar un gráfico y mostrarlo en el navegador, el gráfico solo, sin nada más. Yo soy un poco caprichoso y lo del gráfico solo no me gusta, querría que en la página del navegador, además del gráfico, saliera algo de texto, quizás el título del tablero Kanban sobre el que se está mostrando el gráfico, algún enlace para volver al tablero, quizás una pequeña explicación del gráfico. Así que intento, en el mismo controlador, hacer "render" de algo más. Pues bien, si intentas hacer render de algo más salta un error de que el OutputStream ya ha sido enviado (o algo así).

Vuelvo a preguntar al todo-sabedor google y veo en algún sitio/foro que el método renderImage() del plugin, el del ejemplo, efectivamente, envía todo hacia el navegador, cabecera de la petición http, contenido y todo, por lo que no puedes enviar nada más. Mirando el método ese, veo que se le puede poner un nombre de fichero para que grabe el gráfico en dicho fichero. Pues ya está, me digo, grabo el fichero y luego ya enlazaré/incluiré el fichero en la página html/gsp. Mi gozo en un pozo, fíjate que cosas, el fichero efectivamente se graba, pero se sigue enviando todo el contenido al navegador y puedo sin seguir enviar nada, ni poner una página gsp asociada al controlador ni nada.

Pues toca mirar la documentación. Desde luego, la del plugin es totalmente escasa, ya que sólo trae el ejemplo y una descripción de los posibles parámetros. Eso sí, el plugin nos redirige a GfxBuilder librería en la que se basa el plugin j2d. La documentación de GfxBuilder sí que es escasa y está muy asociada a griffon, otro framework similar a grails, pero para aplicaciones de escritorio. Eso sí, GfxBuilder nos redirige a su antigua versión GraphicsBuiler o a una tercera página que dice tener muchos ejemplos.

Mirando la documentación de GraphicsBuilder, efectivamente, hay muchos, muchos ejemplo, casi uno por cada posible primitiva de pintado. Mirando la tercera página que dice tener ejemplos, también hay muchos ejemplos, incluso algunos de ellos muy bonitos, como esferas 3d con sombreado y tazas de café, pero ……. todos, absolutamente todos los ejemplos se limitan única y exclusivamente a decir qué primitivas de pintado tienes que usar para obtener esos maravillosos dibujos. En ninguno te dice a qué clase pertenecen esos métodos, qué clase tienes que instanciar/usar para poder llamar a esos métodos ni cómo pasarle el panel, image, fichero o dónde sea que vaya a salir el dibujo.

Después de pasarme dos tardes discutiendo el asunto en intensivas reuniones con google, encuentro un ejemplo en el que alguien se digna poner el ejemplo más o menos completo, con sus import, su new de una clase GraphicsBuilder o GraphicsRender (no recuerdo, creo que hay las dos) y como hacer que te devuelva el dibujo en una clase Image. ¡¡ Alegría !!. ¡¡ A ello !! Una Image sí sé, con java, grabarla en un fichero. Duró poco la alegría, en el plugin parecen no existir los objetos GraphicsBuilder ni GraphicsRender, tengo que probar más, pero hasta ahora no he conseguido verlos.

También he intentado hacer la imagen directamente en java y grabarla en fichero. Hacerlo con una imagen tonta has sido dos minutillos (afortunadamente, de java controlo un poco más que de groovy), pero me he llevado un pequeño chasco. Arrancando la aplicación con grails run-app, se graba fuera del contexto de la aplicación (por encima de web-app), por lo que desde el navegador no podré acceder a ella. Arrancando de la misma forma, renderImage() la graba en un sitio accesible (debajo de web-app). No sé, quizás me equivoque, pero no parece muy lógico que el directorio actual sea distinto si usas clases java o clases groovy dentro del mismo proyecto.

Supongo que hoy, día del padre y festivo, dedicaré algo más de tiempo a aclararme con esto de los gráficos, pero hoy será el día tope para tener algo o dejarlo por imposible. O quizás lo intente con javascript, que he visto hay miles de librerías ya hechas para gráficos.

Esta entrada ha sido publicada en grails y etiquetada como , , , . Guarda el enlace permanente.

5 respuestas a Gráficos con Grails: Plugin j2d

  1. Sodapop dijo:

    Amigo Chuidiang:

    Aunque no he leido todo lo que se postea en tu blog sobre Groovy/Grails, además de darte la razón (por supuesto) quiero comentar algunas cosas.
    La comunidad Grails es muy pequeña y además gran parte de ella está muy interesada en sacar partido a través de la formación. «Grail está padrisimo, aprende Grails»… pero en su escuela.
    Si vas por libre…. y si encima tienes una duda… lo llevas claro. Entre que la mitad está peor o igual que tu y que la otra mitad está pensando en cobrar un billetaje por el curso, pues como que no se te resuelve tu duda.
    Pásate por groovy.org.es y verás dudas y preguntas de gente que sencillamente nunca tienen respuesta. Intenta ponerte en contacto con ellos (twitter, facebook…incluso en el mismo foro he leido algo)y nunca aparecen… ¿Aprendieron Grails y ahora prestan la misma atención que le prestaron a ellos? ¿Desistieron de aprender?
    Hay varios libros en inglés muy buenos y detallados, con un precio. Existe un libro en castellano, que paradojicamente aunque tenga licencia Creative Commons y te permita distribuirlo libremente entre tus amigos, tu tienes que pagarlo. Aunque el precio realmente no es elevado, menos de 150 páginas (que tu pagas y tus amigos no) cuando sale una nueva versión, te vuelven a cobrar (lo que es en ciarta manera lógico) pero a tus amigos de nuevo no.
    Este libro, la verdad es que es corto, no sirve para los que tengan poco conocimientos y para los que tengan muchos conocimientos en frameworks.. lo mismo no le hace falta.

    Sin embargo, en mis comienzos con java, todo fué muy distinto y me sentí arropado por la comunidad y contestado en mis dudas. Gracias Chuidiang por ayudarme.

    Sobre Grails, ¿aprendí o desistí?. Desisti!

  2. Dani Latorre dijo:

    A mi se me ocurre una solución sencillita, que entiendo que se ajusta a lo que necesitas.

    Simplemente enlaza la imagen desde una vista en la que tengas el resto de información en html:

    img src=»${createLink(controller:’elController’,action:’actionQueRenderizaUnaImage’,…)}»

    Sobre lo que comenta Sodapop, pues no sé… yo me paso alguna vez por esos foros y no llego a entender la mayoría de las preguntas que se hacen, por lo que no puedo ayudar.

    No me creo que quienes dan formación de Grails no quieran contestar en foros por que viven de eso, son cosas completamente diferentes… es más, si contestan en foros ayudarán a dar a conocer que tienen conocimiento y eso lo saben.

  3. Chuidiang dijo:

    @Dani Latorre muchas gracias, ha funcionado perfectamente. Con tu permiso, la publicaré en algún lado (en un post o la chuwiki) por si alguien tropieza en la misma piedra que yo y la neurona le funcina tan mal como a mí 😉

    Por cierto, ¿que tal gaelyk, que veo que estás haciendo tus pruebas?

  4. Dani Latorre dijo:

    Por supuesto, publícalo donde quieras 🙂

    Con gaelyk jugué sólo un poco y no lo he retomado, tiene una pinta prometedora por lo sencillo que es utilizarlo, a estas alturas está bastante verde y la comunidad es casi inexistente, aunque tampoco sé como está el soporte de otros frameworks java para app engine.

  5. Pingback: Diario de Programación » Blog Archive » Pequeños éxitos con Grails

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.