Aplicacion OXBPM, OpenXava con Bonita Open Solution

Este artículo contiene un enlace para a una aplicación de OpenXava diseñada para Integrar el BPM de Bonita Open Solution.
La aplicacion corre sobre Liferay 6.1 y Tomcat 7.0.
Este es el enlace:
http://200.29.153.50:8080/novedades
Pueden ingresar con los usarios siguientes:

Rol 1: Solicitante
usuario: demo1
clave: password

Rol 2: Coordinador
usuario: demo2
clave password

Los fuentes estan disponibles en la comunidad de bonitasoft, www.bonitasoft.org El enlace es: http://www.bonitasoft.org/exchange/extension_view.php?eid=93

Los invito a unirse y participar en la comunidad de Bonita Open Solution.
Bonita Open Solution es una solución potente e intuitiva para crear aplicaciones basadas en procesos
por un coste inmejorable. Totalmente opensource y con la calidad y funcionalidad de las aplicaciones comerciales.

En la demo tambien se incluye un Proceso Orden de Compra de Ejemplo que esta integrado con OXBPM antes señalado.

Fuentes de OXBP en Comunidad de Bonita: http://www.bonitasoft.org/exchange/extension_view.php?eid=93&rid=113#rev113

Detalles Tècnicos:

En cuanto al acceso a la API de Bonita Open Solution (BOS) desde nuestra aplicaciòn de Openxava es muy simple. En el programa OXBPM esto se lleva a cabo en la clase org.zzeus.ox.bpm.integration.runtime.facade.OXBPMModule.
En esta clase se centra toda la funcionalidad BPM del sistema. El truco básico es hacer un login programatico antes de acceder a cualquier método de la API de BOS.

Acá un fragmento de código de la clase:
public class OXBPMModule {
    // the api facades
    final RuntimeAPI runtimeAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getRuntimeAPI();
    final QueryRuntimeAPI queryRuntimeAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getQueryRuntimeAPI();
    final ManagementAPI managementAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getManagementAPI();
    final QueryDefinitionAPI queryDefinitionAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getQueryDefinitionAPI();
    final RepairAPI repairAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getRepairAPI();
    // the realm login to galssfish
    final ProgrammaticLogin programmaticLogin = new ProgrammaticLogin();
    public static final int BAR = 0;
    public static final int XPDL = 1;
    private String currentUserUID;
 
    public OXBPMModule(){
        OXConstants.loadConstants();
        User liferayUser;
        try {
            liferayUser = UserLocalServiceUtil.getUserById(new Long(Users.getCurrent()));
            this.currentUserUID=  liferayUser.getLogin();
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (PortalException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
 
    public OXBPMModule(String currentUserUID) {
        OXConstants.loadConstants();
        this.currentUserUID = currentUserUID;
    }
 
    public Set<ActivityDefinition> getProcessActivities(ProcessDefinitionUUID uuid) throws ProcessNotFoundException, VariableNotFoundException, Exception {
        programmaticLogin.login(currentUserUID, "", "processBaseRealm", false);
        return queryDefinitionAPI.getProcessActivities(uuid);
    }
 
    public Collection<OXTaskInstance> getTaskList(ActivityState state) throws Exception {
        Collection<OXTaskInstance> result = new TreeSet<OXTaskInstance>();
        programmaticLogin.login(currentUserUID, "", "processBaseRealm", false);
        Collection<TaskInstance> tasks =  queryRuntimeAPI.getTaskList(state);
        if (tasks != null)
        for (TaskInstance task : tasks){
            result.add(new OXTaskInstance(task));
 
 
        }
        return result;
    }
 
    public Set<ProcessInstance> getUserInstances() throws Exception {
        programmaticLogin.login(currentUserUID, "", "processBaseRealm", false);
        return queryRuntimeAPI.getUserInstances();
    }
}
Note el uso de la sentencia:
programmaticLogin.login(currentUserUID, "", "processBaseRealm", false);
antes de cada llamada a función o método de la API.
La API de BOS se configura en estas líneas de codigo:
    final RuntimeAPI runtimeAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getRuntimeAPI();
    final QueryRuntimeAPI queryRuntimeAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getQueryRuntimeAPI();
    final ManagementAPI managementAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getManagementAPI();
    final QueryDefinitionAPI queryDefinitionAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getQueryDefinitionAPI();
    final RepairAPI repairAPI = AccessorUtil.getAPIAccessor(OXConstants.BONITA_EJB_ENV).getRepairAPI();
De igual forma, el siguiente fragmento de código se utiliza para obtener y configurar en el sistema el Usuario de Liferay que actualmente ejecuta la aplicación:
  liferayUser = UserLocalServiceUtil.getUserById(new Long(Users.getCurrent()));
  this.currentUserUID=  liferayUser.getLogin();
Como vemos, no hay mayor dificultad en usar la API de BOS desde una aplicación de Openxava corriendo sobre Liferay.