Specify Connection Properties
Let's add a PostgreSQL axis.
jBPM3 already generates the DDL scripts for many databases. Edit hibernate.properties.postgresql.xml
<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<!-- JDBC connection properties (begin) -->
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">${jdbc.postgresql.url}</property>
<property name="hibernate.connection.username">${jdbc.postgresql.username}</property>
<property name="hibernate.connection.password">${jdbc.postgresql.password}</property>
<!-- JDBC connection properties (end) -->
Provide Data Source
Create jbpm-postgresql-ds.xml in modules/core/src/main/resources. Use ConfigDataSources as a reference.
<xa-datasource>
<jndi-name>JbpmDS</jndi-name>
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">${jdbc.postgresql.server}</xa-datasource-property>
<xa-datasource-property name="PortNumber">${jdbc.postgresql.port}</xa-datasource-property>
<xa-datasource-property name="DatabaseName">${jdbc.postgresql.database}</xa-datasource-property>
<user-name>${jdbc.postgresql.username}</user-name>
<password>${jdbc.postgresql.password}</password>
<!-- disable transaction interleaving -->
<track-connection-by-tx />
<!-- corresponding type-mapping in conf/standardjbosscmp-jdbc.xml -->
<metadata>
<type-mapping>PostgreSQL 8.0</type-mapping>
</metadata>
</xa-datasource>
Create Maven Profile
In the root POM add a profile that contains the dependency on the JDBC driver
<dependencyManagement>
<dependencies>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<profiles>
<profile>
<id>postgresql</id>
<activation>
<property>
<name>database</name>
<value>postgresql</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</profile>
</profiles>
Fill in Connection Parameters
Specify the connection property values that correspond to the target environment in the following locations.
| Environment | File | Location |
|---|---|---|
| jBPM Dev | profiles.xml | ${basedir} |
| Local Dev * | settings.xml | ${user.home}/.m2 |
| Local QA | profiles.xml.local.qa | ${basedir}/hudson |
| Red Hat QA | profiles.xml.redhat.qa | ${basedir}/hudson |
* Useful if you have multiple jBPM branches checked out
For a local PostgreSQL installation the property values would look like this:
<properties>
<jdbc.postgresql.server>localhost</jdbc.postgresql.server>
<jdbc.postgresql.port>5432</jdbc.postgresql.port>
<jdbc.postgresql.database>jbpmtest</jdbc.postgresql.database>
<jdbc.postgresql.url>jdbc:postgresql://${jdbc.postgresql.server}:${jdbc.postgresql.port}/${jdbc.postgresql.database}</jdbc.postgresql.url>
<jdbc.postgresql.username>jbpmtest</jdbc.postgresql.username>
<jdbc.postgresql.password></jdbc.postgresql.password>
</properties>
Specify Connection Properties For Update
Generating the DB schema update script requires access to an alternate database hosting the schema from a previous version. Create postgresql.properties in modules/db/src/main/resources.
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
#
# This uses the jbpm322 database schema as reference for the SchemaUpdate task
#
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.url=jdbc:postgresql://${jdbc.postgresql.server}:${jdbc.postgresql.port}/jbpm322
hibernate.connection.username=${jdbc.postgresql.username}
hibernate.connection.password=${jdbc.postgresql.password}
<target name="update-schema" depends="setup-schema" description="Generate jBPM Database Update Scripts">
<jbpmschema output="${scriptsdir}/jbpm.jpdl.postgresql.update322.sql" config="hibernate.cfg.postgresql.xml" properties="postgresql.properties" action="update" delimiter=";"/>
</target>
List Database as Installation Choice
<conditions>
<condition type="variable" id="isPostgreSQL">
<name>dbSelection</name>
<value>postgresql</value>
</condition>
</conditions>
<packs>
<!--
********************************
* JBoss Integration *
********************************
-->
<pack name="jBPM3 JBoss Integration" required="no" preselected="yes">
<!-- Database configs to docs/examples/jbpm -->
<fileset dir="@{deploy.artifacts.dir}/resources/jbpm-jpdl-config" targetdir="${jbossInstallPath}/docs/examples/jbpm" override="true">
<include name="hibernate.cfg.postgresql.xml"/>
<include name="jbpm-postgresql-ds.xml"/>
</fileset>
<!-- Database PostgreSQL -->
<file src="@{deploy.artifacts.dir}/resources/jbpm-jpdl-config/jbpm-postgresql-ds.xml" targetdir="${jbossInstallPath}/server/${jbossTargetServer}/deploy/jbpm" condition="isPostgreSQL"/>
<singlefile src="@{deploy.artifacts.dir}/resources/jbpm-jpdl-config/hibernate.cfg.postgresql.xml" condition="isPostgreSQL"
target="${jbossInstallPath}/server/${jbossTargetServer}/deploy/jbpm/jbpm-service.sar/hibernate.cfg.xml" />
<fileset dir="@{deploy.artifacts.dir}/lib" targetdir="${jbossInstallPath}/server/${jbossTargetServer}/deploy/jbpm/jbpm-service.sar" override="true" condition="isPostgreSQL">
<include name="postgresql.jar" />
</fileset>
</pack>
</packs>
<panel order="2"> <createForPack name="jBPM3 JBoss Integration" /> <field type="radio" variable="dbSelection"> <spec> <choice txt="PostgreSQL" value="postgresql"/> </spec> </field> </panel>
<target name="configure" depends="init">
<property name="postgresql.cfg.xml" value="${deploy.artifacts.resources}/jbpm-jpdl-config/hibernate.cfg.postgresql.xml"/>
<macro-disable file="${postgresql.cfg.xml}" section="JDBC connection properties"/>
<macro-disable file="${postgresql.cfg.xml}" section="Automatic schema creation"/>
<macro-enable file="${postgresql.cfg.xml}" section="DataSource properties"/>
<macro-enable file="${postgresql.cfg.xml}" section="JTA transaction properties"/>
</target>
Set Up DBMS
See Install PostgreSQL on Fedora
Run Test Suite
Finally you should be able to run the jBPM3 tests against PostgreSQL using the -Ddatabase option
[tdiesler@tddell core]$ mvn -Ddatabase=postgresql -Dtest=EndTasksDbTest test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building JBoss jBPM - jPDL Core
[INFO] task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [antrun:run {execution: default}]
[INFO] Executing tasks
check-database:
[echo] Concat hibernate.cfg.xml using hibernate.properties.postgresql.xml
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.jbpm.taskmgmt.exe.EndTasksDbTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 25.799 sec
Results :
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
Add Database Axis To Hudson Jobs
When the Maven build is setup to use the database for testing, you simple need to add the axis to the Hudson config.
<axis> <name>database</name> <values> <string>hsqldb</string> <string>mysql</string> <string>postgresql</string> </values> </axis>
This can also be done from the web interface.
Good Luck
Comments