Utilizando JasperReports con PHP

Ver Comentarios

Posted on : 23-02-2010 | By : Carlos Cordero | In : Java, PHP, Software

JasperReports es una de las librerías de generación de informes más populares y versátiles, bajo tecnología Java, incluyendo iReports, la herramienta visual para la generación de los informes.

Es una lástima, pero hay que admitir que actualmente bajo PHP no existe ninguna librería que esté minimamente a la altura, teniendo que recurrir a librerías del estilo FPDF para la exportación en PDF… y por supuesto diseñando los informes “a manini”.

Por lo tanto, pongámonos manos a la obra y busquemos una forma de unir PHP y Java, así podremos utilizar JasperReports desde una aplicación PHP. Usaremos una librería llamada php/Java Bridge, que nos permitirá realizar llamadas a métodos Java desde el código PHP de la aplicación. Aunque no es la única existente en el mercado y podamos encontrar otros bridges como Quercus, será la que utilice en este post por ser gratuita y cumplir la funcionalidad que necesitamos, utilizar JasperReports desde PHP.

Read the rest of this entry »

Oracle y el futuro de los productos de Sun

Ver Comentarios

Posted on : 30-01-2010 | By : Carlos Cordero | In : Java, Software

El día 27 Oracle presentó en un evento multitudinario lo que van a ser en lineas más o menos generales sus prioridades de y lineas de negocio para los próximos meses tras la compra de Sun Microsystems. En Java Hispano hicieron una gran cobertura de la retransmisión y se pueden leer sus impresiones en el siguiente artículo.

Dos cosas que personalmente no me han sorprendido en absoluto:

  • Su deseo de seguir potenciando Java (aunque no dijesen mucho de JavaFX): Está claro que no van a dejar de lado uno de los lenguajes y tecnologías más utilizados en este momento. Tampoco van a hacer cambios drásticos por temor a que los desarrolladores migren de plataforma.
  • MySQL, que estoy seguro que ha sido parte del acuerdo con la U.E., seguirá siendo desarrollado, y en el fondo de la cuestión, creo que a Oracle le interesa. MySQL y Oracle nunca han jugado en la misma liga ni se enfocan al mismo mercado, y ahora Oracle tiene dos mercados distintos que dominan. ¿Por qué iban a abandonar uno de ellos?

Aunque parezca dificil de creer, a lo que le veo peor futuro es a Oracle XE, creo que ese nicho de mercado lo van a potenciar con MySQL y crearán de alguna forma una opción de migración rápida entre este último motor de base de datos y su producto estrella, Oracle.

En el lado muy negativo, veo un futuro muy negro tanto para Glassfish como para mi querido Netbeans, del cual ya han dejado claro que su desarrollo no va a ser prioritario, y por ende, dejará de poder competir codo con codo con Eclipse. Me parece una noticia muy negativa, sobre todo para alguien que, como en mi caso, utiliza Netbeans a diario.

Esto ha sido lo “oficial”, en los próximos meses veremos si todo es verdad o entre líneas se escondían otras sorpresas completamente inesperadas.

Jugando con Hibernate y Json

Ver Comentarios

Posted on : 15-10-2009 | By : Carlos Cordero | In : Internet, Java, Software

Unos duermen a las 8 de la mañana, otros están en el atasco (que asco) y otros nos divertimos jugando con el código como si fuese un trozo de arcilla. No hay nada más divertido en Java como descubrir toda clase de excepciones que más que informarte de algo parece que te insulten… “UndeclaredThrowableExceptiondice, pero a mi siempre me ha sonado a “¿pero que coño acabas de intentar hacer loco?

Aunque ya llevo unos días jugando con servicios web, JSON y java (post relacionado) fue ayer cuando, después de una conversación de cigarro, quise probar a hacer la serialización de POJOs recuperados con hibernate, tal cual, sin filtrar nada y en el menor número de líneas posible: bueno, pues se puede hacer en 3 lineas de código. Si “fale”, le faltará un poquito de tweaking pero por algo se empieza (por cierto, una de las líneas es la que recupera el objeto persistido).

El misterio de la cuestión está en estas dos líneas:

XStream xstream = new XStream(new JettisonDriver()); 
String xml = xstream.toXML(taxon);

Para más información, XStream es una librería para la serialización de objetos en XML, con la ventaja de poder setearle un driver específico, en este caso uno que encontré rebuscando en foros, JettisonDriver(), cuya mayor ventaja además de serializar en JSON es que permite des-serializar igualmente.

