Package org.hsqldb_voltpatches.jdbc.pool

Source Code of org.hsqldb_voltpatches.jdbc.pool.JDBCConnectionPoolDataSource

/* Copyright (c) 2001-2009, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


package org.hsqldb_voltpatches.jdbc.pool;

import org.hsqldb_voltpatches.jdbc.JDBCConnection;

import javax.sql.ConnectionPoolDataSource;
import javax.sql.PooledConnection;

import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

// boucherb@users 20051207 - patch 1.8.0.x initial JDBC 4.0 support work
import org.hsqldb_voltpatches.jdbc.JDBCConnection;

/**
* Don't do pooling. Only be a factory. Let ManagedPoolDataSource do the pooling.
* @author Jakob Jenkov
*/
public class JDBCConnectionPoolDataSource implements ConnectionPoolDataSource {

    /**
     * @todo:  Break off code used here and in JDBCXADataSource into an
     *        abstract class, and have these classes extend the abstract
     *        class.
     */
    public static final String   driver = "org.hsqldb_voltpatches.jdbc.JDBCDriver";
    protected String             url                = null;
    protected ConnectionDefaults connectionDefaults = null;
    private int                  loginTimeout       = 0;
    private PrintWriter          logWriter          = null;
    protected Properties         connProperties = new java.util.Properties();

    public JDBCConnectionPoolDataSource() {}

