/************************************************************************* /* DriverManager.java -- Manage JDBC drivers /* /* Copyright (c) 1999 Free Software Foundation, Inc. /* Written by Aaron M. Renn (arenn@urbanophile.com) /* /* This library is free software; you can redistribute it and/or modify /* it under the terms of the GNU Library General Public License as published /* by the Free Software Foundation, either version 2 of the License, or /* (at your option) any later verion. /* /* 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 Library General Public License for more details. /* /* You should have received a copy of the GNU Library 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 /*************************************************************************/ package java.sql; import java.io.PrintStream; import java.io.PrintWriter; import java.util.Enumeration; import java.util.Properties; import java.util.StringTokenizer; import java.util.Vector; /** * This class manages the JDBC drivers in the system. It maintains a * registry of drivers and locates the appropriate driver to handle a * JDBC database URL. *

* On startup, DriverManager loads all the managers specified * by the system property jdbc.drivers. The value of this * property should be a colon separated list of fully qualified driver * class names. Additional drivers can be loaded at any time by * simply loading the driver class with class.forName(String). * The driver should automatically register itself in a static * initializer. *

* The methods in this class are all static. This class * cannot be instantiated. * * @author Aaron M. Renn (arenn@urbanophile.com) */ public class DriverManager { /* * Class Variables */ /** * This is the log stream for JDBC drivers. */ private static PrintStream log_stream; /** * This is the log writer for JDBC drivers. */ private static PrintWriter log_writer; /** * This is the login timeout used by JDBC drivers. */ private static int login_timeout; /** * This is the list of JDBC drivers that are loaded. */ private static Vector drivers; // Hmm, seems like we might want to do a Hashtable and lookup by something, // but what would it be? // Load all drivers on startup static { drivers = new Vector(); String driver_string = System.getProperty("jdbc.drivers"); if (driver_string != null) { StringTokenizer st = new StringTokenizer(driver_string); while (st.hasMoreTokens()) { String driver_classname = st.nextToken(); try { Class.forName(driver_classname); // The driver registers itself } catch (Exception e) { ; } // Ignore not founds } } } /*************************************************************************/ /* * Class Methods */ /** * This method returns the login timeout in use by JDBC drivers systemwide. * * @return The login timeout. */ public static int getLoginTimeout() { return(login_timeout); } /*************************************************************************/ /** * This method set the login timeout used by JDBC drivers. This is a * system-wide parameter that applies to all drivers. * * @param login_timeout The new login timeout value. */ public static void setLoginTimeout(int login_timeout) { DriverManager.login_timeout = login_timeout; } /*************************************************************************/ /** * This method returns the log writer being used by all JDBC drivers. * This method should be used in place of the deprecated * getLogStream method. * * @return The log writer in use by JDBC drivers. */ public static PrintWriter getLogWriter() { return(log_writer); } /*************************************************************************/ /** * This method sets the log writer being used by JDBC drivers. This is a * system-wide parameter that affects all drivers. Note that since there * is no way to retrieve a PrintStream from a * PrintWriter, this method cannot set the log stream in * use by JDBC. Thus any older drivers may not see this setting. * * @param log_writer The new log writer for JDBC. */ public static void setLogWriter(PrintWriter log_writer) { DriverManager.log_writer = log_writer; } /*************************************************************************/ /** * This method returns the log stream in use by JDBC. * * @return The log stream in use by JDBC. * * @deprecated Use getLogWriter() instead. */ public static PrintStream getLogStream() { return(log_stream); } /*************************************************************************/ /** * This method sets the log stream in use by JDBC. * * @param log_stream The log stream in use by JDBC. * * @deprecated Use setLogWriter instead. */ public static void setLogStream(PrintStream log_stream) { DriverManager.log_stream = log_stream; } /*************************************************************************/ /** * This method prints the specified line to the log stream. * * @param str The string to write to the log stream. */ public static void println(String str) { if (log_stream != null) // Watch for user not using logging log_stream.println(str); } /*************************************************************************/ /** * This method registers a new driver with the manager. This is normally * called by the driver itself in a static initializer. * * @param driver The new Driver to add. */ public static void registerDriver(Driver driver) { if (!drivers.contains(driver)) drivers.addElement(driver); } /*************************************************************************/ /** * This method de-registers a driver from the manager. * * @param driver The Driver to unregister. */ public static void deregisterDriver(Driver driver) { if (drivers.contains(driver)) drivers.removeElement(driver); } /*************************************************************************/ /** * This method returns a list of all the currently registered JDBC drivers * that were loaded by the current ClassLoader. * * @return An Enumeration of all currently loaded JDBC drivers. */ public static Enumeration getDrivers() { Vector v = new Vector(); Enumeration e = drivers.elements(); // Is this right? ClassLoader cl = Thread.currentThread().getContextClassLoader(); while(e.hasMoreElements()) { Object obj = e.nextElement(); if (!obj.getClass().getClassLoader().equals(cl)) continue; v.addElement(obj); } return(v.elements()); } /*************************************************************************/ /** * This method returns a driver that can connect to the specified * JDBC URL string. This will be selected from among drivers loaded * at initialization time and those drivers manually loaded by the * same class loader as the caller. * * @param url The JDBC URL string to find a driver for. * * @return A Driver that can connect to the specified * URL, or null if a suitable driver cannot be found. * * @exception SQLException If an error occurs. */ public static Driver getDriver(String url) throws SQLException { // FIXME: Limit driver search to the appropriate subset of loaded drivers. Enumeration e = drivers.elements(); while(e.hasMoreElements()) { Driver d = (Driver)e.nextElement(); if (d.acceptsURL(url)) return(d); } return(null); } /*************************************************************************/ /** * This method attempts to return a connection to the specified * JDBC URL string. * * @param url The JDBC URL string to connect to. * * @return A Connection to that URL. * * @exception SQLException If an error occurs. */ public static Connection getConnection(String url) throws SQLException { return(getConnection(url, new Properties())); } /*************************************************************************/ /** * This method attempts to return a connection to the specified * JDBC URL string using the specified username and password. * * @param url The JDBC URL string to connect to. * @param user The username to connect with. * @param password The password to connect with. * * @return A Connection to that URL. * * @exception SQLException If an error occurs. */ public static Connection getConnection(String url, String user, String password) throws SQLException { Properties p = new Properties(); p.setProperty("user", user); p.setProperty("password", password); return(getConnection(url, p)); } /*************************************************************************/ /** * This method attempts to return a connection to the specified * JDBC URL string using the specified connection properties. * * @param url The JDBC URL string to connect to. * @param properties The connection properties. * * @return A Connection to that URL. * * @exception SQLException If an error occurs. */ public static Connection getConnection(String url, Properties properties) throws SQLException { Driver d = getDriver(url); if (d == null) throw new SQLException("Driver not found for URL: " + url); return(d.connect(url, properties)); } /*************************************************************************/ /* * Constructors */ // Keep bozos from trying to instantiate us. private DriverManager() { ; } } // class DriverManager