org.wso2.carbon.ndatasource.rdbms.RDBMSDataSource.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.ndatasource.rdbms.RDBMSDataSource.java

Source

/**
 *  Copyright (c) 2012, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *  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.wso2.carbon.ndatasource.rdbms;

import java.lang.management.ManagementFactory;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanServer;
import javax.management.MBeanRegistrationException;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.naming.Reference;
import javax.naming.StringRefAddr;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolConfiguration;
import org.wso2.carbon.ndatasource.common.DataSourceException;
import org.wso2.carbon.ndatasource.core.utils.DataSourceUtils;
import org.wso2.carbon.ndatasource.rdbms.utils.RDBMSDataSourceUtils;

/**
 * RDBMS data source implementation.
 */
public class RDBMSDataSource {

    private static Log log = LogFactory.getLog(RDBMSDataSource.class);

    private DataSource dataSource;

    private Reference dataSourceFactoryReference;

    private PoolConfiguration poolProperties;

    public RDBMSDataSource(RDBMSConfiguration config) throws DataSourceException {
        this.poolProperties = RDBMSDataSourceUtils.createPoolConfiguration(config);
        this.populateStandardProps();
    }

    private void populateStandardProps() {
        String jdbcInterceptors = this.poolProperties.getJdbcInterceptors();
        if (jdbcInterceptors == null) {
            jdbcInterceptors = "";
        }
        jdbcInterceptors = RDBMSDataSourceConstants.STANDARD_JDBC_INTERCEPTORS + jdbcInterceptors;
        this.poolProperties.setJdbcInterceptors(jdbcInterceptors);
    }

    public DataSource getDataSource() {
        if (this.dataSource == null) {
            this.dataSource = new DataSource(poolProperties);
        }
        if (poolProperties.isJmxEnabled()) {
            this.registerMBean();
        }
        return this.dataSource;
    }

    private void registerMBean() {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        String mBean = "";
        try {
            if (DataSourceUtils.getCurrentDataSourceId() == null) {
                if (log.isDebugEnabled()) {
                    log.debug("The current dataSource id is not set");
                }
                return;
            }
            String[] dataSourceId = DataSourceUtils.getCurrentDataSourceId().split(":");
            mBean = dataSourceId[1] + "," + dataSourceId[0];
            ObjectName objectName = new ObjectName(mBean + ":type=DataSource");
            mBeanServer.registerMBean(this.dataSource.createPool().getJmxPool(), objectName);
        } catch (InstanceAlreadyExistsException e) {
            //ignore as the mbean for the same datasource name is already exist
        } catch (MalformedObjectNameException e) {
            log.error("Error while registering the MBean for dataSource '" + mBean + " " + e.getMessage(), e);
        } catch (NotCompliantMBeanException e) {
            log.error("Error while registering the MBean for dataSource '" + mBean + " " + e.getMessage(), e);
        } catch (SQLException e) {
            log.error("Error while registering the MBean for dataSource '" + mBean + " " + e.getMessage(), e);
        } catch (MBeanRegistrationException e) {
            log.error("Error while registering the MBean for dataSource '" + mBean + " " + e.getMessage(), e);
        }
    }

    public Reference getDataSourceFactoryReference() throws DataSourceException {
        if (dataSourceFactoryReference == null) {
            dataSourceFactoryReference = new Reference("org.apache.tomcat.jdbc.pool.DataSource",
                    "org.apache.tomcat.jdbc.pool.DataSourceFactory", null);

            Map<String, String> poolConfigMap = RDBMSDataSourceUtils
                    .extractPrimitiveFieldNameValuePairs(poolProperties);
            Iterator<Entry<String, String>> poolConfigMapIterator = poolConfigMap.entrySet().iterator();

            while (poolConfigMapIterator.hasNext()) {
                Entry<String, String> pairs = poolConfigMapIterator.next();
                dataSourceFactoryReference.add(new StringRefAddr(pairs.getKey(), pairs.getValue()));
            }
        }
        return dataSourceFactoryReference;
    }

}