lunes, 26 de enero de 2015

Smooks framework y WSO2 ESB. I

introduction1

El framework Smooks es considerado una herramienta poderosa para el procesamiento, la manipulación y la transformación de datos entre distintos formatos, ya sea XML o no XML. Y posee una documentación que a través de ejemplos nos permite asimilarlo muy facilmente.

El WSO2 ESB posee un mediador que nos permite hacer uso de este framework en los servicios proxy con lo cual podemos muy facilmente llevar datos de un formato a otro, como veremos en esta entrada.

Para ilustrar el uso de este framework primero mostraremos en esta entrada como desarrollar una transformación sencilla haciendo uso del Developer Studio, y en una segunda entrada veremos como mejorar un servicio proxy haciendo uso del mediador smooks.
Comenzaremos asumiendo que tenemos la necesidad de transformar de un formato XML generado por una “Aplicación A1” al formato que usa una “Aplicación A2”.

Formato de una orden para la “Aplicación A1”
<order id='001'>  
    <header>  
        <customer number="002">Jorge</customer>  
    </header>  
    <order-items>  
        <order-item id='1'>  
            <product>2</product>  
            <quantity>2</quantity>  
            <price>100</price>  
        </order-item>  
    </order-items>  
</order>

Formato de una orden para la “Aplicación A2”
<salesorder>  
   <details>  
     <orderid></orderid>  
     <customer>  
 <id></id>  
 <name></name>  
     </customer>  
   </details>  
   <itemList>  
     <item>  
 <id></id>  
 <productId></productId>  
 <quantity></quantity>  
 <price></price>  
     </item>  
   </itemList>  
</salesorder>  

Lo que se quiere hacer entonces es que ambos sistemas puedan integrarse entre sí con una afectación mínima en su utilización. Como ven aquí hay que usar el patrón de Transformación de mensajes.

Para esto hay varias soluciones:

  1. Modificar el primer sistema para que emita las órdenes en el formato del segundo sistema. Esto tiene la complicación de que estaríamos atando un sistema al otro lo que no es una buena práctica a seguir.
  2. Modificar el sistema 2 para que acepte las órdenes en el formado del sistema 1 y las modifique si es necesario. El problema con este enfoque es que si el sistema 1 cambia su forma de emitir las órdenes entonces el sistema 2 tendrá que ser modificado. Y todos sabemos que modificar un sistema significa sacarlo de producción, nuevas implementaciones, pruebas para comprobar que los cambios no afectaron otras partes del sistema, etc.
  3. Crear un mecanismo, como se expone en el patrón de transformación, que intercepte el mensaje del sistema 1 y lo modifique al formato del sistema 2. De esta manera ninguno de los dos sistemas se verían afectados por el cambio en el otro sistema. La complicación que tiene este enfoque es con el rendimiento y la potencial creación de cuellos de botella en el mecanismo de transformación, pero nada en la vida es perfecto.

En esta entrada nos vamos por el punto 3.

Como había dicho más arriba, Smooks es un framework de JBoss que pertenece a REDHAT Enterprise y este framework puede ser usado para:
  1. Transformaciones: XML/CSV/EDI/Java/JSON a XML/CSV/EDI/Java/JSON.
  2. Java Binding: convertir en un objeto Java cualquier información que provenga de una fuente de datos (CSV, EDI, XML, Java, JSON etc).
  3. Procesamiento de grandes mensajes: con este framework se pueden implementar los mensajes de Separación, Transformación y ruteo de fragmentos de mensajes a distintos destinos tales como JMS, Sistema de archivos, Bases de datos, etc.
  4. Enriquecimiento de mensajes: también con este framework podemos enriquecer los mensajes tal y como planteamos en el patrón Enriquecedor de Contenidos extrayendo la información necesaria de bases de datos o de otras fuentes de datos.
  5. Persistencia de mensajes usando ORM(Mapeo Objeto Relacional): permite el uso de frameworks de persistencia de entidades como Hibernate o cualquier framework compatible con JPA para acceder a la BD y ejecutar operaciones CRUD para leer o escribir.
  6. Combinar: Realiza operaciones ETL (Extract/Transform/Load)

La suite de WSO2 incluye este framework para ser usado dentro del ESB como un mediador y eso es lo que veremos a continuación.

Usando la versión 3.7.1 del WSO2 Developer Studio vamos a crear un entrada local que contendrá la funcionalidad para realizar la transformación requerida.

Paso 1: Crear un “Registry Resource Project”.

crear_proyecto_registry

Paso 2: Crear un “Registry Resource”.

Para hacer este paso damos clic derecho encima del proyecto recién creado, seleccionamos “New”  y luego “Registry Resource”.

crear_registry_resource

Manteniendo la opción seleccionada damos click en ”Next” y en la sección de Template seleccionamos “Smooks Configuration” tal y como se muestra a continuación.

smooks_resource

Damos clic en “Finish” y ya estamos listos para definir nuestra transformación.

Paso 3: desarrollar la transformación.

Ahora demos abrir el fichero “smooks_order_transformation.xml” dando doble click encima del mismo y luego damos click encima de la flecha azul. Veremos lo siguiente:

fichero_smooks

Ahora creamos una carpeta dentro del proyecto y añadimos los xml que usamos al inicio para definir los formatos de entrada y salida.

De esta manera en la sección de “Input Data” adicionamos el fichero input.xml con el contenido del mensaje de entrada, así que podremos ver su formato en pantalla.

input

Ahora podemos dar clic derecho encima de la flecha azul que nos marca la tarea de entrada y seleccionamos “Add Task” y luego “Apply Template”, ahí mantenemos el tipo de mensaje como XML y damos clic en “Next”. En la última pantalla seleccionamos el formato de salida y especificamos el XML de salida a utilizar.

salida

Damos click en finish y veremos lo siguiente:

T1

Lo que viene a continuación es desplegar los distintos elementos y conectar los que deben ser mapeados tal y como mostramos a continuación.

T2

Ahora lo que queda es probar, para ello podemos ir al fichero “smooks_order_transformation.xml” y damos click derecho, seleccionando la opción “Run As” y luego la opción 2. Ahí veremos el siguiente error:

error

 La causa es que no hemos incluido las librerías del framework en el proyecto. Para hacerlo basta ir a la librería de WSO2 y marcar todos los jar de la pestaña de Smooks y eso es todo. Volvemos a probar y vemos el resultado:

resultado

No tengan en cuenta el error mostrado al final pues no afecta el resultado ni su uso dentro del WSO2 ESB.

De esta manera concluímos esta primera parte dejando para la segunda el cómo usar la transformación de smooks dentro del WSO2 ESB.

Enlaces de interés:


 

1 comentario: