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();
        }
 
 }

Reply via email to