151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.sql;
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
293e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebskiimport dalvik.system.VMStack;
303e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Iterator;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.ServiceLoader;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedAction;
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.CopyOnWriteArrayList;
363e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.reflect.CallerSensitive;
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>The basic service for managing a set of JDBC drivers.<br>
41f28e88eb0d34e13bdded8f37021bbf0e110f9b1dNarayan Kamath * <B>NOTE:</B> The {@code DataSource} interface, new in the
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JDBC 2.0 API, provides another way to connect to a data source.
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The use of a <code>DataSource</code> object is the preferred means of
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connecting to a data source.
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>As part of its initialization, the <code>DriverManager</code> class will
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attempt to load the driver classes referenced in the "jdbc.drivers"
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * system property. This allows a user to customize the JDBC Drivers
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used by their applications. For example in your
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ~/.hotjava/properties file you might specify:
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre>
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <CODE>jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver</CODE>
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre>
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *<P> The <code>DriverManager</code> methods <code>getConnection</code> and
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>getDrivers</code> have been enhanced to support the Java Standard Edition
56d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html#Service%20Provider">Service Provider</a> mechanism. JDBC 4.0 Drivers must
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * include the file <code>META-INF/services/java.sql.Driver</code>. This file contains the name of the JDBC drivers
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation of <code>java.sql.Driver</code>.  For example, to load the <code>my.sql.Driver</code> class,
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <code>META-INF/services/java.sql.Driver</code> file would contain the entry:
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre>
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>my.sql.Driver</code>
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre>
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>Applications no longer need to explictly load JDBC drivers using <code>Class.forName()</code>. Existing programs
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which currently load JDBC drivers using <code>Class.forName()</code> will continue to work without
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * modification.
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>When the method <code>getConnection</code> is called,
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <code>DriverManager</code> will attempt to
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * locate a suitable driver from amongst those loaded at
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialization and those loaded explicitly using the same classloader
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as the current applet or application.
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Starting with the Java 2 SDK, Standard Edition, version 1.3, a
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * logging stream can be set only if the proper
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * permission has been granted.  Normally this will be done with
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the tool PolicyTool, which can be used to grant <code>permission
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.sql.SQLPermission "setLog"</code>.
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Driver
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Connection
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
83f28e88eb0d34e13bdded8f37021bbf0e110f9b1dNarayan Kamath// Android-changed line 2 of the javadoc to "{@code DataSource}"
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class DriverManager {
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // List of registered JDBC drivers
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<DriverInfo>();
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static volatile int loginTimeout = 0;
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static volatile java.io.PrintWriter logWriter = null;
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static volatile java.io.PrintStream logStream = null;
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Used in println() to synchronize logWriter
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final static  Object logSync = new Object();
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* Prevent the DriverManager class from being instantiated. */
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private DriverManager(){}
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Load the initial JDBC drivers by checking the System property
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * jdbc.properties and then use the {@code ServiceLoader} mechanism
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static {
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        loadInitialDrivers();
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("JDBC DriverManager initialized");
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>SQLPermission</code> constant that allows the
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * setting of the logging stream.
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.3
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final static SQLPermission SET_LOG_PERMISSION =
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        new SQLPermission("setLog");
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //--------------------------JDBC 2.0-----------------------------
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Retrieves the log writer.
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>getLogWriter</code> and <code>setLogWriter</code>
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * methods should be used instead
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the <code>get/setlogStream</code> methods, which are deprecated.
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a <code>java.io.PrintWriter</code> object
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setLogWriter
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static java.io.PrintWriter getLogWriter() {
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return logWriter;
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the logging/tracing <code>PrintWriter</code> object
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that is used by the <code>DriverManager</code> and all drivers.
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P>
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * There is a minor versioning problem created by the introduction
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the method <code>setLogWriter</code>.  The
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method <code>setLogWriter</code> cannot create a <code>PrintStream</code> object
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that will be returned by <code>getLogStream</code>---the Java platform does
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * not provide a backward conversion.  As a result, a new application
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that uses <code>setLogWriter</code> and also uses a JDBC 1.0 driver that uses
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getLogStream</code> will likely not see debugging information written
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by that driver.
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *<P>
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Starting with the Java 2 SDK, Standard Edition, version 1.3 release, this method checks
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to see that there is an <code>SQLPermission</code> object before setting
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the logging stream.  If a <code>SecurityManager</code> exists and its
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>checkPermission</code> method denies setting the log writer, this
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method throws a <code>java.lang.SecurityException</code>.
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param out the new logging/tracing <code>PrintStream</code> object;
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *      <code>null</code> to disable logging and tracing
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws SecurityException
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *    if a security manager exists and its
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *    <code>checkPermission</code> method denies
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *    setting the log writer
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see SecurityManager#checkPermission
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLogWriter
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static void setLogWriter(java.io.PrintWriter out) {
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SecurityManager sec = System.getSecurityManager();
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (sec != null) {
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sec.checkPermission(SET_LOG_PERMISSION);
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            logStream = null;
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            logWriter = out;
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //---------------------------------------------------------------
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Attempts to establish a connection to the given database URL.
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>DriverManager</code> attempts to select an appropriate driver from
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the set of registered JDBC drivers.
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param url a database url of the form
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code> jdbc:<em>subprotocol</em>:<em>subname</em></code>
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param info a list of arbitrary string tag/value pairs as
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * connection arguments; normally at least a "user" and
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "password" property should be included
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a Connection to the URL
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception SQLException if a database access error occurs
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @CallerSensitive
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Connection getConnection(String url,
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        java.util.Properties info) throws SQLException {
1913e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski        return (getConnection(url, info, VMStack.getCallingClassLoader()));
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Attempts to establish a connection to the given database URL.
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>DriverManager</code> attempts to select an appropriate driver from
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the set of registered JDBC drivers.
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param url a database url of the form
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>jdbc:<em>subprotocol</em>:<em>subname</em></code>
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param user the database user on whose behalf the connection is being
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *   made
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param password the user's password
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a connection to the URL
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception SQLException if a database access error occurs
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @CallerSensitive
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Connection getConnection(String url,
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String user, String password) throws SQLException {
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        java.util.Properties info = new java.util.Properties();
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (user != null) {
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            info.put("user", user);
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (password != null) {
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            info.put("password", password);
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2193e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski        return (getConnection(url, info, VMStack.getCallingClassLoader()));
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Attempts to establish a connection to the given database URL.
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>DriverManager</code> attempts to select an appropriate driver from
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the set of registered JDBC drivers.
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param url a database url of the form
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *  <code> jdbc:<em>subprotocol</em>:<em>subname</em></code>
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a connection to the URL
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception SQLException if a database access error occurs
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @CallerSensitive
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Connection getConnection(String url)
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws SQLException {
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        java.util.Properties info = new java.util.Properties();
2373e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski        return (getConnection(url, info, VMStack.getCallingClassLoader()));
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Attempts to locate a driver that understands the given URL.
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The <code>DriverManager</code> attempts to select an appropriate driver from
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the set of registered JDBC drivers.
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param url a database URL of the form
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <code>jdbc:<em>subprotocol</em>:<em>subname</em></code>
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a <code>Driver</code> object representing a driver
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that can connect to the given URL
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception SQLException if a database access error occurs
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @CallerSensitive
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Driver getDriver(String url)
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws SQLException {
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("DriverManager.getDriver(\"" + url + "\")");
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2573e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski        ClassLoader callerClassLoader = VMStack.getCallingClassLoader();
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Walk through the loaded registeredDrivers attempting to locate someone
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // who understands the given URL.
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (DriverInfo aDriver : registeredDrivers) {
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // If the caller does not have permission to load the driver then
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // skip it.
2643e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski            if(isDriverAllowed(aDriver.driver, callerClassLoader)) {
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try {
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if(aDriver.driver.acceptsURL(url)) {
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        // Success!
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        println("getDriver returning " + aDriver.driver.getClass().getName());
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return (aDriver.driver);
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } catch(SQLException sqe) {
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // Drop through and try the next driver.
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                println("    skipping: " + aDriver.driver.getClass().getName());
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("getDriver: no suitable driver");
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new SQLException("No suitable driver", "08001");
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Registers the given driver with the <code>DriverManager</code>.
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A newly-loaded driver class should call
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the method <code>registerDriver</code> to make itself
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * known to the <code>DriverManager</code>.
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param driver the new JDBC Driver that is to be registered with the
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *               <code>DriverManager</code>
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception SQLException if a database access error occurs
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized void registerDriver(java.sql.Driver driver)
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws SQLException {
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /* Register the driver if it has not already been added to our list */
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if(driver != null) {
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            registeredDrivers.addIfAbsent(new DriverInfo(driver));
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // This is for compatibility with the original DriverManager
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException();
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("registerDriver: " + driver);
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Drops a driver from the <code>DriverManager</code>'s list.
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *  Applets can only deregister drivers from their own classloaders.
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param driver the JDBC Driver to drop
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception SQLException if a database access error occurs
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @CallerSensitive
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized void deregisterDriver(Driver driver)
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws SQLException {
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (driver == null) {
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("DriverManager.deregisterDriver: " + driver);
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DriverInfo aDriver = new DriverInfo(driver);
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if(registeredDrivers.contains(aDriver)) {
3293e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski            if (isDriverAllowed(driver, VMStack.getCallingClassLoader())) {
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 registeredDrivers.remove(aDriver);
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // If the caller does not have permission to load the driver then
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // throw a SecurityException.
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                throw new SecurityException();
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            println("    couldn't find driver to unload");
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Retrieves an Enumeration with all of the currently loaded JDBC drivers
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to which the current caller has access.
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <P><B>Note:</B> The classname of a driver can be found using
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <CODE>d.getClass().getName()</CODE>
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the list of JDBC Drivers loaded by the caller's class loader
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @CallerSensitive
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static java.util.Enumeration<Driver> getDrivers() {
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        java.util.Vector<Driver> result = new java.util.Vector<Driver>();
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3543e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski        ClassLoader callerClassLoader = VMStack.getCallingClassLoader();
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Walk through the loaded registeredDrivers.
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for(DriverInfo aDriver : registeredDrivers) {
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // If the caller does not have permission to load the driver then
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // skip it.
3603e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski            if(isDriverAllowed(aDriver.driver, callerClassLoader)) {
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                result.addElement(aDriver.driver);
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                println("    skipping: " + aDriver.getClass().getName());
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (result.elements());
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the maximum time in seconds that a driver will wait
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * while attempting to connect to a database.
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param seconds the login time limit in seconds; zero means there is no limit
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLoginTimeout
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static void setLoginTimeout(int seconds) {
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        loginTimeout = seconds;
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Gets the maximum time in seconds that a driver can wait
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * when attempting to log in to a database.
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the driver login time limit in seconds
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setLoginTimeout
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static int getLoginTimeout() {
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (loginTimeout);
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the logging/tracing PrintStream that is used
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by the <code>DriverManager</code>
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and all drivers.
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *<P>
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * In the Java 2 SDK, Standard Edition, version 1.3 release, this method checks
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to see that there is an <code>SQLPermission</code> object before setting
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the logging stream.  If a <code>SecurityManager</code> exists and its
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>checkPermission</code> method denies setting the log writer, this
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method throws a <code>java.lang.SecurityException</code>.
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param out the new logging/tracing PrintStream; to disable, set to <code>null</code>
404f28e88eb0d34e13bdded8f37021bbf0e110f9b1dNarayan Kamath     * @deprecated Use {@code setLogWriter} instead.
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws SecurityException if a security manager exists and its
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *    <code>checkPermission</code> method denies setting the log stream
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see SecurityManager#checkPermission
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getLogStream
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
411f28e88eb0d34e13bdded8f37021bbf0e110f9b1dNarayan Kamath    @Deprecated // Android-added, also changed deprecation comment to include a reason.
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static void setLogStream(java.io.PrintStream out) {
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SecurityManager sec = System.getSecurityManager();
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (sec != null) {
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sec.checkPermission(SET_LOG_PERMISSION);
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        logStream = out;
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if ( out != null )
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            logWriter = new java.io.PrintWriter(out);
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        else
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            logWriter = null;
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Retrieves the logging/tracing PrintStream that is used by the <code>DriverManager</code>
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and all drivers.
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the logging/tracing PrintStream; if disabled, is <code>null</code>
431f28e88eb0d34e13bdded8f37021bbf0e110f9b1dNarayan Kamath     * @deprecated Use {@code getLogWriter} instead.
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #setLogStream
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
434f28e88eb0d34e13bdded8f37021bbf0e110f9b1dNarayan Kamath    @Deprecated // Android-added, also changed deprecation comment to include a reason.
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static java.io.PrintStream getLogStream() {
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return logStream;
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Prints a message to the current JDBC log stream.
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param message a log or tracing message
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static void println(String message) {
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (logSync) {
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (logWriter != null) {
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                logWriter.println(message);
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // automatic flushing is never enabled, so we must do it ourselves
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                logWriter.flush();
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //------------------------------------------------------------------------
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static boolean isDriverAllowed(Driver driver, ClassLoader classLoader) {
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean result = false;
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if(driver != null) {
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Class<?> aClass = null;
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                aClass =  Class.forName(driver.getClass().getName(), true, classLoader);
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (Exception ex) {
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                result = false;
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski             result = ( aClass == driver.getClass() ) ? true : false;
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return result;
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static void loadInitialDrivers() {
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String drivers;
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                public String run() {
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return System.getProperty("jdbc.drivers");
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            });
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (Exception ex) {
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            drivers = null;
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If the driver is packaged as a Service Provider, load it.
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Get all the drivers through the classloader
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // exposed as a java.sql.Driver.class service.
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // ServiceLoader.load() replaces the sun.misc.Providers()
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        AccessController.doPrivileged(new PrivilegedAction<Void>() {
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            public Void run() {
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                Iterator driversIterator = loadedDrivers.iterator();
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                /* Load these drivers, so that they can be instantiated.
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * It may be the case that the driver class may not be there
49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * i.e. there may be a packaged driver with the service class
49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * as implementation of java.sql.Driver but the actual class
49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * may be missing. In that case a java.util.ServiceConfigurationError
50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * will be thrown at runtime by the VM trying to locate
50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * and load the service.
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 *
50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * Adding a try catch block to catch those runtime errors
50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * if driver not available in classpath but it's
50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 * packaged as service and that service is there in classpath.
50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                 */
50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try{
50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    while(driversIterator.hasNext()) {
50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        driversIterator.next();
51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } catch(Throwable t) {
51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // Do nothing
51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return null;
51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        });
51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("DriverManager.initialize: jdbc.drivers = " + drivers);
51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (drivers == null || drivers.equals("")) {
52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String[] driversList = drivers.split(":");
52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("number of Drivers:" + driversList.length);
52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (String aDriver : driversList) {
52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                println("DriverManager.Initialize: loading " + aDriver);
52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                Class.forName(aDriver, true,
52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        ClassLoader.getSystemClassLoader());
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (Exception ex) {
53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                println("DriverManager.Initialize: load failed: " + ex);
53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //  Worker method called by the public getConnection() methods.
53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static Connection getConnection(
5393e57999a63acda214f0143341c2d1aaaa49eee8bPiotr Jastrzebski        String url, java.util.Properties info, ClassLoader callerCL) throws SQLException {
54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        /*
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * When callerCl is null, we should check the application's
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * (which is invoking this class indirectly)
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * classloader, so that the JDBC driver class outside rt.jar
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         * can be loaded from here.
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         */
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        synchronized (DriverManager.class) {
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // synchronize loading of the correct classloader.
54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (callerCL == null) {
54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                callerCL = Thread.currentThread().getContextClassLoader();
55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if(url == null) {
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new SQLException("The url cannot be null", "08001");
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("DriverManager.getConnection(\"" + url + "\")");
55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Walk through the loaded registeredDrivers attempting to make a connection.
56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Remember the first exception that gets raised so we can reraise it.
56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        SQLException reason = null;
56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for(DriverInfo aDriver : registeredDrivers) {
56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // If the caller does not have permission to load the driver then
56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // skip it.
56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if(isDriverAllowed(aDriver.driver, callerCL)) {
56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try {
56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    println("    trying " + aDriver.driver.getClass().getName());
56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    Connection con = aDriver.driver.connect(url, info);
57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (con != null) {
57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        // Success!
57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        println("getConnection returning " + aDriver.driver.getClass().getName());
57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        return (con);
57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } catch (SQLException ex) {
57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (reason == null) {
57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        reason = ex;
57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                println("    skipping: " + aDriver.getClass().getName());
58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // if we got here nobody could connect.
58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (reason != null)    {
58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            println("getConnection failed: " + reason);
59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw reason;
59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        println("getConnection: no suitable driver found for "+ url);
59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new SQLException("No suitable driver found for "+ url, "08001");
59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Wrapper class for registered Drivers in order to not expose Driver.equals()
60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to avoid the capture of the Driver it being compared to as it might not
60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * normally have access.
60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass DriverInfo {
60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    final Driver driver;
60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    DriverInfo(Driver driver) {
60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.driver = driver;
60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean equals(Object other) {
61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (other instanceof DriverInfo)
61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                && this.driver == ((DriverInfo) other).driver;
61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int hashCode() {
61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return driver.hashCode();
61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return ("driver[className="  + driver + "]");
62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
62251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
623