org.jumpmind.db.util.BasicDataSourceFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.jumpmind.db.util.BasicDataSourceFactory.java

Source

/**
 * Licensed to JumpMind Inc under one or more contributor
 * license agreements.  See the NOTICE file distributed
 * with this work for additional information regarding
 * copyright ownership.  JumpMind Inc licenses this file
 * to you under the GNU General Public License, version 3.0 (GPLv3)
 * (the "License"); you may not use this file except in compliance
 * with the License.
 *
 * You should have received a copy of the GNU General Public License,
 * version 3.0 (GPLv3) along with this library; if not, see
 * <http://www.gnu.org/licenses/>.
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.jumpmind.db.util;

import java.sql.Driver;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.jumpmind.properties.TypedProperties;
import org.jumpmind.security.ISecurityService;
import org.jumpmind.security.SecurityConstants;
import org.jumpmind.security.SecurityServiceFactory;
import org.jumpmind.security.SecurityServiceFactory.SecurityServiceType;
import org.slf4j.LoggerFactory;

public class BasicDataSourceFactory {

    public static void prepareDriver(String clazzName) throws Exception {
        Driver driver = (Driver) Class.forName(clazzName).newInstance();
        synchronized (DriverManager.class) {
            Enumeration<Driver> drivers = DriverManager.getDrivers();
            while (drivers.hasMoreElements()) {
                Driver driver2 = (Driver) drivers.nextElement();
                /* 
                 * MySQL and Maria DB drivers cannot co-exist because
                 * they use the same JDBC URL.
                 */
                if ((driver.getClass().getName().equals("com.mysql.jdbc.Driver")
                        && driver2.getClass().getName().equals("org.mariadb.jdbc.Driver"))
                        || (driver.getClass().getName().equals("org.mariadb.jdbc.Driver")
                                && driver2.getClass().getName().equals("com.mysql.jdbc.Driver"))) {
                    DriverManager.deregisterDriver(driver2);
                }
            }
        }
    }

    public static ResettableBasicDataSource create(TypedProperties properties) {
        return create(properties, SecurityServiceFactory.create(SecurityServiceType.CLIENT, properties));
    }

    public static ResettableBasicDataSource create(TypedProperties properties, ISecurityService securityService) {
        properties = properties.copy();
        properties.putAll(System.getProperties());
        ResettableBasicDataSource dataSource = new ResettableBasicDataSource();
        dataSource.setDriverClassName(properties.get(BasicDataSourcePropertyConstants.DB_POOL_DRIVER, null));
        try {
            prepareDriver(dataSource.getDriverClassName());
        } catch (Exception e) {
            throw new IllegalStateException(
                    "Had trouble registering the jdbc driver: " + dataSource.getDriverClassName(), e);
        }
        dataSource.setUrl(properties.get(BasicDataSourcePropertyConstants.DB_POOL_URL, null));
        String user = properties.get(BasicDataSourcePropertyConstants.DB_POOL_USER, "");
        if (user != null && user.startsWith(SecurityConstants.PREFIX_ENC)) {
            user = securityService.decrypt(user.substring(SecurityConstants.PREFIX_ENC.length()));
        }
        dataSource.setUsername(user);

        String password = properties.get(BasicDataSourcePropertyConstants.DB_POOL_PASSWORD, "");
        if (password != null && password.startsWith(SecurityConstants.PREFIX_ENC)) {
            password = securityService.decrypt(password.substring(SecurityConstants.PREFIX_ENC.length()));
        }
        dataSource.setPassword(password);
        dataSource.setInitialSize(properties.getInt(BasicDataSourcePropertyConstants.DB_POOL_INITIAL_SIZE, 2));
        dataSource.setMaxActive(properties.getInt(BasicDataSourcePropertyConstants.DB_POOL_MAX_ACTIVE, 10));
        dataSource.setMaxWait(properties.getInt(BasicDataSourcePropertyConstants.DB_POOL_MAX_WAIT, 5000));
        dataSource.setMaxIdle(properties.getInt(BasicDataSourcePropertyConstants.DB_POOL_MAX_IDLE, 8));
        dataSource.setMinIdle(properties.getInt(BasicDataSourcePropertyConstants.DB_POOL_MIN_IDLE, 0));
        dataSource.setMinEvictableIdleTimeMillis(
                properties.getInt(BasicDataSourcePropertyConstants.DB_POOL_MIN_EVICTABLE_IDLE_TIME_MILLIS, 60000));
        dataSource.setTimeBetweenEvictionRunsMillis(120000);
        dataSource.setNumTestsPerEvictionRun(10);
        dataSource.setValidationQuery(
                properties.get(BasicDataSourcePropertyConstants.DB_POOL_VALIDATION_QUERY, null));
        dataSource.setTestOnBorrow(properties.is(BasicDataSourcePropertyConstants.DB_POOL_TEST_ON_BORROW, true));
        dataSource.setTestOnReturn(properties.is(BasicDataSourcePropertyConstants.DB_POOL_TEST_ON_RETURN, false));
        dataSource.setTestWhileIdle(properties.is(BasicDataSourcePropertyConstants.DB_POOL_TEST_WHILE_IDLE, false));

        String connectionProperties = properties.get(BasicDataSourcePropertyConstants.DB_POOL_CONNECTION_PROPERTIES,
                null);
        if (StringUtils.isNotBlank(connectionProperties)) {
            String[] tokens = connectionProperties.split(";");
            for (String property : tokens) {
                String[] keyValue = property.split("=");
                if (keyValue != null && keyValue.length > 1) {
                    LoggerFactory.getLogger(BasicDataSourceFactory.class)
                            .info("Setting database connection property {}={}", keyValue[0], keyValue[1]);
                    dataSource.addConnectionProperty(keyValue[0], keyValue[1]);
                }
            }
        }

        String initSql = properties.get(BasicDataSourcePropertyConstants.DB_POOL_INIT_SQL, null);
        if (StringUtils.isNotBlank(initSql)) {
            List<String> initSqlList = new ArrayList<String>(1);
            initSqlList.add(initSql);
            dataSource.setConnectionInitSqls(initSqlList);
        }
        return dataSource;

    }

}