Liferay 7 CE: How to add support for IBM DB2 Server
Those who follow Liferay is aware of the fact that the Community Edition version 7 of Liferay, were eliminated quite a bit of components App Server, Database & Clustering Support. For more detail information you can read the blog post by Bryan Cheung published on April 7, 2016.
- The Liferay 7 CE GA1 no more support OOTB (Out Of The Box):
- Application Server: Oracle WebLogic, IBM WebSphere
- Clustering
- MultiVM Cache
- Oracle Database, Microsoft SQL Server, IBM DB2, Sybase DB
This sample project demonstrates how to add support to the IBM DB2 database. Liferay has performed refactorting the code so that it is possible and easy to add support for databases no longer supported OOTB.
1. Introduction
To extend support to other databases, Liferay has decided to refactory code to use Java SPI (Service Provider Interface). SPI is the mechanism that allows you to extend / change the behavior within a system without changing the source. It includes interfaces, classes or methods that the user extends or implements in order to obtain a certain functionality.
In short we must:
- Implement the SPI interface com.liferay.portal.kernel.dao.db.DBFactory. Implementation class inside this project is DB2DBFactory.java
- Implement the abstract class com.liferay.portal.dao.db.BaseDB for DB2 DB. Implementation class inside this project is DB2DB.java
The following code shows how service providers are loaded via SPI.
public DBManagerImpl() { ServiceLoader<DBFactory> serviceLoader = ServiceLoader.load( DBFactory.class, DBManagerImpl.class.getClassLoader()); for (DBFactory dbFactory : serviceLoader) { _dbFactories.put(dbFactory.getDBType(), dbFactory); } }
To register your service provider, you create a provider configuration file, which is stored in the META-INF/services directory of the service provider's JAR file. The name of the configuration file is the fully qualified class name of the service provider, in which each component of the name is separated by a period (.), and nested classes are separated by a dollar sign ($).
The provider configuration file contains the fully qualified class names (FQDN) of your service providers, one name per line. The file must be UTF-8 encoded. Additionally, you can include comments in the file by beginning the comment line with the number sign (#).
Our file is called com.liferay.portal.kernel.dao.db.DBFactory and contain the FQDN of the class it.dontesta.labs.liferay.portal.dao.db.DB2DBFactory
In the figure below shows the complete class diagram for DB2.
2. Build project
Requirements for build project
- Sun/Oracle JDK 1.8
- Maven 3.x (for build project) or Gradle 2.x
The driver that adds support for DB2 database is a jar (liferay-portal-db2-support-${version}.jar) which then will be installed in ROOT/WEB-INF/lib (for apache tomcat).
To generate the driver for IBM DB2 database just follow the instructions below.
You can download the binary jar liferay-portal-db2-support-1.0-SNAPSHOT.jar, by doing so you can avoid doing the build.
$ git clone https://github.com/amusarra/liferay-portal-db2-support.git $ mvn package
the build process create the jar liferay-portal-db2-support-1.0-SNAPSHOT.jar inside the (maven) target directory:
If you have a Gradle build system, then you can build jar by the following command
$ git clone https://github.com/amusarra/liferay-portal-db2-support.git $ gradle build
the build process create the jar inside the build/libs directory.
3. Install Liferay CE 7 on DB2 Database
To install Liferay on DB2 you must have previously configured a schema for Liferay on an DB2 Database.
I have used Virtual Appliance with a DB2 Express-C 10.1 (FP2) installation on SUSE Linux Enterprise Server
The parameters of my DB2 instance are:
- Username: db2inst1
- Password: system
- FQDN: db2.vm.local (IP: 192.168.56.101)
- TCP/IP Port: 50001
For the installation of Liferay follow the following steps:
- Download Liferay CE 7 GA2 Tomcat Bundle from sourceforge
- Extract the Liferay bundle (in my case $LIFERAY_HOME is /opt/liferay-ce-portal-7.0-ga2-blog)
- Copy the jar liferay-portal-db2-support-${version}.jar in $LIFERAY_HOME/$TOMCAT_HOME/webapps/ROOT/WEB-INF/lib
- Download and install DB2 JDBC driver (xxxxxx.jar) in $LIFERAY_HOME/$TOMCAT_HOME/lib/ext.
- Create the portal-ext.properties in $LIFERAY_HOME with the content as the file below. You should modify the JDBC connection parameters to the your db and the value of liferay.home
- Launch the Liferay Portal through the command $LIFERAY_HOME/$TOMCAT_HOME/bin/startup.sh
- See the Liferay activities via the log file $LIFERAY_HOME/$TOMCAT_HOME/logs/catalina.out
Below you can see the portal-ext.properties
## ## Admin Portlet ## # # Configure email notification settings. # admin.email.from.name=Joe Bloggs admin.email.from.address=test@liferay.com ## ## JDBC ## # # DB2 # jdbc.default.driverClassName=com.ibm.db2.jcc.DB2Driver jdbc.default.url=jdbc:db2://db2.vm.local:50001/lportal:deferPrepares=false;fullyMaterializeInputStreams=true;fullyMaterializeLobData=true;progresssiveLocators=2;progressiveStreaming=2; jdbc.default.username=db2inst1 jdbc.default.password=system ## ## Liferay Home ## # # Specify the Liferay home directory. # liferay.home=/opt/liferay-ce-portal-7.0-ga2-blog ## ## Setup Wizard ## # # Set this property to true if the Setup Wizard should be displayed the # first time the portal is started. # setup.wizard.enabled=false
You can see the part of the catalina.out log file and the contents of the DB2 Liferay database.