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.
Principles
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.
Ingredients
Infrastructure
JDK 1.6+Minuteproject last version
Openxava 4.9
Mysql DB
Tomcat
Cloudbees
- sdk
- account
Set up Cloudbees
Database
Create a mysql db schema on cloudbeesbees 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
Application
bees app:create -petshopox
Datasource
bees app:bind -db petshopDB -a petshopox -as petshopDS
Database setup
mysql --host=ec2-50-19-213-178.compute-1.amazonaws.com --user=xxxx --password=xxxx --port=3306 xxx < petshop.sql
petshop-mysql.sql can be found in MP_HOME/sample/schema/Generation
Full details at http://minuteproject.wikispaces.com/OpenXavaThe generation is done by Minuteproject.
Minuteproject generation by command line comes by passing a configuration file name to model-generation.
Sample
model-generation petshop.xml
Sample petshop.xml configuration
<!DOCTYPE root> <generator-config xmlns="http://minuteproject.sf.net/xsd/mp-config" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="mp-config.xsd"> <!-- adapted for cloudbees petshop model --> <configuration> <conventions> <target-convention type="enable-updatable-code-feature" /> </conventions> <model name="petshop" version="1.0" package-root="net.sf.mp.demo"> <data-model> <driver name="mysql" version="5.1.16" groupId="mysql" artifactId="mysql-connector-java"></driver> <dataSource> <driverClassName>org.gjt.mm.mysql.Driver</driverClassName> <url>jdbc:mysql://localhost:3306/petshop</url> <username>root</username> <password>mysql</password> </dataSource> <primaryKeyPolicy oneGlobal="false"> <primaryKeyPolicyPattern name="autoincrementPattern"></primaryKeyPolicyPattern> </primaryKeyPolicy> </data-model> <business-model> <generation-condition> <condition type="exclude" startsWith="DUAL"></condition> <condition type="exclude" startsWith="ID_GEN"></condition> <condition type="exclude" startsWith="SEQUENCE"></condition> </generation-condition> <business-package default="pet"> <condition type="package" startsWith="PRODUCT" result="product"></condition> <condition type="package" startsWith="ITEM" result="product"></condition> </business-package> <enrichment> <conventions> <entity-naming-convention type="apply-strip-table-name-prefix" pattern-to-strip="SYS,FIN" /> <reference-naming-convention type="apply-referenced-alias-when-no-ambiguity" is-to-plurialize="true"></reference-naming-convention> </conventions> <package name="product"> <entity-group entities="PRODUCT"></entity-group> <entity-group entities="ITEM"></entity-group> </package> <entity name="PRODUCT" alias="MY_GOOD_PRODUCT"> </entity> <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> <entity name="CATEGORY" content-type="reference-data"> <field name="DESCRIPTION" ordering="asc" label="my description" is-searchable="true"></field> <field name="NAME" ordering="asc"></field> </entity> <entity name="TAG" content-type="reference-data"> <field name="TAG" ordering="asc"> <semantic-reference> <sql-path path="NAME" /> </semantic-reference> </field> </entity> </enrichment> </business-model> <statement-model> <enrichment> <conventions> <sdd-dummy-primarykey-convention add="true" /> </conventions> </enrichment> <queries> <query name="get address abstract" id="dashAddress" type="dashboard" category="pie-chart"> <query-body> <!-- dimensions column first --> <value> <![CDATA[select city, count(*) as nb from address group by city order by count(*) desc limit ?]]> </value> </query-body> <query-params> <query-param name="top city" is-mandatory="false" type="INT" sample="37" default="10"></query-param> </query-params> </query> <query name="get address summary" id="dashCity" type="dashboard" category="bar-chart"> <query-body> <!-- dimensions column first --> <value> <![CDATA[select city, count(*) as nb, count(*) as nb2 from address group by city order by count(*) desc]]> </value> </query-body> </query> <query name="get addresses by criteria" id="c"> <query-body> <value> <![CDATA[select * from address where lcase(city) like ?]]> </value> </query-body> <query-params> <query-param name="city" type="STRING" sample="'S'" convert="lowercase,append%" default="%"> </query-param> </query-params> </query> </queries> </statement-model> </model> <targets catalog-entry="OpenXava" > <property name="environment" value="remote"></property> <property name="cloud-platform" value="cloudbees"></property> <property name="embed-driver" value="true"></property> </targets> </configuration> </generator-config>
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 cloudbeesThe 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"
Remark: the last 2 options are available on Minuteproject 0.8.6
Build
On the generated directoryset/export OX_HOME
set/export MP_HOME
Run
build-petshop.cmd/sh
The application petshop.war goes into OX_HOME/workspace/petshop.dist
The application is ready to be deployed on Cloudbees.
Deploy
bees app:deploy -a petshopox -t tomcat7 -Rjava_version=1.7 petshop.war
petshopox is the name of the application on cloudbees
thanks
ReplyDelete