You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/11/11 09:46:40 UTC

svn commit: r1407926 - in /cayenne/main/trunk/framework: cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/ cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/ cayenne-tools/src/test/java/org...

Author: aadamchik
Date: Sun Nov 11 08:46:38 2012
New Revision: 1407926

URL: http://svn.apache.org/viewvc?rev=1407926&view=rev
Log:
CAY-1758 cdbimport improvements: Default adapter (if none specified) must be AutoAdapter, not JdbcAdapter

fixing a DI error when auto adapter class is passed to the factory explicitly

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactory.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java
    cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/configuration/ToolsModuleTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactory.java?rev=1407926&r1=1407925&r2=1407926&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactory.java Sun Nov 11 08:46:38 2012
@@ -38,8 +38,8 @@ import org.apache.cayenne.di.Provider;
 import org.apache.cayenne.log.JdbcEventLogger;
 
 /**
- * A factory of DbAdapters that either loads user-provided adapter or guesses the adapter
- * type from the database metadata.
+ * A factory of DbAdapters that either loads user-provided adapter or guesses
+ * the adapter type from the database metadata.
  * 
  * @since 3.1
  */
@@ -55,8 +55,7 @@ public class DefaultDbAdapterFactory imp
     protected AdhocObjectFactory objectFactory;
     protected List<DbAdapterDetector> detectors;
 
