org.enhydra.jdbc.standard.StandardDataSource.java Source code

Java tutorial

Introduction

Here is the source code for org.enhydra.jdbc.standard.StandardDataSource.java

Source

package org.enhydra.jdbc.standard;/*
                                  * XAPool: Open Source XA JDBC Pool
                                  * Copyright (C) 2003 Objectweb.org
                                  * Initial Developer: Lutris Technologies Inc.
                                  * Contact: xapool-public@lists.debian-sf.objectweb.org
                                  *
                                  * 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 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.
                                  *
                                  * You should have received a copy of the GNU Lesser General Public
                                  * License along with this library; if not, write to the Free Software
                                  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
                                  * USA
                                  */

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
import javax.sql.DataSource;

import org.apache.commons.logging.LogFactory;
import org.enhydra.jdbc.core.CoreDataSource;
import org.enhydra.jdbc.util.Logger;
import org.osgi.framework.BundleContext;

/**
 * Provides a Data Source which can be used to generate JDBC connections.
 * <p/>
 * This class is generic in the sense that it does not rely upon anything other
 * than standard Java APIs. It uses java.sql.DriverManager and preconfigured
 * properties to construct a JDBC connection.
 * Important : networkProtocol, portNumber, serverName are not used. Please use
 * instead the url property.
 */
public class StandardDataSource extends CoreDataSource implements DataSource {

    private BundleContext bundleContext;
    private int transIsolation; // transaction isolation level
    private boolean loadedFromCCL = false;
    // Standard Data Source properties
    transient Driver driver;
    String driverName; // name of the Standard JDBC driver
    String url; // an explicit JDBC URL used to access this data source

    /**
     * Constructors
     */
    public StandardDataSource() {
        // This constructor is needed by the object factory
        super();
        driver = null;
        driverName = "";
        url = "";
        transIsolation = -1; //use default
        setLogger(new Logger(LogFactory.getLog("org.enhydra.jdbc.xapool")));
    }

    protected StandardDataSource(Driver drv) throws SQLException {
        this();
        driver = drv;
        driverName = drv.getClass().getName();
        setLogger(new Logger(LogFactory.getLog("org.enhydra.jdbc.xapool")));
    }

    /**
     * return the name of the driver
     *
     * @return the string representation of the driver name
     */
    public String getDriverName() {
        return driverName;
    }

    /**
     * set the name of the jdbc driver
     *
     * @param driverName the string representation of the jdbc driver name
     * @throws java.sql.SQLException
     */
    public void setDriverName(String driverName) throws SQLException {
        if (!this.driverName.equals(driverName)) {
            this.driverName = driverName;
            driver = null;
        }

        /*
        try {
        driver= (Driver)Class.forName (driverName).newInstance();
        log("StandardDataSource:setDriverName a new driver instance is created");
        } catch (Exception e) {
        throw new SQLException ("Error trying to load driver: "+driverName+"\n"+e.getMessage());
        } // try-catch
        */
    }

    /**
     * return the url of the database
     *
     * @return the string representation of the database url
     */
    public String getUrl() {
        return url;
    }

    /**
     * set the database url
     *
     * @param url the string representation of the database url
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * return the transaction isolation level defined for the current database
     *
     * @return the transaction isolation level
     */
    public int getTransactionIsolation() {
        return transIsolation;
    }

    /**
     * set the level of the transaction isolation for the current database
     *
     * @param level the integer level
     */
    public void setTransactionIsolation(int level) {
        transIsolation = level;
    }

    /**
     * @return
     * @throws java.sql.SQLException
     */
    synchronized public Connection getConnection() throws SQLException {
        return getConnection(user, password);
    }

