Monday, January 6, 2014

how-to cloudbees minuteproject 4 openxava

Minuteproject releases a demo Openxava application to be hosted on cloudbees at

Following those steps, you can recreate an Openxava application with minuteproject and host it on cloudbees.
All those steps are IDE-free (i.e. productivity oriented) all is done by command line!
This is a requirement for automation, since it is very easy to integrate with a CI tool such as Jenkins.
Meanwhile the code is compatible with Eclipse (for java), Mysql Workbench (for DB design + release) and Cloudbees website for manual release.


Generate an openxava application with minuteproject base on an DB structure.
The database use here is petshop; for the generation the database can be local or already hosted on cloudbees PaaS. At running the database is the one of the cloudbees PaaS.

The generated Openxava compliant artifacts are built into an Openxava application.
The application is to be deployed on a tomcat server.
The application relies on a JNDI Datasource on the tomcat server.

After setting the database on cloudbees and the connection pool cloudbees tomcat server, the application can be deployed.



JDK 1.6+
Minuteproject last version
Openxava 4.9
Mysql DB

  • sdk
  • account

Set up Cloudbees


Create a mysql db schema on cloudbees
bees db:create petshopDB
Retrieve the DB info (connection info: server, port, user...) all you need to create you connection pool

bees app:info -db petshopDB 


Create application

bees app:create -petshopox


This is use get the alias use in the persistence.xml datasource (java:comp/env/jdbc/petshopDS)

bees app:bind -db petshopDB -a petshopox -as petshopDS 

Database setup

Run you database script from the information receive via $bees db:info -db petshopDB

mysql --user=xxxx --password=xxxx --port=3306 xxx < petshop.sql
petshop-mysql.sql can be found in MP_HOME/sample/schema/


Full details at
The generation is done by Minuteproject.
Minuteproject generation by command line comes by passing a configuration file name to model-generation.

model-generation petshop.xml

Sample petshop.xml configuration
<!DOCTYPE root>
<generator-config xmlns=""
	<!-- adapted for cloudbees petshop model -->
			<target-convention type="enable-updatable-code-feature" />
		<model name="petshop" version="1.0" package-root="">
				<driver name="mysql" version="5.1.16" groupId="mysql"
				<primaryKeyPolicy oneGlobal="false">
					<primaryKeyPolicyPattern name="autoincrementPattern"></primaryKeyPolicyPattern>
					<condition type="exclude" startsWith="DUAL"></condition>
					<condition type="exclude" startsWith="ID_GEN"></condition>
					<condition type="exclude" startsWith="SEQUENCE"></condition>
				<business-package default="pet">
					<condition type="package" startsWith="PRODUCT" result="product"></condition>
					<condition type="package" startsWith="ITEM" result="product"></condition>
						<entity-naming-convention type="apply-strip-table-name-prefix"
							pattern-to-strip="SYS,FIN" />
							type="apply-referenced-alias-when-no-ambiguity" is-to-plurialize="true"></reference-naming-convention>
					<package name="product">
						<entity-group entities="PRODUCT"></entity-group>
						<entity-group entities="ITEM"></entity-group>
					<entity name="PRODUCT" alias="MY_GOOD_PRODUCT">
					<entity name="ITEM" alias="MY_GOOD_ITEM" comment="my item table">
						<field name="PRODUCTID" alias="THIS_IS_MY_PRODUCT" comment="my product field reference"></field>
					<entity name="CATEGORY" content-type="reference-data">
						<field name="DESCRIPTION" ordering="asc" label="my description"
						<field name="NAME" ordering="asc"></field>
					<entity name="TAG" content-type="reference-data">
						<field name="TAG" ordering="asc">
								<sql-path path="NAME" />
						<sdd-dummy-primarykey-convention add="true" />
					<query name="get address abstract" id="dashAddress" type="dashboard"
						<query-body> <!-- dimensions column first -->
<![CDATA[select city, count(*) as nb from address group by city order by count(*) desc limit ?]]>
							<query-param name="top city" is-mandatory="false"
								type="INT" sample="37" default="10"></query-param>
					<query name="get address summary" id="dashCity" type="dashboard"
						<query-body> <!-- dimensions column first -->
<![CDATA[select city, count(*) as nb, count(*) as nb2 from address group by city order by count(*) desc]]>
					<query name="get addresses by criteria" id="c">
<![CDATA[select * from address where lcase(city) like ?]]>
							<query-param name="city" type="STRING" sample="'S'"
								convert="lowercase,append%" default="%">
		<targets catalog-entry="OpenXava" >
			<property name="environment" value="remote"></property>
			<property name="cloud-platform" value="cloudbees"></property>
			<property name="embed-driver" value="true"></property>

Appart from the 'classical' enrichment facilities, the interesting point are the properties under the targets node:
name="environment" value="remote" 
Implies to use a connection pool (for persistence.xml)
name="cloud-platform" value="cloudbees" 
Performs additional build facilities for Openxava on cloudbees
The OX war has to hold jta.jar, ejb.jar, mysql driver jar.
  • jta.jar and ejb.jar are embedded in tomcat/lib on the OX delivery.
name="embed-driver" value="true" 

  • mysql driver jar is shipped on MP delivery

  • Remark: the last 2 options are available on Minuteproject 0.8.6


    On the generated directory
    set/export OX_HOME
    set/export MP_HOME


    The application petshop.war goes into OX_HOME/workspace/petshop.dist

    The application is ready to be deployed on Cloudbees.


    bees app:deploy -a petshopox -t tomcat7 -Rjava_version=1.7 petshop.war

    petshopox is the name of the application on cloudbees