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