Por cierto, un tip adicional si estáis trabajando con Hibernate y queréis tirar alguna query HQL para sacar los datos a serializar.  Hibernate utiliza CGLIB para la generación de ciertas partes de código al vuelo (más info, Reflection Java) y por lo tanto, es muy posible que nos encontremos con clases que han pasado por el proxy, las cuales se identificar por tener $EnhancerByCGLIB$ en el tipo de clase… por lo que el serializador no funcionará correctamente (serializará la parte del proxy).

Solución sencilla:

((HibernateProxy)OBJETO()).getHibernateLazyInitializer().getImplementation();

Prometo que encontrar esa línea me costo sudor y horas la primera vez que me pegué con ello.

El departamento de cosas variadas

Ver Comentarios

Posted on : 01-10-2009 | By : Carlos Cordero | In : Enlaces, Java

¿Alguna vez habéis intentado programar en tres lenguajes de programación a la vez? Estos días ando liado con Java, PHP y Javascript a la vez. Bueno, yo lo intento porque después de unas horas ya intento meter finallys a PHP y meter $ antes de las variables en Java… es lo que tiene.

Se nota que es jueves, y esto de levantarse todos los días a las 5.30 todavía cuesta, llevo bostezando sin parar una hora. Mañana viernes, por fin.

Buenas noches.

Servicios Web REST

Ver Comentarios

Posted on : 25-09-2009 | By : Carlos Cordero | In : Java, PHP, Software

Me encantan esos días en los que puedes dedicarte a investigar, el hecho de poder leer mucha documentación para encontrar la mejor solución a un problema, sin presiones, sin plazos de entrega…

Para ponernos en situación, tenemos una especie de modelo editorial donde se almacenan cantidades más ó menos importantes de datos, desarrollado en java con toda la pesca incluída: Spring, Hibernate y usando MySQL como BD. Meses atrás se hizo a toda prisa una aplicación web de consulta, en este caso en PHP. Si, se que alguno querrá arrancarse los ojos al leer esto pero: el código de PHP lanza querys directas contra la BD (es decir, se pasa el modelo de ORM de Hibernate por los santos)… que queréis, se hizo en día y medio, cosas de los plazos.

Por si alguno todavía no se ha dado cuenta, eso tiene un grave problema (dejando de lado que es una chapuza increíble) y es que requiere trasladar todos los cambios que se hagan en el modelo a nuestra aplicación PHP (y normalmente suele pasar que se olvida y falla en el peor momento). A la hora de cambiar esto, se podría optar por utilizar algún tipo de implementación PHP sobre JAVA tipo Quercus (que ya utilizamos en otra rama), pero viendo los dolores de cabeza que ha dado, prefería evitarlo…

¿Solución? Servicios Web. ¿SOAP? ¡Mucho lio! … Mejor solución: REST (Representational state transfer): una solución de arquitectura “parida” para las necesidades justas que tenemos, y en este caso, limitadas a peticiones GET y algún POST (quizás para las búsquedas…). Ya tenemos nuestra solución: servicios web REST que den una salida JSON. El motivo de dar una salida JSON es evidente: queremos que sea interpretado por PHP, el cual tiene las funciones específicas para ello, y de esa forma no nos limitamos a ninguna arquitectura (nunca se sabe…).

Ahora viene el lado servidor, tenemos que implementar los servicios web en JAVA y sobre todo, tenemos que mantener y aprovechar la arquitectura existente. Ah! Una última cosa… no podemos depender de un contenedor específico, por si acaso ;)

De nuevo, solución: JAX-RS, la solución más sencilla que nos aporta JAVA para montar servicios REST. En este caso hemos utilizado una implementación que se llama Jersey (que queréis que haga si le ponen esos nombres…). Utilizando maven se ha vuelto muy sencillo, unas dependencias por aquí, otras por allá, y todo ready! Aqui os dejo el “getting started” de Jersey, si miráis el código os quedaréis muy sorprendidos, al fin y al cabo utiliza POJOs.

 1    // The Java class will be hosted at the URI path "/helloworld"
 2    @Path("/helloworld")
 3    public class HelloWorldResource {
 4
 5        // The Java method will process HTTP GET requests
 6        @GET
 7        // The Java method will produce content identified by the MIME
 8        // type "text/plain"
 9        @Produces("text/plain")
10        public String getClichedMessage() {
11            // Return some cliched textual content
12            return "Hello World";
13        }
14    }

