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