Usar Bonita Engine desde aplicación web JAVA

1
0
-1

Buenos días,

Llevo tiempo trabajando con Bonita, y he conseguido hacer bastantes cosas, pero ahora requiero hacer algo que no acabo de conseguir.

Antes que nada decir que estoy usando Bonita en su versión 5.10.

He desarrollado una aplicación web en JAVA, que no es más que un formulario web donde los usuarios cumplimentaran una serie de datos. Una vez estos datos se guardan en una base de datos, quiero conectar con el motor de bonita, para arrancar un proceso que también tengo definido pasándole un par de variables desde la aplicación.

He estado leyendo varios enlaces, y he visto información sobre las APIS de Bonita, pero no acabo de saber enfocar este tema.

¿Alguien que haya hecho algo similar podría guiarme?

Muchas gracias de antemano.

2 answers

1
+1
-1
This one is the BEST answer!

Alberto,

Intento resumir todos los pasos en esta respuesta, y los pasos a llevar a cabo: SERVIDOR

Instalar BOS + REST http://documentation.bonitasoft.com/5x/bos-59/system-administration/inst... http://documentation.bonitasoft.com/5x/bos-59/system-administration/inst...

PROYECTO JAVA

Agregar las dependencias del bonita-client Con Maven

<dependency>
                        <groupId>org.ow2.bonita</groupId>
                        <artifactId>bonita-client</artifactId>
                        <version>5.10.2</version>
                </dependency>

Configurar JAAS Definir un fichero jaas.cfg (En mi caso está en la raiz del proyecto) y agregar las siguiente lineas:

BonitaAuth {
  org.ow2.bonita.identity.auth.BonitaIdentityLoginModule required;
};
BonitaStore {
  org.ow2.bonita.identity.auth.BonitaRESTLoginModule required restUser="restuser" restPassword="restbpm";
};

Código

                // Define the location of the JAAS configuration file
                System.setProperty(BonitaConstants.JAAS_PROPERTY, jaas.cfg);

                // Type of API to use
                System.setProperty(BonitaConstants.API_TYPE_PROPERTY, org.ow2.bonita.facade.Context.REST.toString());

                // REST web application URL
                System.setProperty(BonitaConstants.REST_SERVER_ADDRESS_PROPERTY, "http://localhost/bonita-server-rest");

                // Verification of username and password using BonitaAuth login context
                // If the login operation failed (incorrect username and/or password, it will raise an exception and program
                // execution will be aborted
                // This operation is optional.
                LoginContext bonitaAuth = new LoginContext("BonitaAuth", new SimpleCallbackHandler("admin", "bpm"));
                bonitaAuth.login();            
                bonitaAuth.logout();

                // Use the BonitaStore to share with the BEE the username of the user performing the APIs calls
                LoginContext bonitaStore = new LoginContext("BonitaStore", new SimpleCallbackHandler("admin", "doesn't matter"));
                bonitaStore.login();

/* AQUI IRIA LAS LLAMADAS AL API QUE SE QUIERAN EJECUTAR */
                bonitaStore.logout();

Espero que te sirva.

Un saludo

Comments

Submitted by aperher on Thu, 10/30/2014 - 12:19

Nuevamente mil gracias por tu dedicación Pablo,

Como apunte comentarte que no estoy usando Maven en el proyecto, pero he agregado manualmente la librería bonita-client-5.10.

Ya estoy cogiendo correctamente el jaas.cfg, pero cuando intento hacer

bonitaAuth.login();

, obtengo el siguiente error:

java.lang.NoClassDefFoundError: org/apache/http/conn/ClientConnectionManager

He agregado la librería httpclient-4.0-alpha4 porque creo que es la relacionada con este problema, pero sigo con el mismo error.

Viendo que esta autenticación era opcional, probé a comentar esas dos líneas y continuar. La autenticación

bonitaStore.login();

no causa ninguna excepción, con lo cual he intentado hacer una llamada a la API para probarla, buscando listar los procesos que tengo desplegados:

       StringBuilder sb = new StringBuilder();
        QueryDefinitionAPI queryDefinitionAPI = AccessorUtil.getQueryDefinitionAPI();
        Set<ProcessDefinition> setProcess = queryDefinitionAPI.getProcesses();
        sb.append("List of processes : \n");
// Browse the process definition list.
        for (ProcessDefinition p : setProcess) {
            sb.append(p.getUUID());
            sb.append("\n");
        }

Al llegar a la línea

QueryDefinitionAPI queryDefinitionAPI = AccessorUtil.getQueryDefinitionAPI();

