Repository: cayenne
Updated Branches:
  refs/heads/master 07f535bed -> a811b44e5


CAY-2115 DbLoader - allow loading DataMap without Obj layer

* refactoring DbMerger... removing DB operations from it


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/d6aa9144
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/d6aa9144
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/d6aa9144

Branch: refs/heads/master
Commit: d6aa91449139388063fa14da32abe7d3712609f2
Parents: 07f535b
Author: Andrus Adamchik <and...@objectstyle.com>
Authored: Mon Oct 3 18:49:03 2016 +0300
Committer: Andrus Adamchik <and...@objectstyle.com>
Committed: Mon Oct 3 18:50:06 2016 +0300

----------------------------------------------------------------------
 .../apache/cayenne/dbsync/merge/DbMerger.java   | 59 +++-----------------
 .../dbsync/merge/EmptyValueForNullProvider.java | 12 ++--
 .../dbsync/merge/ValueForNullProvider.java      | 13 ++---
 .../cayenne/dbsync/merge/DbMergerTest.java      |  2 +-
 .../apache/cayenne/dbsync/merge/MergeCase.java  | 19 ++++++-
 .../tools/dbimport/DefaultDbImportAction.java   |  3 +-
 .../modeler/dialog/db/MergerOptions.java        | 35 +++++++++---
 7 files changed, 68 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
index f89dd00..605b6af 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
@@ -18,14 +18,9 @@
  */
 package org.apache.cayenne.dbsync.merge;
 
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
-import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
@@ -34,12 +29,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.DetectedDbEntity;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.SQLException;
 import java.sql.Types;
 import java.util.Collection;
 import java.util.Collections;
