- Im Gym auf dem ergometer, Mails lesen und hier schreiben. Schöne neue Welt oder so. ->
Tags: fitness, gym, mail, sport
Nachfolgender Artikel dreht sich um die Installation von Bonita Open Solution. Einer Business Process Modeling (BPM) Software, mit der man einen Geschäfts-Prozess grafisch entwickeln (zusammenklicken
), mittels Java/Groovy erweitern und auf einem Application-Server deployen kann.
Da ich mir die Informationen für meine Installations-Konstellation (Ubuntu, Tomcat 6, MySQL, Active Directory/OpenLdap) von Hand zusammensuchen musste, hier eine Installationsanleitung für Bonita 5.4 bis Bonita 5.6 (hierbei kam nur xcmis als Dokumentenmanager dazu).
apt-get install tomcat6
(vorher sicherstellen, dass sun-java installiert ist. Mit open-java kommt es an unterschiedlichen Stellen zu merkwürdigen fehlern.
- Copy
\web\bonita.war to \webapps - Create a folder
\lib\bonita - Copy all *.jar files from
\web\lib\ to \lib\bonita. - Go to
\conf and copy the bonita and external folders to - Modify
\conf\catalina.properties to add ,${catalina.base}/lib/bonita/*.jarto the property common.loader to get
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.base}/lib/bonita/*.jar- Create a setenv.bat (Windows) or setenv.sh (Linux) file in
\bin. Example setenv.sh:
#!/bin/bash BONITA_HOME="-DBONITA_HOME=$CATALINA_BASE/bonita" #BONITA_OPTS="-Dorg.ow2.bonita.environment=/var/lib/tomcat6/bonita/server/default/conf/bonita-server.xml" LOG_OPTS="-Djava.util.logging.config.file=$CATALINA_BASE/external/logging/logging.properties" SECURITY_OPTS="-Djava.security.auth.login.config=$CATALINA_BASE/external/security/jaas-standard.cfg" MEMORY_OPTS="-Xshare:auto -Xms512m -Xmx1024m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError" # folgendes nur mit XCMIS, ab Bonita 5.6 CMIS_CONFIG="-Dexo.data.dir=$CATALINA_BASE/external/xcmis/ext-exo-data -Dorg.exoplatform.container.standalone.config=$CATALINA_BASE/external/xcmis/ext-exo-conf/exo-configuration-mysql.xml" #CATALINA_BASE="/var/lib/tomcat6" export CATALINA_OPTS="$JAVA_OPTS $LOG_OPTS $SECURITY_OPTS $BONITA_HOME $MEMORY_OPTS $CMIS_CONFIG"
hibernate.dialect org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.connection.shutdown true
bonita.hibernate.interceptor org.ow2.bonita.env.interceptor.MySQLDescNullFirstInterceptor# The following properties must be commented out for deployment using datasource (e.g. when using bundles provided by BonitaSoft)
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://localhost:3306/bonita_history?dontTrackOpenResources=true
hibernate.connection.username bonita
hibernate.connection.password bpm
Da Hibernate standardmäßig eine Datenbankverbindung nicht wieder aufbaut, sobald MySQL sie dicht gemacht hat, muß mittels connection pooling der Wiederaufbau der Verbindung sichergestellt werden, sonst gibt es hässliche Fehlermeldungen.
hibernate.hbm2ddl.auto update
hibernate.cache.use_second_level_cache false
hibernate.cache.use_query_cache false
hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
hibernate.show_sql false
hibernate.format_sql false
hibernate.use_sql_comments false
hibernate.c3p0.min_size 5
hibernate.c3p0.max_size 20
hibernate.c3p0.timeout 1800
hibernate.c3p0.max_statements 50
hibernate.c3p0.idle_test_period 10
hibernate.c3p0.acquire_increment 5
hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
Im Unternehmensumfeld, will man natürlich bereits vorhandene Benutzerkonten nutzen. Oftmals liegen diese in einem Active Directory oder in einem LDAP-Verzeichnis. Folgendes basiert auf einem anderen Blog-Eintrag
BonitaAuth {
com.sun.security.auth.module.LdapLoginModule REQUIRED
authzIdentity=”{USERNAME}”
userProvider=”ldap://:389/dc=company,dc=com”
userFilter=”(uid={USERNAME})”
useSSL=false
debug=true;
};
BonitaStore {
org.ow2.bonita.identity.auth.LocalStorageLoginModule required;
};
exo-domain {
org.exoplatform.services.security.j2ee.TomcatLoginModule required;
};
Der Rest aus der Datei kann, muss aber nicht weg 

![]()
Mit oben beschriebendem Ldap-Auth Setup, kann man sich zwar einloggen, bekommt aber nie Admin Zugang. Diese Information bekommt Bonita vom AD/Ldap nicht. Kann wie folgt erreicht werden (ist aus irgendeinem Forumseintrag/Blog, finde es aber ebenfalls nicht mehr):
<authentication-service name=’authentication-service’ class=’org.ow2.bonita.services.impl.DbAuthentication’>
durch
<authentication-service name=’authentication-service’ class=’com.domain.bonita.auth.SimpleLdapAuth’>
ersetzen.
package com.domain.bonita.auth; import org.ow2.bonita.facade.exception.UserNotFoundException; import org.ow2.bonita.services.AuthenticationService; public class SimpleLdapAuth implements AuthenticationService { private String persistenceServiceName; public SimpleLdapAuth(String persistenceServiceName) { super(); this.persistenceServiceName = persistenceServiceName; } /** * Determines if the user should have amdin accesses to the bonita interface * Let's say that Domain Admins have that privilege */ // It looks like by "admin" here, it means whether the user can administer users, roles, // etc. in the UserXP. public boolean isUserAdmin(String username) throws UserNotFoundException { if (username.equals("usernamewhichisadmin")) { return true; } else { return false; } } /** * @return always true. If the LDAP request failed before, it doesn't matter (?) * Necessary to implement interface */ public boolean checkUserCredentials(String username, String password) { return false; } public boolean checkUserCredentialsWithPasswordHash(String username, String password) { return false; } } |
Wird folgendermaßen kompiliert:
javac -cp /var/lib/tomcat6/lib/bonita/bonita-server-5.6.jar SimpleLdapAuth.java
/var/lib/tomcat/lib/com/domain/bonita/auth
jar -cfv SimpleLdapAuth.jar /var/lib/tomcat6/lib/com/domain/bonita/auth/SimpleLdapAuth.class
Der Connector ist völlig unabhängig von LDAP auth, kann also auch eingesetzt werden, wenn man Bonita Auth-Mechanismen verwendet.
def usersById = new HashMap() def name='' def uid='' ldapAttributeList.each { def user= new HashMap() it.each { if( it.getName().equals("displayName") ){ name= it.getValue() } if( it.getName().equals("uid") ){ uid= it.getValue() } user.put( it.getName(), it.getValue() ) } usersById.put( uid.toLowerCase(), user ) } usersById |
Wir erzeugen also eine Hashmap als Output des Connectors, bei der hm['uid'] => hm[$attributenames]=$attributevalue ist. Selbiges kann man z.B. noch machen, um einen Userindex mit map['displayName'] => user['attributenname']= attributevalue zu bekommen. Diese map, kann man dann als Auswahloption hinter ein Dropdown legen, um so vom Namen eines Users auf seine Attribute zu kommen.
Basierend auf der LDAP-aware IdentityService Extension, kann man die Benutzer im LDAP/AD in die Benutzerverwaltung von Bonita synchronisieren. Denn egal, ob man LDAP-Auth nutzt oder nicht, die Benutzer-Details, wie Name, E-Mail-Adresse etc. pp. sind solange nicht greifbar, wie sie sich nicht in der Bonita DB befinden. Entweder man macht das also manuell oder mit folgender Klasse. Ich habe die Benutzung aber eingestellt, da sie bei mir Probleme mit dem Synchronisieren machte und allerlei Exceptions im Log warf.
In der Klasse muss man aber in jedem Fall die Base-DN anpassen, bevor man sie kompiliert, damit im LDAP auch an der richtigen Stelle gesucht wird.
query= """\ select something as smthg, somethingelse as smthgels from sometable where nothing="something" """ query |
if( rowSet.getValues().size() > 0 ) { var['smthg']= rowSet.toList("smthg").get(0) var['smthgels']= rowSet.toList("smthels").get(0) } var |
Um in einem Prozess nicht unzählige Bonita Connectoren zu haben (Bonita hat leider keine Connectoren-Templates mit Vererbung), die man dann jedes Mal alle bearbeiten muss, wenn es Änderungen gibt. Prinzipiell sollte man natürlich sowieso Variablen-Namen für die ganzen Attribute (SMTP-Details, Mail-From, To, Subject, Body etc. pp.) verwenden, trotzdem macht es Sinn statt vielfachen E-Mail-Connectoren, die E-Mails darüber zu versenden, dass man an entsprechender Stelle einen anderen Prozess startet, der den Versand übernimmt.
Dafür einen Prozess bauen, der völlig automatisch abläuft und z.B. in einem ersten Schritt die E-Mail zusammenbaut und in einem zweiten Schritt mittels Connector die Mail versendet. Die Daten für die Mail kommen aus den globalen Prozess-Variablen, die dieser Mail-Prozess über den Start-Instance-Connector vom ursprünglichen Prozess bekommen hat.
Im versendenden Prozess über Connector -> Bonita -> Start Instance Connector anlegen und als Prozess Name, den Prozess Namen des Mail-Prozess ohne Versions-Angabe angeben. Dadurch wird automatisch die aktuellste version gestartet und durch das Angeben von Variablen, werden die Globalen Variablen des anderen Prozesses gefüllt.
Ein weiterer Vorteil dieses Vorgehens besteht darin, dass im Falle von unerwartetem Daten zum Versand, nur der Sub-Prozess nicht funktioniert, der Hauptprozess aber ohne Probleme weitergeht, wenn man mal von der fehlenden Email absieht.
Als aufbauenden Schritt, kann man Bonita verlassen auf bestimmte Trigger hin, den Sub-Prozess auszuführen ohne dass man den Start-Instance-Connector noch bräuchte. Darauf gehe ich in einem dedizierten Artikel noch ein.
Ich hoffe die Anleitung stimmt noch, sobald ziemlich bald Bonita 6 rauskommt. Andernfalls werde ich sie anpassen. Abgesehen davon, hoffe ich, die Details hier helfen jemandem.