recibo un error similar al anterior:

java.lang.NoClassDefFoundError: org/jboss/resteasy/client/ClientExecutor

Nuevamente he agregado la librería que creo que necesito (resteasy-client-3.0.8.Final), pero el error persiste.

Muchas gracias

Submitted by Pablo Alonso de... on Thu, 10/30/2014 - 15:11

Alberto,

Bonita Client tiene una serie de dependencias que debes agregar, puesto que no usas maven, en este link puedes ver cuales son, descargarlas y agregarlas al proyecto http://mvnrepository.com/artifact/org.ow2.bonita/bonita-client/5.10

Un saludo

Submitted by aperher on Thu, 10/30/2014 - 17:27

Tras un par de ajustes sencillos... por fin lo he conseguido!

Paso a explicar los ajustes por si a alguien le fuera de ayuda en algún momento:

  • Viendo que la librería Bonita Client tenía bastantes dependencias, y a su vez estas dependencias algunas más, decidí reconfigurar mi proyecto Java para emplear Maven, ya que éste gestiona automáticamente y de una forma cómoda y transparente las dependencias.

  • Tuve que ajustar la dirección de la API Rest incluyendo el puerto:

System.setProperty(BonitaConstants.REST_SERVER_ADDRESS_PROPERTY, "http://localhost:9090/bonita-server-rest");
 // Get process definition
        ProcessDefinition processDefinition = null;
        QueryDefinitionAPI queryDefinitionAPI = AccessorUtil.getQueryDefinitionAPI();
        processDefinition = queryDefinitionAPI.getProcess("MiProceso5", "1.0");
        // Initialize process variables - key = name of process variable.
        Map<String, Object> mapData = new HashMap<String, Object>();
        mapData.put("codigoNotificacion", notificacion.getCodigoNotificacion());
        // Start process
        RuntimeAPI runtimeAPI = AccessorUtil.getRuntimeAPI();
        ProcessInstanceUUID processInstanceUUID = runtimeAPI.instantiateProcess(processDefinition.getUUID(), mapData);

Con todo esto he conseguido lo que necesitaba.

Espero que esto pueda ayudar a otros, y agradecerte de nuevo tu ayuda Pablo. Has sido muy amable!

1
0
-1

Aperher,

Echa un vistazo a los siguientes links... http://documentation.bonitasoft.com/5x/bos-59/development/bonita-executi...

http://documentation.bonitasoft.com/javadoc/bpm_engine/5.10/org/ow2/boni...(org.ow2.bonita.facade.uuid.ProcessDefinitionUUID, java.util.Map)

Un saludo

Comments

Submitted by aperher on Wed, 10/29/2014 - 13:11

Gracias por la respuesta Pablo.

Ya he mirado toda esa documentación, peor aún no logro hacer lo que necesito.

He añadido "bonita-client-5.10.jar" a mi proyecto, y este es el código con el que intento loguearme en el bonita engine:

final ManagementAPI managementAPI = AccessorUtil.getManagementAPI();
final RuntimeAPI runtimeAPI = AccessorUtil.getRuntimeAPI();
final QueryRuntimeAPI queryRuntimeAPI = AccessorUtil.getQueryRuntimeAPI();
 
final LoginContext loginContext = new LoginContext("Bonita", new SimpleCallbackHandler("admin", "xxxxxx"));
loginContext.login();

Pero en la primera de estas líneas, me da el siguiente error:

org.ow2.bonita.util.BonitaRuntimeException: org.ow2.bonita.facade.exception.BonitaInternalException: Bonita Error: baa_SIAPIAF_1
No mapping file "org.ow2.bonita.api.implementations" found.
org.ow2.bonita.facade.impl.LocalAPIAccessorFactory.getObject(LocalAPIAccessorFactory.java:79)
org.ow2.bonita.facade.impl.LocalAPIAccessorFactory.getStandardServerQueryAPIAccessor(LocalAPIAccessorFactory.java:88)
org.ow2.bonita.facade.impl.StandardQueryAPIAccessorImpl.<init>(StandardQueryAPIAccessorImpl.java:27)
org.ow2.bonita.facade.impl.StandardAPIAccessorImpl.<init>(StandardAPIAccessorImpl.java:26)
org.ow2.bonita.util.AccessorUtil.getAPIAccessor(AccessorUtil.java:155)
org.ow2.bonita.util.AccessorUtil.getAPIAccessor(AccessorUtil.java:165)
org.ow2.bonita.util.AccessorUtil.getQueryDefinitionAPI(AccessorUtil.java:230)
com.bintertechnic.sms.controllers.RegistroController.arrancarProceso(RegistroController.java:404)
com.bintertechnic.sms.controllers.RegistroController.doPost(RegistroController.java:148)
javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Submitted by Pablo Alonso de... on Wed, 10/29/2014 - 13:26

