com.liferay.portal.dao.jdbc.DataSourceFactoryImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.dao.jdbc.DataSourceFactoryImpl.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portal.dao.jdbc;

import com.liferay.portal.kernel.dao.jdbc.DataSourceFactory;
import com.liferay.portal.kernel.jndi.JNDIUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.PropertiesUtil;
import com.liferay.portal.kernel.util.SortedProperties;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.util.PropsUtil;
import com.liferay.portal.util.PropsValues;
import com.liferay.util.PwdGenerator;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.lang.management.ManagementFactory;

import java.util.Enumeration;
import java.util.Map;
import java.util.Properties;

import javax.management.MBeanServer;
import javax.management.ObjectName;

import javax.naming.InitialContext;

import javax.sql.DataSource;

import jodd.bean.BeanUtil;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.apache.tomcat.jdbc.pool.jmx.ConnectionPool;

import uk.org.primrose.pool.datasource.GenericDataSourceFactory;

/**
 * @author Brian Wing Shun Chan
 * @author Shuyang Zhou
 */
public class DataSourceFactoryImpl implements DataSourceFactory {

    public void destroyDataSource(DataSource dataSource) throws Exception {
        if (dataSource instanceof ComboPooledDataSource) {
            ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) dataSource;

            comboPooledDataSource.close();
        } else if (dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource) {
            org.apache.tomcat.jdbc.pool.DataSource tomcatDataSource = (org.apache.tomcat.jdbc.pool.DataSource) dataSource;

            tomcatDataSource.close();
        }
    }

    public DataSource initDataSource(Properties properties) throws Exception {
        Properties defaultProperties = PropsUtil.getProperties("jdbc.default.", true);

        PropertiesUtil.merge(defaultProperties, properties);

        properties = defaultProperties;

        String jndiName = properties.getProperty("jndi.name");

        if (Validator.isNotNull(jndiName)) {
            try {
                return (DataSource) JNDIUtil.lookup(new InitialContext(), jndiName);
            } catch (Exception e) {
                _log.error("Unable to lookup " + jndiName, e);
            }
        }

        DataSource dataSource = null;

        String liferayPoolProvider = PropsValues.JDBC_DEFAULT_LIFERAY_POOL_PROVIDER;

        if (liferayPoolProvider.equalsIgnoreCase("c3p0") || liferayPoolProvider.equalsIgnoreCase("c3po")) {

            if (_log.isDebugEnabled()) {
                _log.debug("Initializing C3P0 data source");
            }

            dataSource = initDataSourceC3PO(properties);
        } else if (liferayPoolProvider.equalsIgnoreCase("dbcp")) {
            if (_log.isDebugEnabled()) {
                _log.debug("Initializing DBCP data source");
            }

            dataSource = initDataSourceDBCP(properties);
        } else if (liferayPoolProvider.equalsIgnoreCase("primrose")) {
            if (_log.isDebugEnabled()) {
                _log.debug("Initializing Primrose data source");
            }

            dataSource = initDataSourcePrimrose(properties);
        } else {
            if (_log.isDebugEnabled()) {
                _log.debug("Initializing Tomcat data source");
            }

            dataSource = initDataSourceTomcat(properties);
        }

        if (_log.isDebugEnabled()) {
            _log.debug("Created data source " + dataSource.getClass().getName());

            SortedProperties sortedProperties = new SortedProperties(properties);

            sortedProperties.list(System.out);
        }

        return dataSource;
    }

    public DataSource initDataSource(String driverClassName, String url, String userName, String password)
            throws Exception {

        Properties properties = new Properties();

        properties.setProperty("driverClassName", driverClassName);
        properties.setProperty("url", url);
        properties.setProperty("username", userName);
        properties.setProperty("password", password);

        return initDataSource(properties);
    }

    protected DataSource initDataSourceC3PO(Properties properties) throws Exception {

        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

        String identityToken = PwdGenerator.getPassword(PwdGenerator.KEY2, 8);

        comboPooledDataSource.setIdentityToken(identityToken);

        Enumeration<String> enu = (Enumeration<String>) properties.propertyNames();

        while (enu.hasMoreElements()) {
            String key = enu.nextElement();
            String value = properties.getProperty(key);

            // Map org.apache.commons.dbcp.BasicDataSource to C3PO

            if (key.equalsIgnoreCase("driverClassName")) {
                key = "driverClass";
            } else if (key.equalsIgnoreCase("url")) {
                key = "jdbcUrl";
            } else if (key.equalsIgnoreCase("username")) {
                key = "user";
            }

            // Ignore Liferay properties

            if (isPropertyLiferay(key)) {
                continue;
            }

            // Ignore DBCP properties

            if (isPropertyDBCP(key)) {
                continue;
            }

            // Ignore Primrose properties

            if (isPropertyPrimrose(key)) {
                continue;
            }

            // Ignore Tomcat

            if (isPropertyTomcat(key)) {
                continue;
            }

            try {
                BeanUtil.setProperty(comboPooledDataSource, key, value);
            } catch (Exception e) {
                if (_log.isWarnEnabled()) {
                    _log.warn("Property " + key + " is not a valid C3PO property");
                }
            }
        }

        return comboPooledDataSource;
    }

    protected DataSource initDataSourceDBCP(Properties properties) throws Exception {

        return BasicDataSourceFactory.createDataSource(properties);
    }

    protected DataSource initDataSourcePrimrose(Properties properties) throws Exception {

        String poolName = PwdGenerator.getPassword(PwdGenerator.KEY2, 8);

        properties.setProperty("poolName", poolName);

        Enumeration<String> enu = (Enumeration<String>) properties.propertyNames();

        while (enu.hasMoreElements()) {
            String key = enu.nextElement();

            String value = properties.getProperty(key);

            // Map org.apache.commons.dbcp.BasicDataSource to Primrose

            if (key.equalsIgnoreCase("driverClassName")) {
                key = "driverClass";
            } else if (key.equalsIgnoreCase("url")) {
                key = "driverURL";
            } else if (key.equalsIgnoreCase("username")) {
                key = "user";
            }

            properties.setProperty(key, value);
        }

        GenericDataSourceFactory genericDataSourceFactory = new GenericDataSourceFactory();

        return genericDataSourceFactory.loadPool(poolName, properties);
    }

    protected DataSource initDataSourceTomcat(Properties properties) throws Exception {

        PoolProperties poolProperties = new PoolProperties();

        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();

            // Ignore Liferay properties

            if (isPropertyLiferay(key)) {
                continue;
            }

            // Ignore C3P0 properties

            if (isPropertyC3PO(key)) {
                continue;
            }

            // Ignore Primrose properties

            if (isPropertyPrimrose(key)) {
                continue;
            }

            try {
                BeanUtil.setProperty(poolProperties, key, value);
            } catch (Exception e) {
                if (_log.isWarnEnabled()) {
                    _log.warn("Property " + key + " is not a valid Tomcat JDBC " + "Connection Pool property");
                }
            }
        }

        String poolName = PwdGenerator.getPassword(PwdGenerator.KEY2, 8);

        poolProperties.setName(poolName);

        org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(
                poolProperties);

        if (poolProperties.isJmxEnabled()) {
            org.apache.tomcat.jdbc.pool.ConnectionPool jdbcConnectionPool = dataSource.createPool();

            ConnectionPool jmxConnectionPool = jdbcConnectionPool.getJmxPool();

            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

            ObjectName objectName = new ObjectName(_TOMCAT_JDBC_POOL_OBJECT_NAME_PREFIX + poolName);

            mBeanServer.registerMBean(jmxConnectionPool, objectName);
        }

        return dataSource;
    }

    protected boolean isPropertyC3PO(String key) {
        if (key.equalsIgnoreCase("acquireIncrement") || key.equalsIgnoreCase("acquireRetryAttempts")
                || key.equalsIgnoreCase("acquireRetryDelay")
                || key.equalsIgnoreCase("connectionCustomizerClassName")
                || key.equalsIgnoreCase("idleConnectionTestPeriod") || key.equalsIgnoreCase("maxIdleTime")
                || key.equalsIgnoreCase("maxPoolSize") || key.equalsIgnoreCase("minPoolSize")
                || key.equalsIgnoreCase("numHelperThreads") || key.equalsIgnoreCase("preferredTestQuery")) {

            return true;
        } else {
            return false;
        }
    }

    protected boolean isPropertyDBCP(String key) {
        if (key.equalsIgnoreCase("defaultTransactionIsolation") || key.equalsIgnoreCase("maxActive")
                || key.equalsIgnoreCase("minIdle") || key.equalsIgnoreCase("removeAbandonedTimeout")) {

            return true;
        } else {
            return false;
        }
    }

    protected boolean isPropertyLiferay(String key) {
        if (key.equalsIgnoreCase("jndi.name") || key.equalsIgnoreCase("liferay.pool.provider")) {

            return true;
        } else {
            return false;
        }
    }

    protected boolean isPropertyPrimrose(String key) {
        if (key.equalsIgnoreCase("base") || key.equalsIgnoreCase("connectionTransactionIsolation")
                || key.equalsIgnoreCase("idleTime")
                || key.equalsIgnoreCase("numberOfConnectionsToInitializeWith")) {

            return true;
        } else {
            return false;
        }
    }

    protected boolean isPropertyTomcat(String key) {
        if (key.equalsIgnoreCase("fairQueue") || key.equalsIgnoreCase("jdbcInterceptors")
                || key.equalsIgnoreCase("jmxEnabled") || key.equalsIgnoreCase("timeBetweenEvictionRunsMillis")
                || key.equalsIgnoreCase("useEquals")) {

            return true;
        } else {
            return false;
        }
    }

    private static final String _TOMCAT_JDBC_POOL_OBJECT_NAME_PREFIX = "TomcatJDBCPool:type=ConnectionPool,name=";

    private static Log _log = LogFactoryUtil.getLog(DataSourceFactoryImpl.class);

}