« Nazad

Asignaciones ( swimlane ) avanzadas para workflows JBPM de Alfresco

 En los flujos de trabajo avanzados de Alfresco utilizamos el elemento swimlane para asignar tareas a un usuario o grupo de usuarios de Alfresco. 

En concreto, en el fichero que describe el flujo de trabajo (el JPDL que tenemos en la carpeta de extensión, tienes un ejemplo de este tipo de fichero en la carpeta de extensión llamado 'lifecycle_processdefinition.xml') nos encontraremos definidos nuestros roles lógicos de la siguiente manera : 

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="tekuento:flujoValidacionDocumento">
    <!-- Rol logico que identifica a la persona que ha iniciado el flujo -->
    <!-- Siempre debe aparecer y su nombre no puede cambiar! -->
    <swimlane name="initiator"></swimlane>

    <!-- Un ejemplo de rol logico que se mapea a un usuario de Alfresco -->
    <swimlane name="responsableValidacion">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
             <actor>admin</actor>
        </assignment>
   </swimlane>

    <!-- Un ejemplo de rol logico que se mapea a un grupo de usuarios de Alfresco -->

    <swimlane name="responsablesValidaciones">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
             <pooledactors>GROUP_validadores-documentos</pooledactors>
    </assignment>

    <!-- ...... declaracion de nuestras tareas --->

 

</process-definition>

Salta a la luz que los elementos swimlane tienen como elemento hijo a assignment salvo en el caso del rol lógico initiator que es un caso especial. El elemento assignment es el encargado de identificar cual es el "asignador" que se encarga de hacer el mapeo del rol lógico a un grupo o usuario de Alfresco. Es decir, los roles lógicos que declaramos en el fichero JPDL se tienen que mapear y alguien debe encargarse de hacerlo. En la mayoría de los casos, ese alguien es la clase "org.alfresco.repo.workflow.jbpm.AlfrescoAssignment" que toma el papel de asignador. Esta clase ya está implementada en el módulo de gestión documental de Alfresco y, como hemos dicho anteriormente, está preparada para trabajar con los subelementos 'pooledactors' para identificar grupos de usuarios y 'actor' para identificar usuarios individuales.

El problema

Imagina que necesitas que un rol lógico se mapee el 50% de las veces al usuario "Luis" y el 50% de las veces al usuario "Macarena". En este caso es evidente que el asignador "org.alfresco.repo.workflow.jbpm.AlfrescoAssignment" no nos sirve porque sólo nos permite identificarle un único usuario a través del elemento 'actor'. Por tanto necesitaremos implementar nuestro propio asignador que incorpore la regla probabilística que hemos mencionado antes.

Creando un nuevo asignador : org.alfresco.repo.workflow.jbpm.JBPMSpringAssignmentHandler

La clase abstracta org.alfresco.repo.workflow.jbpm.JBPMSpringAssignmentHandler nos permite crear nuevos asignadores con acceso a los beans de Spring con los servicios de Alfresco disponibles. 

A través de nuestro Alfresco SDK vamos a crear un nuevo proyecto en Eclipse y pondremos como dependencia en el Build Path el proyecto SDK AlfrescoEmbedded. A partir de ese momento tendremos disponible la superclase abstracta JBPMSpringAssignmentHandler.

Esta clase declara un método de inicialización que nos permite acceder a la factoría de beans de Spring a través de la cual obtendremos todos los servicios que sean necesarios para implementar nuestro asignador. El método de inicialización es el siguiente:

 

initialiseHandler

 

protected abstract void initialiseHandler(org.springframework.beans.factory.BeanFactory factory)

 

Initialise Action Handler

 

 
Parameters:
factory - Spring bean factory for accessing Alfresco beans

 

Además, la clase realiza la interfaz org.jbpm.taskmgmt.def.AssignmentHandler de JBPM. Esta interfaz declara un método assign que es el que decide cómo se asigna una tarea a un usuario o grupo de usuarios. En este método es donde tendremos que añadir nuestra lógica de negocio para conseguir que el 50% de las veces se le asigne a un usuario y el 50% de las veces restante al otro usuario. La signatura del método es la siguiente : 

 

assign

void assign(Assignable assignable,
            ExecutionContext executionContext)
            throws java.lang.Exception
assigns the assignable (=TaskInstance or a SwimlaneInstance to an swimlaneActorId or a set of PooledActors.

The swimlaneActorId is the user that is responsible for the given task or swimlane. The pooledActors represents a pool of actors to which the task or swimlane is offered. Any actors from the pool can then take a TaskInstance by calling TaskInstance.setActorId(String).

 

 
Throws:
java.lang.Exception

 

 

La solución : ProbabilidadAssignmentHandler.java

package es.tekuento.alfresco.jbpm;
import org.alfresco.repo.workflow.jbpm.JBPMSpringAssignmentHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.exe.Assignable;
import org.springframework.beans.factory.BeanFactory;
 public class ProbabilidadAssignmentHandler extends JBPMSpringAssignmentHandler {

 private static final long serialVersionUID = 1025557849552531571L;

 protected void initialiseHandler(BeanFactory arg0) {
 // En este ejemplo tan sencillo no es necesario inicializar nada
 }

 public void assign(Assignable instanciaAsignable, ExecutionContext contextoEjecucion) throws Exception {
    if(Math.random()>0.5){
       instanciaAsignable.setActorId("Luis");
    }else {
       instanciaAsignable.setActorId("Macarena");
    }
 }

}

 

Una vez creada y compilada esta clase generaremos un fichero .JAR desde Eclipse (segundo botón del ratón sobre el proyecto --> Export --> Java --> JAR File ) y lo copiaremos en la carpeta de librerias de nuestro Alfresco : <ALFRESCO-WEBAPPs>/WEB-INF/lib . De este modo el nuevo asignador ya estará listo y podremos usarlo en nuestros ficheros JPDL, de tal manera que ahora nuestro XML será como sigue...
 
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="tekuento:flujoValidacionDocumento">

    <!-- Rol logico que identifica a la persona que ha iniciado el flujo -->
    <!-- Siempre debe aparecer y su nombre no puede cambiar! -->
    <swimlane name="initiator"></swimlane>

    <!-- Un ejemplo de rol logico que se mapea a traves de nuestro asignador personalizado -->
    <!-- ATENCION : No olvides poner el .JAR en la carpeta de librerias ya que sino obtendras
         un error ClassNotFoundException -->
    <swimlane name="responsableValidacionConProbabilidad">
        <assignment class="es.tekuento.alfresco.jbpm.ProbabilidadAssignmentHandler" />
     </swimlane>

    <!-- ...... declaracion de nuestras tareas --->

 
</process-definition> 
 
 
 Nada más, espero que os haya gustado descubrir este punto de extensión de Alfresco. ¡Saludos!

Descarga del ejemplo

Te facilitamos un ejemplo con un flujo de trabajo avanzado funcionando con el asignador estudiado. Se llama ProbabilidadAssignmentHandler.zip y puedes descargarlo en el enlace que aparece justo abajo de este texto.

Komentar
URL za praćenje:

comments powered by Disqus