Aperher,

Tienes que configurar el acceso al api [Mismo Classloader, REST, EJB] y definir el fichero jaas

// Define the location of the JAAS configuration file
                System.setProperty(BonitaConstants.JAAS_PROPERTY, JASS_FILE_PATH);

                // Type of API to use
                System.setProperty(BonitaConstants.API_TYPE_PROPERTY, org.ow2.bonita.facade.Context.REST.toString());

                // REST web application URL
                System.setProperty(BonitaConstants.REST_SERVER_ADDRESS_PROPERTY, BONITA_REST_SERVER_URL);

                // Verification of username and password using BonitaAuth login context
                // If the login operation failed (incorrect username and/or password, it will raise an exception and program
                // execution will be aborted
                // This operation is optional.
                LoginContext bonitaAuth = new LoginContext("BonitaAuth", new SimpleCallbackHandler("admin", "bpm"));
                bonitaAuth.login();            
                bonitaAuth.logout();

                // Use the BonitaStore to share with the BEE the username of the user performing the APIs calls
                LoginContext bonitaStore = new LoginContext("BonitaStore", new SimpleCallbackHandler("admin", "doesn't matter"));
                bonitaStore.login();
Submitted by aperher on Wed, 10/29/2014 - 13:36

Nunca he hecho este tipo de conexiones con API por lo que estoy bastante perdido disculpa.

Yo estoy desarrollando mi aplicación java en el mismo entorno donde tengo el Bonita Studio. Por lo que he leido, si esto es así no se requiere EJB. Además, al tratarse de una aplicación Java, tampoco requiero de la API Rest. Con lo que ese ejemplo no me serviría verdad?

El tema del fichero jaas como va?

Mil gracias

Submitted by aperher on Wed, 10/29/2014 - 14:19

Vale, he empezado de 0 con estos enlaces. Y he modificado uno de esos ejemplos de esta manera:

        System.setProperty(BonitaConstants.API_TYPE_PROPERTY, "EJB3");
        System.setProperty(BonitaConstants.INITIAL_CONTEXT_FACTORY_PROPERTY, "org.jnp.interfaces.NamingContextFactory");
        System.setProperty(BonitaConstants.PROVIDER_URL_PROPERTY, "jnp://127.0.0.1:1099");
        System.setProperty(BonitaConstants.JAAS_PROPERTY, "C:\\BOS-5.10.1\\studio\\workspace\\bonita\\external\\security\\jaas-standard.cfg");
        System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        System.setProperty("java.naming.provider.url", "jnp://localhost:1099");
        LoginContext loginContext = new LoginContext("BonitaStore", new SimpleCallbackHandler("admin","bpm"));
        loginContext.login();

Pero al llegar a la parte del logueo, obtengo la siguiente excepción:

No se han configurado LoginModules para BonitaStore

El fichero jaas-standard.cfg tiene el siguiente contenido:

BonitaAuth {
  org.ow2.bonita.identity.auth.BonitaIdentityLoginModule required;
};

BonitaStore {
  org.ow2.bonita.identity.auth.LocalStorageLoginModule required;
};

BonitaAuth-default {
  org.ow2.bonita.identity.auth.BonitaIdentityLoginModule required domain="default";
  org.ow2.bonita.identity.auth.LocalStorageLoginModule required domain="default";
};

BonitaStore-default {
  org.ow2.bonita.identity.auth.LocalStorageLoginModule required domain="default";
};

/**
 * Used by the REST server
 */

BonitaRESTServer {
  org.ow2.bonita.identity.auth.BonitaRESTServerLoginModule required logins="restuser" passwords="restbpm" roles="restuser";
};
Submitted by Pablo Alonso de... on Wed, 10/29/2014 - 14:32

Para empezar yo lo haria con el acceso a REST... Mira este otro link para ver como habilitar el acceso http://community.bonitasoft.com/groups/usage-operation-5x/learn-how-depl...

Submitted by aperher on Wed, 10/29/2014 - 15:43

He exportado la API REST, pero no se donde tengo que colocar los archivos. Tengo una instalación en local de Bonita Studio, ¿dónde deberían estar el JBoss Home (/BOS-5.10-JBoss-5.1.0.GA)?

Notifications