@@ -47,6 +37,7 @@ import java.util.Comparator;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -56,19 +47,12 @@ import java.util.Set;
  */
 public class DbMerger {
 
-    private static final Log LOGGER = LogFactory.getLog(DbMerger.class);
-
     private final MergerTokenFactory factory;
-
     private final ValueForNullProvider valueForNull;
 
-    public DbMerger(MergerTokenFactory factory) {
-        this(factory, null);
-    }
-
     public DbMerger(MergerTokenFactory factory, ValueForNullProvider 
valueForNull) {
-        this.factory = factory;
-        this.valueForNull = valueForNull == null ? new 
EmptyValueForNullProvider() : valueForNull;
+        this.factory = Objects.requireNonNull(factory);
+        this.valueForNull = Objects.requireNonNull(valueForNull);
     }
 
     /**
@@ -115,15 +99,6 @@ public class DbMerger {
      * Create and return a {@link List} of {@link MergerToken}s to alter the
      * given {@link DataNode} to match the given {@link DataMap}
      */
-    public List<MergerToken> createMergeTokens(DataSource dataSource, 
DbAdapter adapter, DataMap existingDataMap,
-                                               DbLoaderConfiguration config) {
-        return createMergeTokens(existingDataMap, 
loadDataMapFromDb(dataSource, adapter, config), config);
-    }
-
-    /**
-     * Create and return a {@link List} of {@link MergerToken}s to alter the
-     * given {@link DataNode} to match the given {@link DataMap}
-     */
     public List<MergerToken> createMergeTokens(DataMap existing, DataMap 
loadedFomDb, DbLoaderConfiguration config) {
 
         
loadedFomDb.setQuotingSQLIdentifiers(existing.isQuotingSQLIdentifiers());
@@ -157,30 +132,12 @@ public class DbMerger {
         return existingFiltered;
     }
 
-    protected EntityMergeSupport createEntityMergeSupport() {
-        return new EntityMergeSupport(new DefaultObjectNameGenerator(), true, 
true);
-    }
-
-    private DataMap loadDataMapFromDb(DataSource dataSource, DbAdapter 
adapter, DbLoaderConfiguration config) {
-
-
-        try (Connection conn = dataSource.getConnection();) {
-
-            return new DbLoader(conn,
-                    adapter,
-                    new LoggingDbLoaderDelegate(LOGGER),
-                    createEntityMergeSupport()).load(config);
+    protected List<MergerToken> createMergeTokens(Collection<DbEntity> 
existing,
+                                                  Collection<DbEntity> 
loadedFromDb,
+                                                  DbLoaderConfiguration 
config) {
+        Collection<DbEntity> dbEntitiesToDrop = new LinkedList<>(loadedFromDb);
 
-        } catch (SQLException e) {
-            throw new CayenneRuntimeException("Can't doLoad dataMap from db.", 
e);
-        }
-    }
-
-    public List<MergerToken> createMergeTokens(Collection<DbEntity> existing, 
Collection<DbEntity> loadedFromDb,
-                                               DbLoaderConfiguration config) {
-        Collection<DbEntity> dbEntitiesToDrop = new 
LinkedList<DbEntity>(loadedFromDb);
-
-        List<MergerToken> tokens = new LinkedList<MergerToken>();
+        List<MergerToken> tokens = new LinkedList<>();
         for (DbEntity dbEntity : existing) {
             String tableName = dbEntity.getName();
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EmptyValueForNullProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EmptyValueForNullProvider.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EmptyValueForNullProvider.java
index a484655..84a396b 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EmptyValueForNullProvider.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EmptyValueForNullProvider.java
@@ -18,16 +18,18 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge;
 
-import java.util.Collections;
-import java.util.List;
-
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
- * A dummy {@link ValueForNullProvider} that are not able to provide any values
+ * A dummy {@link ValueForNullProvider} that are not able to provide any 
values.
+ *
+ * @since 4.0
  */
-class EmptyValueForNullProvider implements ValueForNullProvider {
+public class EmptyValueForNullProvider implements ValueForNullProvider {
 
     public List<String> createSql(DbEntity entity, DbAttribute column) {
         return Collections.emptyList();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ValueForNullProvider.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ValueForNullProvider.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ValueForNullProvider.java
index a07efff..6bbd68a 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ValueForNullProvider.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ValueForNullProvider.java
@@ -18,25 +18,24 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge;
 
-import java.util.List;
-
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 
+import java.util.List;
+
 /**
- * Class that will be used to set value for null on not
- * null columns
+ * Class that will be used to set value for null on not null columns
  */
 public interface ValueForNullProvider {
-    
+
     /**
      * @return true if there exist a value that should be inserted for null 
values
      */
-    public boolean hasValueFor(DbEntity entity, DbAttribute column);
+    boolean hasValueFor(DbEntity entity, DbAttribute column);
 
     /**
      * @return a {@link List} of sql to set value for null
      */
-    public List<String> createSql(DbEntity entity, DbAttribute column);
+    List<String> createSql(DbEntity entity, DbAttribute column);
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
index a695d2d..ea6be7d 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DbMergerTest.java
@@ -252,7 +252,7 @@ public class DbMergerTest {
     }
 
     private DbMerger dbMerger() {
-        return new DbMerger(factory());
+        return new DbMerger(factory(), new EmptyValueForNullProvider());
     }
 
     private HSQLMergerTokenFactory factory() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
index ac68802..7706c2f 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
@@ -18,12 +18,16 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
@@ -43,6 +47,7 @@ import org.apache.commons.logging.LogFactory;
 import org.junit.Before;
 
 import java.sql.Connection;
+import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
 import java.util.ArrayList;
@@ -103,7 +108,19 @@ public abstract class MergeCase extends DbSyncCase {
         loaderConfiguration.setFiltersConfig(FiltersConfig.create(null, null,
                 TableFilter.include("ARTIST|GALLERY|PAINTING|NEW_TABLE2?"), 
PatternFilter.INCLUDE_NOTHING));
 
-        return createMerger().createMergeTokens(node.getDataSource(), 
node.getAdapter(), map, loaderConfiguration);
+        DataMap dbImport;
+        try (Connection conn = node.getDataSource().getConnection();) {
+            dbImport =  new DbLoader(conn,
+                    node.getAdapter(),
+                    new 
LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
+                    new EntityMergeSupport(new DefaultObjectNameGenerator(), 
true, true))
+                    .load(loaderConfiguration);
+
+        } catch (SQLException e) {
+            throw new CayenneRuntimeException("Can't doLoad dataMap from db.", 
e);
+        }
+
+        return createMerger().createMergeTokens(map, dbImport, 
loaderConfiguration);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
----------------------------------------------------------------------
diff --git 
a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
 
b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
index 6ec486e..fd40673 100644
--- 
a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
+++ 
b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.AbstractToModelToken;
 import org.apache.cayenne.dbsync.merge.AddRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.DbMerger;
+import org.apache.cayenne.dbsync.merge.EmptyValueForNullProvider;
 import org.apache.cayenne.dbsync.merge.MergerContext;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.MergerToken;
@@ -143,7 +144,7 @@ public class DefaultDbImportAction implements 
DbImportAction {
         } else {
             MergerTokenFactory mergerTokenFactory = 
mergerTokenFactoryProvider.get(adapter);
 
-            List<MergerToken> mergeTokens = new DbMerger(mergerTokenFactory)
+            List<MergerToken> mergeTokens = new DbMerger(mergerTokenFactory, 
new EmptyValueForNullProvider())
                     .createMergeTokens(existing, loadedFomDb, 
config.getDbLoaderConfig());
             if (mergeTokens.isEmpty()) {
                 logger.info("");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6aa9144/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
index 271fd9b..b00aed8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
@@ -19,18 +19,24 @@
 
 package org.apache.cayenne.modeler.dialog.db;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.dba.JdbcAdapter;
 import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
 import org.apache.cayenne.dbsync.merge.DbMerger;
+import org.apache.cayenne.dbsync.merge.EmptyValueForNullProvider;
+import org.apache.cayenne.dbsync.merge.EntityMergeSupport;
 import org.apache.cayenne.dbsync.merge.MergeDirection;
 import org.apache.cayenne.dbsync.merge.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.MergerToken;
 import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
@@ -55,6 +61,7 @@ import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.validation.ValidationResult;
+import org.apache.commons.logging.LogFactory;
 
 import javax.sql.DataSource;
 import javax.swing.*;
@@ -65,6 +72,8 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.Iterator;
 import java.util.List;
 
@@ -78,7 +87,6 @@ public class MergerOptions extends CayenneController {
     protected JdbcAdapter adapter;
     protected String textForSQL;
 
-    protected DbMerger merger;
     protected MergerTokenSelectorController tokens;
     protected String defaultSchema;
     private MergerTokenFactoryProvider mergerTokenFactoryProvider;
@@ -159,17 +167,26 @@ public class MergerOptions extends CayenneController {
             MergerTokenFactory mergerTokenFactory = 
mergerTokenFactoryProvider.get(adapter);
 
             tokens.setMergerTokenFactory(mergerTokenFactory);
-            merger = new DbMerger(mergerTokenFactory);
+            DbMerger merger = new DbMerger(mergerTokenFactory, new 
EmptyValueForNullProvider());
 
             DbLoaderConfiguration config = new DbLoaderConfiguration();
             config.setFiltersConfig(FiltersConfig.create(null, defaultSchema, 
TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
 
-            List<MergerToken> mergerTokens = merger.createMergeTokens(
-                    
connectionInfo.makeDataSource(getApplication().getClassLoadingService()),
-                    adapter,
-                    dataMap,
-                    config);
-            tokens.setTokens(mergerTokens);
+            DataSource dataSource  = 
connectionInfo.makeDataSource(getApplication().getClassLoadingService());
+
+            DataMap dbImport;
+            try (Connection conn = dataSource.getConnection();) {
+                dbImport =  new DbLoader(conn,
+                        adapter,
+                        new 
LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
+                        new EntityMergeSupport(new 
DefaultObjectNameGenerator(), true, true))
+                        .load(config);
+
+            } catch (SQLException e) {
+                throw new CayenneRuntimeException("Can't doLoad dataMap from 
db.", e);
+            }
+
+            tokens.setTokens(merger.createMergeTokens(dataMap, dbImport, 
config));
         } catch (Exception ex) {
             reportError("Error loading adapter", ex);
         }

Reply via email to