Author: johnthuss Date: Tue Aug 14 20:47:05 2012 New Revision: 1373077 URL: http://svn.apache.org/viewvc?rev=1373077&view=rev Log: Lazily instantiate jdbc driver class to prevent errors for connections that are never opened
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/conn/DriverDataSourceTest.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/DriverDataSource.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/DriverDataSource.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/DriverDataSource.java?rev=1373077&r1=1373076&r2=1373077&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/DriverDataSource.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/DriverDataSource.java Tue Aug 14 20:47:05 2012 @@ -39,8 +39,9 @@ import org.apache.cayenne.util.Util; */ public class DriverDataSource implements DataSource { - protected Driver driver; - + protected Driver _driver; + protected String driverClassName; + protected String connectionUrl; protected String userName; protected String password; @@ -82,8 +83,7 @@ public class DriverDataSource implements * null, a user must take care of registering the driver. "connectionUrl" on the other * hand must NOT be null. */ - public DriverDataSource(String driverClassName, String connectionUrl) - throws SQLException { + public DriverDataSource(String driverClassName, String connectionUrl) { this(driverClassName, connectionUrl, null, null); } @@ -96,7 +96,7 @@ public class DriverDataSource implements * @since 3.0 */ public DriverDataSource(String driverClassName, String connectionUrl, - String userName, String password) throws SQLException { + String userName, String password) { setDriverClassName(driverClassName); @@ -116,7 +116,8 @@ public class DriverDataSource implements public DriverDataSource(Driver driver, String connectionUrl, String userName, String password) { - this.driver = driver; + this._driver = driver; + this.driverClassName = driver.getClass().getName(); this.connectionUrl = connectionUrl; this.userName = userName; this.password = password; @@ -143,7 +144,7 @@ public class DriverDataSource implements Connection c = null; - if (driver == null) { + if (getDriver() == null) { c = DriverManager.getConnection(connectionUrl, userName, password); } else { @@ -156,7 +157,7 @@ public class DriverDataSource implements if (password != null) { connectProperties.put("password", password); } - c = driver.connect(connectionUrl, connectProperties); + c = getDriver().connect(connectionUrl, connectProperties); } // some drivers (Oracle) return null connections instead of throwing @@ -248,13 +249,24 @@ public class DriverDataSource implements } public String getDriverClassName() { - return driver != null ? driver.getClass().getName() : null; + return driverClassName; } - public void setDriverClassName(String driverClassName) throws SQLException { + public void setDriverClassName(String driverClassName) { if (!Util.nullSafeEquals(getDriverClassName(), driverClassName)) { - this.driver = driverClassName != null ? loadDriver(driverClassName) : null; + this.driverClassName = driverClassName; + this._driver = null; // force reload + } + } + + /** + * Lazily instantiate the driver class to prevent errors for connections that are never opened + */ + private Driver getDriver() throws SQLException { + if (_driver == null && driverClassName != null) { + _driver = loadDriver(driverClassName); } + return _driver; } /** Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/conn/DriverDataSourceTest.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/conn/DriverDataSourceTest.java?rev=1373077&view=auto ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/conn/DriverDataSourceTest.java (added) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/conn/DriverDataSourceTest.java Tue Aug 14 20:47:05 2012 @@ -0,0 +1,39 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ +package org.apache.cayenne.conn; + +import java.sql.SQLException; + +import junit.framework.TestCase; + +public class DriverDataSourceTest extends TestCase { + + public void testLazyInstantiationOfDriverClass() { + DriverDataSource dataSource = new DriverDataSource("does.not.exist.Driver", "jdbc:postgresql://localhost/database"); + assertNotNull(dataSource); + + try { + dataSource.getConnection(); + fail(); + } catch (SQLException e) { + // expected because driver class does not exist + } + } + +}