#grails #activiti #shiro v0.1

Se publicó la primer versión del plugin de integración de Activiti con Apache Shiro para Grails, en esta versión:

* Implementada inicialización de IdentityService con GroupManager y UserManager
* Implementado servicio de enlace de nombre de usuario en sesion
* Prueba de integración con Grails-Activiti VacationRequest

la documentación actual y descarga del plugin se encuentran en bitbucket.

Grails: integración de Bpm

Hace unos cuatro años trabajé como consultor en un proyecto (grande) de implantación de un sistema de manejo de procesos de negocio para una entidad estatal centroamericana, en ese momento los motores de gestión de procesos libres no estaban maduros y mi comprensión del proyecto entero y de mi participación (como desarrollador de aplicaciones cliente integrables al motor) era muy oscura y (admitamoslo) lenta.

Sin embargo, gracias a ese proyecto conocí a muchas personas muy brillantes – incluso a un par que diseñaron e implementaron sus propias versiones de motores de gestión de procesos de negocios (tanto en Java como en .Net) – y empecé a hacerle seguimiento a los BPMS Libres.

Hace un año encontré que la versión de Bonita Open Solution 5 tenía un importantes mejoras y que la nueva versión de jBpm estaba a punto de salir, así que intenté (sin mucho éxito) iniciar un acercamiento a Bonita, incluso promoví la investigación al respecto en mi empresa y obtuvimos algunas victorias.

Ahora con Grails como framework principal y después de un laaargo año en un proyecto importante que hubiera sido mucho mas sencillo de manejar si se hubiera modelado como procesos estamos trabajando en la integración de un motor de procesos en nuestro producto.

Después de evaluar de nuevo los motores libres más populares (jBpm, Bonita y Activiti) nos decidimos por Activiti, no solo porque es una implementación basada con licencia Apache sino que además tiene un gran modelador e integración nativa con grails mediante el plugin desarrollado por Lim Chee Kin.

Un punto crucial de la integración se encuentra en la autenticación y autorización (mantener la sincronización de dos bases con los usuarios y roles es una violación flagrante del principio DRY) para lo cual Lim Chee Kin ha desarrollado un plugin que integra activiti con spring security en grails.

Hasta aquí todo perfecto, tenemos un excelente framework web, un motor Bpm libre y un framework de seguridad estable integrados, sin embargo…en nuestro proyecto usamos Shiro Security (principalmente porque tiene un manejo propio de sesiones que es agnóstico del tipo de tecnología en el que se use).

La buena noticia es que grails también tiene un plugin que hace la tarea de integración con shiro algo ultra sencillo, el problema es que no hay una forma obvia (aka plugin) o documentada de integrar shiro con activiti en grails.

Entonces…para eso..he trabajado en un plugin de integración entre Activiti y Shiro sobre grails (1.3.7) basado en el plugin de Lim Chee Kin, solo inicializa el identityService de activiti con los SecurityUtils de shiro, la forma (primitiva y no recomendada) de probarlo es a través de la aplicación de ejemplo VacationRequest del plugin de Activiti para grails (sin usar la integración con spring security).

Por ahora el plugin y la documentación (tbd) de la versión 0.1 están alojados en bitbucket (larga vida a Mercurial), en un futuro cercano espero que se publique en el repositorio central de grails (actualmente están haciendo mantenimiento al sitio de codehaus y no se puede hacer registro de nuevos usuarios).

Grails: cargar datos de prueba

Al trabajar con pruebas unitarias o de integración siempre es necesario generar conjuntos de datos de pruebas, en Java por lo general se delega esta tarea a DBUnit o DBUnit / Spring –algunos se quejan de lo engorroso que puede llegar a ser el setup de las herramientas y hacen versiones propias en Scala!!!- pero la mayoría nos apegamos al libreto.

Sin embargo, desde que trabajaba con cakePHP 1.2 (lo sé, lo sé pero todos tenemos un pasado…) y aún con DBUnit / Spring me parecía ultra engorroso generar el grafo del modelo de dominio para hacer algunas pruebas unitarias….hasta que…conocí a grails.

En grails es posible usar dos plugins que evitan gran parte del trabajo (viva la flojera!): Fixtures y Build-test-data que permiten generar instancias validas de modelos de dominio reutilizables y desacoplados.

Build test data genera el grafo de datos de un objeto del modelo de dominio para que cumpla con todas las validaciones, permitiendo sobreescribir los valores de los atributos deseados, Fixtures permite generar instancias de modelos de dominio de forma sencilla inline o desde archivo usando un DSL que ahorra las operaciones de persistencia.

Solo un tip – que quizá no queda claro en la documentación – la forma de cargar un archivo con instancias de modelo de dominio válidas (es decir, llamar desde Fixtures a Build-test-data), en el archivo fixtures/modelos.groovy:

import com.MiDominio

build {
    instancia(MiDominio, nombre:"Atributo con valor definido de forma personalizada")
}

es fácil ver (jejeje me encanta la jerga de cálculo diferencial) que no usamos fixture {} sino build {}, luego en el test case:

@TestFor(MiDominio)
class MiDominioTests {
	
	def fixtureLoader
	
    void testDownloadAnnouncements() {
		def fixture = fixtureLoader.load("modelos")
		assertThat "Modelos loaded", fixture.instancia, notNullValue()
		
    }
}

Addendum: Si configuran grails 1.3.x o usan 2.0 con H2, recuerden mantener la configuración pooled = true a pesar de lo que diga la documentación del plugin.