Está en la página 1de 5

FileTransformerContext.

Trasvase de Datos entre Bases de Datos


FileTransformerContext es un pequeo programa en Java que permite transferir informacin entre dos bases de datos. Para ello utiliza Dia, Hibernate y transformaciones XML, de forma que no es necesario escribir ninguna lnea de cdigo.

Motivacin.
Una de las tareas que ms vienen repitindose en nuestro grupo de trabajo ha sido el trasbase de informacin entre diversas bases de datos que no residen en mismo servidor y que, adems, son de distintas tecnologas. En la mayora de las ocasiones la informacin a pasar era distinta tanto en contenido como en organizacin, as que, aunque eran pequeos desarrollos, eran nuevos y podan contener errores de programacin que haba que depurar. El objetivo fue el de obtener un cdigo que no hubiera que modificar y que slo configurndolo convenientemente, se adaptara a cada estructura de las bases de datos implicadas.

Ejemplo de aplicacin.
Acontinuacin se presenta un ejemplo sencillo para mostrar el funcionamiento del programa. Primero crearemos el diagrama que representa el trasvase de datos. En este diagrama simplificado se quiere enviar cierta informacin de una base de datos utilizando una transformacin para transformar dicha informacin y adecuarla a la estructura destino. Una vez, definidos los elementos la aplicacin genera los ficheros que el usuario deber rellenar convenientemente. En este caso, tendramos que escribir la definicin de la estructura de la base de datos origen, dbimport, la estructura de la base de datos destino, dbexport, y la plantilla de transformacin que convertir una estructura en otra. Para la definicin de la estructura de la base de datos utilizamos HIbernate que nos permite adems obtener la informacin en formato XML. Supongamos que la tabla origen define informes con los siguientes campos: id_informe, id_expediente, valoracion_numerica, evaluador; la definicin para hibernate de esta estructura de datos podra ser:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.criptolab.ejemplo"> <class name="informe" node="informe" table="informes"> <id column="id_informe" name="id_informe" type="integer" node="@id_informe"/> <property column="id_expediente" name="id_expediente" node="id_expediente" type="integer"/> <property column="valoracion_numerica" name="valoracion_numerica" node="valoracion_numerica" type="integer"/> <property column="evaluador" name="evaluador" node="evaluador" type="string"/> </class> </hibernate-mapping>

Y que la tabla destino tiene define los evaluadores de cada expediente y tiene los campos:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.criptolab.ejemplo"> <class name="expediente" node="expediente" table="expedientes"> <composite-id name="evaluadores"> <key-property column="evaluador" name="evaluador" node="@ctipcon" type="string"/> <key-property column="id_expediente" name="id_expediente" node="@id_expediente" type="integer"/> </composite-id> <property column="id_informe" name="id_informe" node="id_informe" type="integer"/> <property column="valoracion" name="valoracion" node="valoracion" type="integer"/> </class> </hibernate-mapping>

El XML correspondiente a un registro de la primera definicin podra ser algo as:


<informe @id_informe="101"> <id_expediente> 5432</id_expediente> <valoracion_numerica>5</valoracion_numerica> <evaluador>Pepito Grillo</evaluador> </informe>

Y el correspondiente al segundo podra ser:


<expediente> <evaluador>Pepito Grillo</evaluador> <id_expediente>5432</id_expediente> <id_informe>101</id_informe> <valoracion>5</valoracion> </expediente>

Es fcil comprobar que la transformacin que necesitamos podra ser la siguiente:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" indent="yes"/> <xsl:template match="/"> <expediente> <evaluador><xsl:value-of select="/informe/evaluador"/></evaluador> <id_expediente><xsl:value-of select="/informe/id_expediente"/></id_expediente> <id_informe><xsl:value-of select="/informe/@id_informe"/></id_informe> <valoracion><xsl:value-of select="/informe/valoracion_numerica"/></valoracion> </expediente> </xsl:template>

Elementos.
Los elementos que pueden ser utilizados en el grfico Dia de definicin de objetos son los siguientes:
Define un texto a importar en el contexto (por ejemplo, una query de base de datos). Define un fichero del sistema de archivos (path relativo o absoluto). Define un recurso java que se encontrar en el classpath en el que se ejecute la aplicacin. Importa un fichero o recurso en el contexto. Igual que el anterior pero indicando que se mantenga en la cach del programa para que sea ms rpido su acceso. Igual que el anterior, pero adems que se marque como XML para poder ser utilizado en las transformaciones XSLT. Importar desde una base de datos (hibernate+XML). Exportar a una base de datos (hiberante + XML).

Definicin de acceso a una base de datos mediante hibernate. Definicin de una clase definida mediante hibernate: recurso java donde residir dicha definicin XML de hibernate. Inyectar fichero desde un elemento hibernate. Igual que el anterior, pero indicando que se guarde en la cach del programa. Igual que el anterior, pero marcando que es un XML que se pueda utilizar en transformaciones XSLT. Transformacin XSLT. Transformacin XSLT, pero indicando que se guard en cach del programa. Igual que el anterior, pero indicando que el resultado es XML y puede utilizarse en transformaciones XSLT. Alternativa para elegir entre dos elementos del contexto. Secuencia de ejecucin u obtencin de elementos en el contexto. Bucle. Groovy script. Igual que el anterior, pero indicando que el resultado se guarde en la cach del programa. Igual que el anterior, pero indicando que el resultado es XML. Combinacin de correspondencia (una sola combinacin) para obtener como resultado un documento openoffice. Igual que el anterior, pero conviertindolo a Microsoft Word (necesita tener en ejecucin el programa open office). Igual que el anterior, pero convirtiendo a Adobe PDF (necesita tener en ejecucin el programa open office).

Distribucin.
Como ya se ha comentado, se trata de un programa Java (versin 1.6+) que utiliza los siguientes paquetes Java: Hibernate e Hibernate tools: http://www.hibernate.org . MailMerge: http://sourceforge.net/projects/mailmerge/ . Groovy: http://groovy.codehaus.org . Ostermillerutils: http://ostermiller.org/utils/ . JDBC de las bases de datos a las que se accede (postgres, oracle, etc.).

Tambin necesita que est instalado en el sistema el ant de apache: http://ant.apache.org . La instalacin contiene los siguientes programas: make4dia.bat: programa principal que analiza un grfico .dia con los elementos mencionados anteriormente, genera los archivos derivados del grfico que el usuario deber completar para que las transformaciones se realicen correctamente, y permite "alcanzar" el objeto que se le indique (no se trata de un diagrama de flujo con un inicio y un fin, sino que se asemeja a un makefile con las definiciones de cmo obtener cda objeto). makehbm.bat: permite obtener el cdigo fuente que se puede generar automticamente utilizando las Hibernate Tools, a partir de ficheros de definicin de datos hibernate

start_soffice.bat: permite lanzar el star office en modo servidor.

Ejemplos de uso.
A continuacin se muestran una serie de ejemplos de uso real en nuestro entorno de trabajo. Traspaso de informes de evaluacin entre dos aplicaciones. El sistema se compone de una base de datos central, que contiene toda la documentacin de los expedientes, y de una aplicacin de evaluacin de cierta informacin de cada uno de estos expedientes. En un proceso anterior, fuera del mbito del ejemplo, la aplicacin de evaluacin se carga con la informacin de los expedientes, y se realiza la asignacin y elaboracin de los informes de evaluacin de dicha documentacin. El proceso de trasvase de los informes de evaluacin haca la base de datos central se ejecuta peridicamente, de forma que recoge los ltimos informes cerrados y los lleva a la base datos central. El contenido del informe de evaluacin se almacena en la base de datos de la aplicacin de evaluacin en formato XML, y tambin su versin correspondiente en PDF, junto a otros campos de control (fecha de modificacin, evaluador, fecha de cierre, etc.). En la definicin hibernate del objeto informe de la base de datos origen, adems de los campos de control correspondientes, se incluye el fichero XML con el contenido del informe. En el grfico indicamos que queremos extraer este contenido e inyectarlo en el contexto con un objeto XML. En la transformacin se tomarn datos tanto de los campos de control del informe como del propio contenido del informe y se compondr un nuevo objeto hibernate que ser el que se vuelque a la base de datos (aunque no se muestra en la figura, en ese resultado tambin van includos el informe en su dos formatos XML y PDF para que sean volcados a un campo del registro de la base de datos destinataria. Generacin de notificaciones electrnicas.

En el siguiente ejemplo (tambin simplificado) se muestra un sencillo proceso de envo notificacines utilizando como destino un servicio WEB de notificaciones electrnicas. La comunicacin incluye dos documentos a enviar: una carta de presentacin y una ficha a rellenar. Ambos documentos se genern a partir de una combinacin de correspondencia de una plantilla en ODT con los datos del expediente correspondiente. Ya que el servicio WEB de notificaciones tiene una API especfica, en este caso s que ha habido que escribir un pequeo script groovy que utilice dicha API para la publicacin final. Este script recibe los dos documentos generados por la combinacin de correspondiencia, y tambin un XML que contiene la informacin necesaria para la notificacin y que procede del propio expediente: destinatario, correo electrnico, asunto de la notificacin, etc.