    /**
     * @param u
     * @param p
     * @return
     * @throws java.sql.SQLException
     */
    synchronized public Connection getConnection(String u, String p) throws SQLException {
        Connection ret = null; // the connection that gets returned
        Properties prop = new Properties();
        if (u != null) {
            prop.put("user", u);
        }
        if (p != null) {
            prop.put("password", p);
        }

        if (driver == null && bundleContext != null) {
            try {
                driver = (Driver) bundleContext.getBundle().loadClass(driverName).newInstance();
                loadedFromCCL = true;
                log.debug("StandardDataSource:getConnection a new driver instance is created");
            } catch (Exception e) {
                log.error("Could not load via OSGi: " + driverName);
            }
        }

        if (driver == null && url == null) { // if no explicit url provided
            // Build URL from serverName, NetworkProtocol etc.
        } else { // explicit URL provided

            if (driver == null) {
                try {
                    driver = (Driver) Class.forName(driverName).newInstance();
                    loadedFromCCL = false;
                    log.debug("StandardDataSource:getConnection a new driver instance is created");
                } catch (Exception e) {
                    try {
                        driver = (Driver) Class
                                .forName(driverName, true, Thread.currentThread().getContextClassLoader())
                                .newInstance();
                        loadedFromCCL = true;
                    } catch (Exception e2) {
                        throw new SQLException(
                                "Error trying to load driver: " + driverName + " : " + e2.getMessage());
                    }
                }
            }
            // commenting out since at least one driver will complain if you
            // instantiate the driver outside the Driver Manager
            // (ie. Cloudscape RMI)
            /*
            if (!driver.acceptsURL(url)) {
            log("Driver does not accept url "+url);
            throw new SQLException("Driver does not accept url "+url);
            }
            */
            try {
                if (loadedFromCCL) {

                    ret = driver.connect(url, prop);
                    // Driver creates the connection
                } else {
                    ret = DriverManager.getConnection(url, prop);
                    // DriverManager creates the connection
                }
                int transIsolation = getTransactionIsolation();
                if (transIsolation >= 0) {
                    ret.setTransactionIsolation(transIsolation);
                }
                log.debug("StandardDataSource:getConnection Connection from DriverManager is returned");
            } catch (SQLException e) {
                throw new SQLException("Cannot get connection for URL " + url + " : " + e.getMessage());
            }
        }
        return ret;
    }

    /**
     * Methods inherited from referenceable
     */
    public Reference getReference() throws NamingException {
        // Note that we use getClass().getName() to provide the factory
        // class name. It is assumed that this class, and all of its
        // descendants are their own factories.

        Reference ref = new Reference(getClass().getName(), getClass().getName(), null);
        ref.add(new StringRefAddr("driverName", getDriverName()));
        ref.add(new StringRefAddr("url", getUrl()));
        ref.add(new StringRefAddr("user", getUser()));
        ref.add(new StringRefAddr("password", getPassword()));
        ref.add(new StringRefAddr("description", getDescription()));
        ref.add(new StringRefAddr("loginTimeout", Integer.toString(getLoginTimeout())));
        ref.add(new StringRefAddr("transIsolation", Integer.toString(getTransactionIsolation())));
        log.debug("StandardDataSource:getReference object returned");
        return ref;
    }

    /**
     * Methods inherited from ObjectFactory
     */
    public Object getObjectInstance(Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception {
        Reference ref = (Reference) refObj;
        this.setDriverName((String) ref.get("driverName").getContent());
        this.setUrl((String) ref.get("url").getContent());
        this.setUser((String) ref.get("user").getContent());
        this.setPassword((String) ref.get("password").getContent());
        this.setDescription((String) ref.get("description").getContent());
        this.setLoginTimeout(Integer.parseInt((String) ref.get("loginTimeout").getContent()));
        this.setTransactionIsolation(Integer.parseInt((String) ref.get("transIsolation").getContent()));
        return this;
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        return false;
        /*
            if (obj instanceof StandardDataSource) {
              StandardDataSource other = (StandardDataSource)obj;
              if (!(this.url == null || this.user == null)) {
                  return (this.url.equals(other.url) && this.user.equals(other.user));
              } else if (this.url != null) {
                  return (this.url.equals(other.url) && this.user == other.user);
              } else if (this.user != null) {
                  return (this.url == other.url && this.user.equals(other.user));
              } else {
                  return (this.url == other.url && this.user == other.user);
              }
          } else {
              return false;
          }
          */
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */

    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("StandardDataSource:\n");
        sb.append("     driver=<" + driver + ">\n");
        sb.append("     url=<" + url + ">\n");
        sb.append("     user=<" + user + ">\n");
        sb.append(super.toString());

        return sb.toString();
    }

    public int hashCode() {
        return toString().hashCode();
    }

    @Override
    public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null; //TODO
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null; //TODO
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false; //TODO
    }

    public void setBundleContext(BundleContext bundleContext) {
        this.bundleContext = bundleContext;
    }
}