-    public DefaultDbAdapterFactory(
-            @Inject(Constants.SERVER_ADAPTER_DETECTORS_LIST) List<DbAdapterDetector> detectors) {
+    public DefaultDbAdapterFactory(@Inject(Constants.SERVER_ADAPTER_DETECTORS_LIST) List<DbAdapterDetector> detectors) {
         if (detectors == null) {
             throw new NullPointerException("Null detectors list");
         }
@@ -64,20 +63,24 @@ public class DefaultDbAdapterFactory imp
         this.detectors = detectors;
     }
 
-    public DbAdapter createAdapter(
-            final DataNodeDescriptor nodeDescriptor,
-            final DataSource dataSource) throws Exception {
-        
+    public DbAdapter createAdapter(DataNodeDescriptor nodeDescriptor, final DataSource dataSource) throws Exception {
+
         String adapterType = null;
-        
+
         if (nodeDescriptor != null) {
             adapterType = nodeDescriptor.getAdapterType();
         }
 
+        // must not create AutoAdapter via objectFactory, so treat explicit
+        // AutoAdapter as null and let it fall through to the default. (explicit
+        // AutoAdapter is often passed from the cdbimport pligin).
+        if (adapterType != null && adapterType.equals(AutoAdapter.class.getName())) {
+            adapterType = null;
+        }
+
         if (adapterType != null) {
             return objectFactory.newInstance(DbAdapter.class, adapterType);
-        }
-        else {
+        } else {
             return new AutoAdapter(new Provider<DbAdapter>() {
 
                 public DbAdapter get() {
@@ -98,32 +101,28 @@ public class DefaultDbAdapterFactory imp
 
             try {
                 return detectAdapter(c.getMetaData());
-            }
-            finally {
+            } finally {
                 try {
                     c.close();
-                }
-                catch (SQLException e) {
+                } catch (SQLException e) {
                     // ignore...
                 }
             }
-        }
-        catch (SQLException e) {
-            throw new CayenneRuntimeException("Error detecting database type: "
-                    + e.getLocalizedMessage(), e);
+        } catch (SQLException e) {
+            throw new CayenneRuntimeException("Error detecting database type: " + e.getLocalizedMessage(), e);
         }
     }
 
     protected DbAdapter detectAdapter(DatabaseMetaData metaData) throws SQLException {
-        // iterate in reverse order to allow custom factories to take precedence over the
+        // iterate in reverse order to allow custom factories to take precedence
+        // over the
         // default ones configured in constructor
         for (int i = detectors.size() - 1; i >= 0; i--) {
             DbAdapterDetector detector = detectors.get(i);
             DbAdapter adapter = detector.createAdapter(metaData);
 
             if (adapter != null) {
-                jdbcEventLogger.log("Detected and installed adapter: "
-                        + adapter.getClass().getName());
+                jdbcEventLogger.log("Detected and installed adapter: " + adapter.getClass().getName());
 
                 // TODO: should detector do this??
                 injector.injectMembers(adapter);

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java?rev=1407926&r1=1407925&r2=1407926&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java Sun Nov 11 08:46:38 2012
@@ -83,9 +83,7 @@ public class DefaultDbAdapterFactoryTest
         DefaultDbAdapterFactory factory = new DefaultDbAdapterFactory(detectors);
         injector.injectMembers(factory);
 
-        DbAdapter createdAdapter = factory.createAdapter(
-                new DataNodeDescriptor(),
-                dataSource);
+        DbAdapter createdAdapter = factory.createAdapter(new DataNodeDescriptor(), dataSource);
         assertTrue(createdAdapter instanceof AutoAdapter);
         assertEquals("XXXXX", createdAdapter.createTable(new DbEntity("Test")));
     }
@@ -101,12 +99,11 @@ public class DefaultDbAdapterFactoryTest
                 binder.bindList(Constants.SERVER_DEFAULT_TYPES_LIST);
                 binder.bindList(Constants.SERVER_USER_TYPES_LIST);
                 binder.bindList(Constants.SERVER_TYPE_FACTORIES_LIST);
-                
+
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
-                binder.bind(BatchQueryBuilderFactory.class).toInstance(
-                        mock(BatchQueryBuilderFactory.class));
+                binder.bind(BatchQueryBuilderFactory.class).toInstance(mock(BatchQueryBuilderFactory.class));
             }
         };
 
@@ -115,15 +112,10 @@ public class DefaultDbAdapterFactoryTest
         DefaultDbAdapterFactory factory = new DefaultDbAdapterFactory(detectors);
         injector.injectMembers(factory);
 
-        DbAdapter createdAdapter = factory.createAdapter(
-                new DataNodeDescriptor(),
-                new MockDataSource());
+        DbAdapter createdAdapter = factory.createAdapter(new DataNodeDescriptor(), new MockDataSource());
         assertNotNull(createdAdapter);
-        assertTrue(
-                "Unexpected class: " + createdAdapter.getClass().getName(),
-                createdAdapter instanceof AutoAdapter);
-        assertEquals("CREATE TABLE Test ()", createdAdapter.createTable(new DbEntity(
-                "Test")));
+        assertTrue("Unexpected class: " + createdAdapter.getClass().getName(), createdAdapter instanceof AutoAdapter);
+        assertEquals("CREATE TABLE Test ()", createdAdapter.createTable(new DbEntity("Test")));
     }
 
     public void testCreatedAdapter_Custom() throws Exception {
@@ -140,12 +132,11 @@ public class DefaultDbAdapterFactoryTest
                 binder.bindList(Constants.SERVER_DEFAULT_TYPES_LIST);
                 binder.bindList(Constants.SERVER_USER_TYPES_LIST);
                 binder.bindList(Constants.SERVER_TYPE_FACTORIES_LIST);
-                
+
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
-                binder.bind(BatchQueryBuilderFactory.class).toInstance(
-                        mock(BatchQueryBuilderFactory.class));
+                binder.bind(BatchQueryBuilderFactory.class).toInstance(mock(BatchQueryBuilderFactory.class));
             }
         };
 
@@ -154,12 +145,47 @@ public class DefaultDbAdapterFactoryTest
         DefaultDbAdapterFactory factory = new DefaultDbAdapterFactory(detectors);
         injector.injectMembers(factory);
 
-        DbAdapter createdAdapter = factory.createAdapter(
-                nodeDescriptor,
-                new MockDataSource());
+        DbAdapter createdAdapter = factory.createAdapter(nodeDescriptor, new MockDataSource());
         assertNotNull(createdAdapter);
-        assertTrue(
-                "Unexpected class: " + createdAdapter.getClass().getName(),
-                createdAdapter instanceof SybaseAdapter);
+        assertTrue("Unexpected class: " + createdAdapter.getClass().getName(), createdAdapter instanceof SybaseAdapter);
+    }
+
+    public void testCreatedAdapter_AutoExplicit() throws Exception {
+
+        final DbAdapter adapter = mock(DbAdapter.class);
+        when(adapter.createTable(any(DbEntity.class))).thenReturn("XXXXX");
+
+        List<DbAdapterDetector> detectors = new ArrayList<DbAdapterDetector>();
+        detectors.add(new DbAdapterDetector() {
+
+            public DbAdapter createAdapter(DatabaseMetaData md) throws SQLException {
+                return adapter;
+            }
+        });
+
+        MockConnection connection = new MockConnection();
+
+        MockDataSource dataSource = new MockDataSource();
+        dataSource.setupConnection(connection);
+
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+            }
+        };
+
+        Injector injector = DIBootstrap.createInjector(testModule);
+
+        DefaultDbAdapterFactory factory = new DefaultDbAdapterFactory(detectors);
+        injector.injectMembers(factory);
+
+        DataNodeDescriptor nodeDescriptor = new DataNodeDescriptor();
+        nodeDescriptor.setAdapterType(AutoAdapter.class.getName());
+
+        DbAdapter createdAdapter = factory.createAdapter(nodeDescriptor, dataSource);
+        assertTrue(createdAdapter instanceof AutoAdapter);
+        assertEquals("XXXXX", createdAdapter.createTable(new DbEntity("Test")));
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/configuration/ToolsModuleTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/configuration/ToolsModuleTest.java?rev=1407926&r1=1407925&r2=1407926&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/configuration/ToolsModuleTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/configuration/ToolsModuleTest.java Sun Nov 11 08:46:38 2012
@@ -19,15 +19,20 @@
 package org.apache.cayenne.tools.configuration;
 
 import static org.mockito.Mockito.mock;
+
+import javax.sql.DataSource;
+
 import junit.framework.TestCase;
 
+import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
+import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.configuration.server.DefaultDbAdapterFactory;
+import org.apache.cayenne.dba.AutoAdapter;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
-import org.apache.cayenne.tools.configuration.DriverDataSourceFactory;
-import org.apache.cayenne.tools.configuration.ToolsModule;
 import org.apache.commons.logging.Log;
 
 public class ToolsModuleTest extends TestCase {
@@ -36,9 +41,22 @@ public class ToolsModuleTest extends Tes
 
         Log log = mock(Log.class);
         Injector i = DIBootstrap.createInjector(new ToolsModule(log));
-        
+
         assertSame(log, i.getInstance(Log.class));
         assertTrue(i.getInstance(DataSourceFactory.class) instanceof DriverDataSourceFactory);
         assertTrue(i.getInstance(AdhocObjectFactory.class) instanceof DefaultAdhocObjectFactory);
+        assertTrue(i.getInstance(DbAdapterFactory.class) instanceof DefaultDbAdapterFactory);
+    }
+
+    public void testDbApdater() throws Exception {
+        Log log = mock(Log.class);
+        Injector i = DIBootstrap.createInjector(new ToolsModule(log));
+
+        DbAdapterFactory factory = i.getInstance(DbAdapterFactory.class);
+
+        DataNodeDescriptor nodeDescriptor = mock(DataNodeDescriptor.class);
+        DataSource dataSource = mock(DataSource.class);
+
+        assertTrue(factory.createAdapter(nodeDescriptor, dataSource) instanceof AutoAdapter);
     }
 }