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.
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/installation/install-bos-bundles/install-bos-tomcat-bundle
http://documentation.bonitasoft.com/5x/bos-59/system-administration/installation/configure-bos-rest/bos-rest-tomcat
PROYECTO JAVA
Agregar las dependencias del bonita-client
Con Maven
org.ow2.bonita
bonita-client
5.10.2
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
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.(StandardQueryAPIAccessorImpl.java:27)
org.ow2.bonita.facade.impl.StandardAPIAccessorImpl.(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)
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();
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
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”;
};
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)?
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 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
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
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");
- Finalmente, como la tarea que necesitaba era arrancar un proceso desplegado pasándole una variable, seguí los ejemplos de la documentación oficial:
http://documentation.bonitasoft.com/5x/bos-59/development/bonita-execution-engine/cookbook-usecases
// 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 mapData = new HashMap();
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!