Admito que he estado un par de horas pegándome con un conflicto de versiones de dependencias que tenían jersey e hibernate, causados por la librería asm, cosa de tener ya un sistema montado por detrás. Ahora mismo no lo recuerdo exáctamente, pero creo que hibernate utilizaba la rama 1.x de asm y jersey la 2.x, algunos métodos han cambiado y… POUM! Las últimas versiones de hibernate ya no tienen esa dependencia así que sólo había que incluirla en el ignore de maven para hibernate y todo solucionado. ¿Veis? Si hubiese mirado los foros de hibernate antes… me hubiese evitado ese tiempo de pelea con el tomcat (si, lo he montado sobre un tomcat, aunque supongo que termine en un resin).

Si alguno monta un servicio con esto, ya me enviará la URL para probarlo (si es público claro ;) )

Log4J con MySQL – Log de aplicaciones en Base de Datos

Ver Comentarios

Posted on : 07-05-2009 | By : Carlos Cordero | In : Java, Software

Probablemente cualquier persona que habitualmente programe en Java conocerá el sistema Log4J, el sistema de log de eventos más utilizado en esta tecnología. Aunque este post no pretende ser ninguna introducción dado que estas ya existen, si quiero destacar el alto nivel de flexibilidad que ofrece el sistema, en especial en los ámbitos de “salida” (appender) de la información y en el “formato” (pattern) que se le da a la misma.

Personalmente me he encontrado en muchas ocasiones ante ficheros de log que eran muy difíciles de seguir… bueno, creo que ningún fichero con mucho contenido es fácil de “parsear” manualmente. De esta problemática llega el motivo del post, la necesidad de organizar la salida de forma que pueda ser fácilmente ordenada y fácilmente consultada a posteriori: esto es, una base de datos.

Log4J, gracias a su flexibilidad, permite incorporar una salida directa a una base de datos… por lo que matamos dos pájaros de un tiro: en una aplicación que ya utiliza Log4J, no tendremos que realizar ninguna modificación en el código, tán solo las siguientes líneas de código en el fichero de configuración (por ejemplo, log4j.properties).


log4j.rootCategory=INFO, FILE, BD


log4j.appender.BD=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.BD.URL=jdbc:mysql://localhost/base_de_datos
log4j.appender.BD.user=root
log4j.appender.BD.password=root
log4j.appender.BD.sql=INSERT INTO nombre_table (Fecha, Clase, Nivel, Mensaje) VALUES ('%d', '%c', '%p', '%m')

En este caso, estamos indicando que filtraremos a partir del nivel INFO (es decir, no se guardarán los TRACE ni DEBUG) y lo haremos en un appender FILE y en el apprender BD cuya configuración es muy sencilla, la misma que para cualquier conexión a una base de datos MySQL. Por supuesto podremos utilizar cualquier BD con soporte JDBC. La query SQL también puede ser modificada, en esta incluyo los parámetros habituales en columnas separadas.

En la documentación de Log4J se incluyen todos los parámetros que pueden ser incluídos.

Dedicaré un futuro post a hablar de como extender Log4J para incluir otras opciones además del propio mensaje, en mi caso en particular, poder grabajar en una columna separada el ID del elemento que daba el “warning”.

NewsML – XML para las noticias

Ver Comentarios

Posted on : 16-12-2008 | By : Carlos Cordero | In : Internet, Java, Software

No creo que sea un misterio que en la actualidad trabajo en un proyecto muy relacionado con el mundo del periodísmo por lo que día a día voy conociendo un poco más sus “tripas”.

Posiblemente una de las cosas que más me ha llamado la atención es el intercambio de información entre las agencias de noticias y sus clientes. Aunque no todas trabajan igual… sería facilitar demasiado el trabajo, si existen algunas normativas al respecto que se cumplen en mayor o menor medida: NITF y NewsML.

Especialmente me resulta curioso NewsML, todo un sistema de intercambio de información XML con un DTD muy bien definido y que permite incluir mucha información (texto, imagen, sonido, video, documental…). Facilita mucho la vida parsear esta clase de información y crear todos los contenedores de objetos; aunque no se cumpla al 100%, desde luego hay menos cosas a modificar que si cada agencia te envía su fichero de texto plano con su propio formato.

Por cierto, en mi caso lo estoy haciendo sobre Java y por si alguien quiere echarle un vistazo, Reuters publicó bajo open source una completa librería de parseo: http://newsml-toolkit.sourceforge.net/