Author: aadamchik Date: Sun Feb 20 10:23:01 2011 New Revision: 1072546 URL: http://svn.apache.org/viewvc?rev=1072546&view=rev Log: CAY-1542 DI container is not shutting down Cayenne-managed connection pool
preliminary refactoring - shortening the chain of objects not managed by DI that participate in creation of DataSource. Now DataSourceFactory is bound in the DI container directly. Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java - copied, changed from r1072439, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoader.java Removed: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DataSourceFactoryLoader.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoader.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/mock/MockDataSourceFactoryLoader.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DataDomainProvider.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DataDomainProvider.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DataDomainProvider.java?rev=1072546&r1=1072545&r2=1072546&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DataDomainProvider.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DataDomainProvider.java Sun Feb 20 10:23:01 2011 @@ -77,7 +77,7 @@ public class DataDomainProvider implemen protected DbAdapterFactory adapterFactory; @Inject - protected DataSourceFactoryLoader dataSourceFactoryLoader; + protected DataSourceFactory dataSourceFactory; @Inject protected AdhocObjectFactory objectFactory; @@ -179,9 +179,6 @@ public class DataDomainProvider implemen dataNode.setDataSourceLocation(nodeDescriptor.getParameters()); - DataSourceFactory dataSourceFactory = dataSourceFactoryLoader - .getDataSourceFactory(nodeDescriptor); - DataSource dataSource = dataSourceFactory.getDataSource(nodeDescriptor); dataNode.setDataSourceFactory(nodeDescriptor.getDataSourceFactoryType()); Copied: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java (from r1072439, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoader.java) URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoader.java&r1=1072439&r2=1072546&rev=1072546&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoader.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java Sun Feb 20 10:23:01 2011 @@ -18,6 +18,8 @@ ****************************************************************/ package org.apache.cayenne.configuration.server; +import javax.sql.DataSource; + import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.configuration.AdhocObjectFactory; import org.apache.cayenne.configuration.DataNodeDescriptor; @@ -26,27 +28,31 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * A {@link DataSourceFactoryLoader} that loads factories explicitly configured in the - * {@link DataNodeDescriptor}. If the factory class is not explicitly configured, and the - * descriptor has a configuration resource attached to it, - * {@link XMLPoolingDataSourceFactory} is returned. + * A {@link DataSourceFactory} that delegates DataSource creation to another factory, + * which is determined dynamically per DataNodeDescriptor. The delegate class may be + * explicitly defined in the {@link DataNodeDescriptor}. If not, and if the descriptor has + * a configuration resource attached to it, {@link XMLPoolingDataSourceFactory} is used. * <p> * If the environment contains properties <em>cayenne.jdbc.url.domain_name.node_name</em> * (or <em>cayenne.jdbc.url</em>) and <em>cayenne.jdbc.driver.domain_name.node_name</em> - * (or <em>cayenne.jdbc.driver</em>), any DataSourceFactory configured in the project is - * ignored, and the {@link PropertyDataSourceFactory} is returned. + * (or <em>cayenne.jdbc.driver</em>), any DataSourceFactory configured in the + * DataNodeDescriptor is ignored, and the {@link PropertyDataSourceFactory} is used. * * @since 3.1 */ -public class DefaultDataSourceFactoryLoader implements DataSourceFactoryLoader { +public class DelegatingDataSourceFactory implements DataSourceFactory { private static final Log logger = LogFactory - .getLog(DefaultDataSourceFactoryLoader.class); + .getLog(DelegatingDataSourceFactory.class); @Inject protected AdhocObjectFactory objectFactory; - public DataSourceFactory getDataSourceFactory(DataNodeDescriptor nodeDescriptor) { + public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Exception { + return getDataSourceFactory(nodeDescriptor).getDataSource(nodeDescriptor); + } + + protected DataSourceFactory getDataSourceFactory(DataNodeDescriptor nodeDescriptor) { String typeName = null; if (shouldConfigureDataSourceFromProperties(nodeDescriptor)) { Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java?rev=1072546&r1=1072545&r2=1072546&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java Sun Feb 20 10:23:01 2011 @@ -145,9 +145,10 @@ public class ServerModule implements Mod // a global properties object binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class); - // a service to load DataSourceFactories - binder.bind(DataSourceFactoryLoader.class).to( - DefaultDataSourceFactoryLoader.class); + // a service to load DataSourceFactories. DelegatingDataSourceFactory will attempt + // to find the actual worker factory dynamically on each call depending on + // DataNodeDescriptor data and the environment + binder.bind(DataSourceFactory.class).to(DelegatingDataSourceFactory.class); // a default SchemaUpdateStrategy (used when no explicit strategy is specified in // XML) Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java?rev=1072546&r1=1072545&r2=1072546&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java Sun Feb 20 10:23:01 2011 @@ -44,8 +44,6 @@ import org.apache.cayenne.configuration. import org.apache.cayenne.configuration.DefaultRuntimeProperties; import org.apache.cayenne.configuration.RuntimeProperties; import org.apache.cayenne.configuration.mock.MockDataSourceFactory; -import org.apache.cayenne.configuration.mock.MockDataSourceFactoryLoader; -import org.apache.cayenne.configuration.server.DataDomainProvider; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dba.MockDbAdapter; import org.apache.cayenne.dba.oracle.OracleAdapter; @@ -143,8 +141,8 @@ public class DataDomainProviderTest exte } }); - binder.bind(DataSourceFactoryLoader.class).toInstance( - new MockDataSourceFactoryLoader()); + binder.bind(DataSourceFactory.class).toInstance( + new MockDataSourceFactory()); binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class); } }; Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java?rev=1072546&r1=1072545&r2=1072546&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java Sun Feb 20 10:23:01 2011 @@ -29,7 +29,7 @@ import org.apache.cayenne.configuration. import org.apache.cayenne.configuration.DefaultAdhocObjectFactory; import org.apache.cayenne.configuration.mock.MockDataSourceFactory1; import org.apache.cayenne.configuration.server.DataSourceFactory; -import org.apache.cayenne.configuration.server.DefaultDataSourceFactoryLoader; +import org.apache.cayenne.configuration.server.DelegatingDataSourceFactory; import org.apache.cayenne.configuration.server.PropertyDataSourceFactory; import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory; import org.apache.cayenne.conn.DataSourceInfo; @@ -58,7 +58,7 @@ public class DefaultDataSourceFactoryLoa Injector injector = DIBootstrap.createInjector(testModule); - DefaultDataSourceFactoryLoader factoryLoader = new DefaultDataSourceFactoryLoader(); + DelegatingDataSourceFactory factoryLoader = new DelegatingDataSourceFactory(); injector.injectMembers(factoryLoader); DataSourceFactory factory = factoryLoader.getDataSourceFactory(nodeDescriptor); @@ -82,7 +82,7 @@ public class DefaultDataSourceFactoryLoa Injector injector = DIBootstrap.createInjector(testModule); - DefaultDataSourceFactoryLoader factoryLoader = new DefaultDataSourceFactoryLoader(); + DelegatingDataSourceFactory factoryLoader = new DelegatingDataSourceFactory(); injector.injectMembers(factoryLoader); DataSourceFactory factory = factoryLoader.getDataSourceFactory(nodeDescriptor); @@ -117,7 +117,7 @@ public class DefaultDataSourceFactoryLoa properties.put(PropertyDataSourceFactory.JDBC_DRIVER_PROPERTY, "x"); properties.put(PropertyDataSourceFactory.JDBC_URL_PROPERTY, "y"); - DefaultDataSourceFactoryLoader factoryLoader = new DefaultDataSourceFactoryLoader() { + DelegatingDataSourceFactory factoryLoader = new DelegatingDataSourceFactory() { @Override protected String getProperty(String key) {