    public JDBCConnectionPoolDataSource(String url, String user,
                                        String password,
                                        ConnectionDefaults connectionDefaults)
                                        throws SQLException {

        this.url                = url;
        this.connectionDefaults = connectionDefaults;

        setUser(user);
        setPassword(password);
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUser() {
        return connProperties.getProperty("user");
    }

    public void setUser(String user) {
        connProperties.setProperty("user", user);
    }

    public String getPassword() {
        return connProperties.getProperty("password");
    }

    public void setPassword(String password) {
        connProperties.setProperty("password", password);
    }

    /**
     * @return seconds Time, in seconds.
     * @throws SQLException
     * @see javax.sql.ConnectionPoolDataSource#getLoginTimeout()
     */
    public int getLoginTimeout() throws SQLException {
        return this.loginTimeout;
    }

    /**
     * @param seconds Time, in seconds.
     * @throws SQLException
     * @see javax.sql.ConnectionPoolDataSource#setLoginTimeout(int)
     */
    public void setLoginTimeout(int seconds) throws SQLException {
        this.loginTimeout = seconds;
    }

    /**
     * @throws SQLException
     * @see javax.sql.ConnectionPoolDataSource#getLogWriter()
     */
    public PrintWriter getLogWriter() throws SQLException {
        return logWriter;
    }

    /**
     * @throws SQLException
     * @see javax.sql.ConnectionPoolDataSource#setLogWriter(PrintWriter)
     */
    public void setLogWriter(PrintWriter out) throws SQLException {
        logWriter = out;
    }

    public PooledConnection getPooledConnection() throws SQLException {

        try {
            Class.forName(driver).newInstance();
        } catch (ClassNotFoundException e) {
            throw new SQLException("Error opening connection: "
                                   + e.getMessage());
        } catch (IllegalAccessException e) {
            throw new SQLException("Error opening connection: "
                                   + e.getMessage());
        } catch (InstantiationException e) {
            throw new SQLException("Error opening connection: "
                                   + e.getMessage());
        }

        JDBCConnection connection =
            (JDBCConnection) DriverManager.getConnection(url, connProperties);

        return createPooledConnection(connection);
    }

    /**
     * Throws a SQLException if given user name or password are not same
     * as those configured for this object.
     *
     * @throws SQLException if given user name or password is wrong.
     */
    protected void validateSpecifiedUserAndPassword(String user,
            String password) throws SQLException {

        String configuredUser     = connProperties.getProperty("user");
        String configuredPassword = connProperties.getProperty("password");

        if (((user == null && configuredUser != null) || (user != null && configuredUser == null))
                || (user != null && !user.equals(configuredUser))
                || ((password == null && configuredPassword != null) || (password != null && configuredPassword == null))
                || (password != null
                    && !password.equals(configuredPassword))) {
            throw new SQLException("Given user name or password does not "
                                   + "match those configured for this object");
        }
    }

    /**
     * Performs a getPooledConnection() after validating the given username
     * and password.
     *
     * @param user String which must match the 'user' configured for this
     *             JDBCConnectionPoolDataSource.
     * @param password  String which must match the 'password' configured
     *                  for this JDBCConnectionPoolDataSource.
     *
     * @see #getPooledConnection()
     */
    public PooledConnection getPooledConnection(String user,
            String password) throws SQLException {

        validateSpecifiedUserAndPassword(user, password);

        return getPooledConnection();
    }

    public void close() {}

    protected void logInfo(String message) {

        if (logWriter != null) {
            logWriter.write("HSQLDB:Info: " + message + '\n');
            logWriter.flush();
        }
    }

    protected void logInfo(Throwable t) {

        if (logWriter != null) {
            t.printStackTrace(logWriter);
            logWriter.flush();
        }
    }

    protected void logInfo(String message, Throwable t) {

        if (logWriter != null) {
            logWriter.write("HSQLDB:Exception: " + message + '\n');
            logWriter.flush();
            logInfo(t);
        }
    }

    /**
     * Sets JDBC Connection Properties to be used when physical
     * connections are obtained for the pool.
     */
    public Object setConnectionProperty(String name, String value) {
        return connProperties.setProperty(name, value);
    }

    /**
     * Removes JDBC Connection Properties.
     *
     * @see #setConnectionProperty(String, String)
     */
    public Object removeConnectionProperty(String name) {
        return connProperties.remove(name);
    }

    /**
     * @see #setConnectionProperty(String, String)
     *
     * Beware that this property list will normally contain the password.
     * It is under consideration whether the list should be cloned and
     * returned with the password obscured or removed.
     */
    public Properties getConnectionProperties() {
        return connProperties;
    }

    /**
     * Portability wrapper.
     * Many app servers call the URL setting "database".
     */
    public void setDatabase(String url) {
        setUrl(url);
    }

    /**
     * Portability wrapper.
     * Many app servers call the URL setting "database".
     */
    public String getDatabase() {
        return getUrl();
    }

    //------------------------- JDBC 4.0 -----------------------------------

    /**
     * Retrieves the QueryObjectGenerator for the given JDBC driver.  If the
     * JDBC driver does not provide its own QueryObjectGenerator, NULL is
     * returned.
     * @return The QueryObjectGenerator for this JDBC Driver or NULL if the driver does not provide its own
     * implementation
     * @exception SQLException if a database access error occurs
     * @since JDK 1.6, HSQLDB 1.8.x
     */
//#ifdef JAVA6BETA
/*
    public QueryObjectGenerator getQueryObjectGenerator() throws SQLException {
        return null;
    }
*/

//#endif JAVA6BETA
    // ------------------------ internal implementation ------------------------
    private PooledConnection createPooledConnection(JDBCConnection connection)
    throws SQLException {

        LifeTimeConnectionWrapper connectionWrapper =
            new LifeTimeConnectionWrapper(connection, this.connectionDefaults);
        JDBCPooledConnection pooledConnection =
            new JDBCPooledConnection(connectionWrapper);

        connectionWrapper.setPooledConnection(pooledConnection);

        return pooledConnection;
    }

    /************************* Volt DB Extensions *************************/

    public java.util.logging.Logger getParentLogger() throws java.sql.SQLFeatureNotSupportedException {
        throw new java.sql.SQLFeatureNotSupportedException();
    }
    /**********************************************************************/
TOP

Related Classes of org.hsqldb_voltpatches.jdbc.pool.JDBCConnectionPoolDataSource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.