Repository: cayenne Updated Branches: refs/heads/master 92ecdfe6d -> 3aa0af9a0
CAY-2009 Non-blocking connection pool * removing dependency on AdHocObjectFactory from DataSourceBuilder - this way anyone can use it outside Cayenne Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/3aa0af9a Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/3aa0af9a Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/3aa0af9a Branch: refs/heads/master Commit: 3aa0af9a0630b4d5b9f1775769deae532b05be09 Parents: 92ecdfe Author: aadamchik <[email protected]> Authored: Tue May 19 10:57:01 2015 +0300 Committer: aadamchik <[email protected]> Committed: Tue May 19 11:24:27 2015 +0300 ---------------------------------------------------------------------- .../server/PropertyDataSourceFactory.java | 5 ++- .../server/XMLPoolingDataSourceFactory.java | 7 ++- .../cayenne/datasource/DataSourceBuilder.java | 47 +++++++++++++++----- .../di/server/ServerCaseDataSourceFactory.java | 11 +++-- 4 files changed, 52 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/3aa0af9a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/PropertyDataSourceFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/PropertyDataSourceFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/PropertyDataSourceFactory.java index d8dd229..4bd2dbb 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/PropertyDataSourceFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/PropertyDataSourceFactory.java @@ -18,6 +18,8 @@ ****************************************************************/ package org.apache.cayenne.configuration.server; +import java.sql.Driver; + import javax.sql.DataSource; import org.apache.cayenne.ConfigurationException; @@ -69,7 +71,8 @@ public class PropertyDataSourceFactory implements DataSourceFactory { PoolingDataSource.MAX_QUEUE_WAIT_DEFAULT); String validationQuery = properties.get(Constants.JDBC_VALIDATION_QUERY_PROPERTY); - return DataSourceBuilder.builder(objectFactory).driver(driverClass).url(url).userName(username) + Driver driver = objectFactory.newInstance(Driver.class, driverClass); + return DataSourceBuilder.url(url).driver(driver).userName(username) .password(password).minConnections(minConnections).maxConnections(maxConnections) .maxQueueWaitTime(maxQueueWaitTime).validationQuery(validationQuery).build(); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/3aa0af9a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java index 5df5f2a..caec026 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java @@ -18,6 +18,8 @@ ****************************************************************/ package org.apache.cayenne.configuration.server; +import java.sql.Driver; + import javax.sql.DataSource; import org.apache.cayenne.ConfigurationException; @@ -65,8 +67,9 @@ public class XMLPoolingDataSourceFactory implements DataSourceFactory { long maxQueueWaitTime = properties.getLong(Constants.SERVER_MAX_QUEUE_WAIT_TIME, PoolingDataSource.MAX_QUEUE_WAIT_DEFAULT); - return DataSourceBuilder.builder(objectFactory).driver(descriptor.getJdbcDriver()) - .url(descriptor.getDataSourceUrl()).userName(descriptor.getUserName()) + Driver driver = objectFactory.newInstance(Driver.class, descriptor.getJdbcDriver()); + + return DataSourceBuilder.url(descriptor.getDataSourceUrl()).driver(driver).userName(descriptor.getUserName()) .password(descriptor.getPassword()).minConnections(descriptor.getMinConnections()) .maxConnections(descriptor.getMaxConnections()).maxQueueWaitTime(maxQueueWaitTime).build(); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/3aa0af9a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java index 1e959b1..5e1b33d 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java @@ -23,7 +23,6 @@ import java.sql.Driver; import javax.sql.DataSource; import org.apache.cayenne.CayenneRuntimeException; -import org.apache.cayenne.di.AdhocObjectFactory; /** * A builder class that allows to build a {@link DataSource} with optional @@ -33,19 +32,20 @@ import org.apache.cayenne.di.AdhocObjectFactory; */ public class DataSourceBuilder { - private AdhocObjectFactory objectFactory; private String userName; private String password; - private String driver; + private String driverClassName; + private Driver driver; private String url; private PoolingDataSourceParameters poolParameters; - public static DataSourceBuilder builder(AdhocObjectFactory objectFactory) { - return new DataSourceBuilder(objectFactory); + public static DataSourceBuilder url(String url) { + return new DataSourceBuilder(url); } - private DataSourceBuilder(AdhocObjectFactory objectFactory) { - this.objectFactory = objectFactory; + private DataSourceBuilder(String url) { + + this.url = url; this.poolParameters = new PoolingDataSourceParameters(); poolParameters.setMinConnections(1); @@ -65,12 +65,14 @@ public class DataSourceBuilder { public DataSourceBuilder driver(String driver) { // TODO: guess the driver from URL - this.driver = driver; + this.driver = null; + this.driverClassName = driver; return this; } - public DataSourceBuilder url(String url) { - this.url = url; + public DataSourceBuilder driver(Driver driver) { + this.driver = driver; + this.driverClassName = null; return this; } @@ -115,7 +117,7 @@ public class DataSourceBuilder { } private DataSource buildNonPooling() { - Driver driver = objectFactory.newInstance(Driver.class, this.driver); + Driver driver = loadDriver(); return new DriverDataSource(driver, url, userName, password); } @@ -126,4 +128,27 @@ public class DataSourceBuilder { private DataSource buildManaged(PoolingDataSource dataSource) { return new ManagedPoolingDataSource(dataSource); } + + private Driver loadDriver() { + + if (driver != null) { + return driver; + } + + Class<?> driverClass; + try { + // note: implicitly using current class's ClassLoader .... + driverClass = Class.forName(driverClassName); + } catch (Exception ex) { + throw new CayenneRuntimeException("Can not load JDBC driver named '" + driverClassName + "': " + + ex.getMessage()); + } + + try { + return (Driver) driverClass.newInstance(); + } catch (Exception ex) { + throw new CayenneRuntimeException("Error instantiating driver '" + driverClassName + "': " + + ex.getMessage()); + } + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/3aa0af9a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java index 4946403..bf43870 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.cayenne.unit.di.server; +import java.sql.Driver; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -66,10 +67,12 @@ public class ServerCaseDataSourceFactory { } private DataSource createDataSource() { - return DataSourceBuilder.builder(objectFactory).driver(dataSourceInfo.getJdbcDriver()) - .url(dataSourceInfo.getDataSourceUrl()).userName(dataSourceInfo.getUserName()) - .password(dataSourceInfo.getPassword()).minConnections(dataSourceInfo.getMinConnections()) - .maxConnections(dataSourceInfo.getMaxConnections()).build(); + Driver driver = objectFactory.newInstance(Driver.class, dataSourceInfo.getJdbcDriver()); + + return DataSourceBuilder.url(dataSourceInfo.getDataSourceUrl()).driver(driver) + .userName(dataSourceInfo.getUserName()).password(dataSourceInfo.getPassword()) + .minConnections(dataSourceInfo.getMinConnections()).maxConnections(dataSourceInfo.getMaxConnections()) + .build(); } }
