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 2016/12/14 19:12:48 UTC

[12/16] cayenne git commit: CAY-2169 - split Tokens to model and db packages - all tests are passing - fix SQL syntax for HSQLDB allow column NULL value - fix some problems with tokens sort, but still it's far from perfect (see CAY-2170)

CAY-2169
 - split Tokens to model and db packages
 - all tests are passing
 - fix SQL syntax for HSQLDB allow column NULL value
 - fix some problems with tokens sort, but still it's far from perfect (see CAY-2170)


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

Branch: refs/heads/master
Commit: 725e6ae94edf35a6d0340ecd5d09a91da4904dfc
Parents: d5707c7
Author: Nikita Timofeev <st...@gmail.com>
Authored: Mon Dec 12 17:35:43 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Mon Dec 12 17:35:43 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/DataMapMerger.java     |   2 +-
 .../cayenne/dbsync/merge/DbAttributeMerger.java |   8 +-
 .../dbsync/merge/DbEntityDictionary.java        |   3 +-
 .../cayenne/dbsync/merge/DbEntityMerger.java    |  11 +-
 .../merge/factory/DB2MergerTokenFactory.java    |   2 +-
 .../factory/DefaultMergerTokenFactory.java      |  42 ++--
 .../merge/factory/DerbyMergerTokenFactory.java  |   6 +-
 .../factory/FirebirdMergerTokenFactory.java     |   8 +-
 .../merge/factory/H2MergerTokenFactory.java     |   6 +-
 .../merge/factory/HSQLMergerTokenFactory.java   |   8 +-
 .../merge/factory/IngresMergerTokenFactory.java |  12 +-
 .../merge/factory/MySQLMergerTokenFactory.java  |  10 +-
 .../factory/OpenBaseMergerTokenFactory.java     |  10 +-
 .../merge/factory/OracleMergerTokenFactory.java |   8 +-
 .../factory/PostgresMergerTokenFactory.java     |   4 +-
 .../factory/SQLServerMergerTokenFactory.java    |   8 +-
 .../merge/factory/SybaseMergerTokenFactory.java |  10 +-
 .../dbsync/merge/token/AbstractToDbToken.java   | 133 -----------
 .../merge/token/AbstractToModelToken.java       | 128 ----------
 .../dbsync/merge/token/AddColumnToDb.java       |  74 ------
 .../dbsync/merge/token/AddColumnToModel.java    |  55 -----
 .../dbsync/merge/token/AddRelationshipToDb.java |  88 -------
 .../merge/token/AddRelationshipToModel.java     |  91 -------
 .../dbsync/merge/token/CreateTableToDb.java     |  88 -------
 .../dbsync/merge/token/CreateTableToModel.java  | 100 --------
 .../dbsync/merge/token/DropColumnToDb.java      |  62 -----
 .../dbsync/merge/token/DropColumnToModel.java   |  79 ------
 .../merge/token/DropRelationshipToDb.java       |  84 -------
 .../merge/token/DropRelationshipToModel.java    |  51 ----
 .../dbsync/merge/token/DropTableToDb.java       |  52 ----
 .../dbsync/merge/token/DropTableToModel.java    |  53 -----
 .../dbsync/merge/token/DummyReverseToken.java   |   2 +-
 .../dbsync/merge/token/SetAllowNullToDb.java    |  59 -----
 .../dbsync/merge/token/SetAllowNullToModel.java |  47 ----
 .../dbsync/merge/token/SetColumnTypeToDb.java   | 112 ---------
 .../merge/token/SetColumnTypeToModel.java       |  97 --------
 .../dbsync/merge/token/SetNotNullToDb.java      |  53 -----
 .../dbsync/merge/token/SetNotNullToModel.java   |  47 ----
 .../dbsync/merge/token/SetPrimaryKeyToDb.java   |  88 -------
 .../merge/token/SetPrimaryKeyToModel.java       |  82 -------
 .../dbsync/merge/token/SetValueForNullToDb.java |  49 ----
 .../dbsync/merge/token/TokenComparator.java     |  14 +-
 .../merge/token/db/AbstractToDbToken.java       | 134 +++++++++++
 .../dbsync/merge/token/db/AddColumnToDb.java    |  76 ++++++
 .../merge/token/db/AddRelationshipToDb.java     |  84 +++++++
 .../dbsync/merge/token/db/CreateTableToDb.java  |  89 +++++++
 .../dbsync/merge/token/db/DropColumnToDb.java   |  63 +++++
 .../merge/token/db/DropRelationshipToDb.java    |  85 +++++++
 .../dbsync/merge/token/db/DropTableToDb.java    |  53 +++++
 .../dbsync/merge/token/db/SetAllowNullToDb.java |  60 +++++
 .../merge/token/db/SetColumnTypeToDb.java       | 113 +++++++++
 .../dbsync/merge/token/db/SetNotNullToDb.java   |  54 +++++
 .../merge/token/db/SetPrimaryKeyToDb.java       |  89 +++++++
 .../merge/token/db/SetValueForNullToDb.java     |  52 ++++
 .../merge/token/model/AbstractToModelToken.java | 129 ++++++++++
 .../merge/token/model/AddColumnToModel.java     |  56 +++++
 .../token/model/AddRelationshipToModel.java     |  92 +++++++
 .../merge/token/model/CreateTableToModel.java   | 101 ++++++++
 .../merge/token/model/DropColumnToModel.java    |  80 +++++++
 .../token/model/DropRelationshipToModel.java    |  52 ++++
 .../merge/token/model/DropTableToModel.java     |  54 +++++
 .../merge/token/model/SetAllowNullToModel.java  |  48 ++++
 .../merge/token/model/SetColumnTypeToModel.java |  98 ++++++++
 .../merge/token/model/SetNotNullToModel.java    |  48 ++++
 .../merge/token/model/SetPrimaryKeyToModel.java |  83 +++++++
 .../dbsync/merge/AddColumnToModelIT.java        | 100 --------
 .../dbsync/merge/CreateTableToModelIT.java      | 100 --------
 .../cayenne/dbsync/merge/DataMapMergerTest.java |   2 +-
 .../dbsync/merge/DropColumnToModelIT.java       | 238 -------------------
 .../dbsync/merge/DropRelationshipToModelIT.java | 193 ---------------
 .../dbsync/merge/DropTableToModelIT.java        |  96 --------
 .../apache/cayenne/dbsync/merge/MergeCase.java  |   6 +-
 .../dbsync/merge/SetAllowNullToDbIT.java        |  66 -----
 .../cayenne/dbsync/merge/SetNotNullToDbIT.java  |  62 -----
 .../dbsync/merge/SetPrimaryKeyToDbIT.java       |  58 -----
 .../dbsync/merge/TokenComparatorTest.java       | 115 ---------
 .../cayenne/dbsync/merge/TokensReverseTest.java |  91 -------
 .../merge/TokensToModelExecutionTest.java       |  81 -------
 .../cayenne/dbsync/merge/ValueForNullIT.java    | 127 ----------
 .../dbsync/merge/token/TokenComparatorTest.java | 113 +++++++++
 .../dbsync/merge/token/TokensReverseTest.java   |  90 +++++++
 .../merge/token/TokensToModelExecutionTest.java |  82 +++++++
 .../dbsync/merge/token/ValueForNullIT.java      | 129 ++++++++++
 .../merge/token/db/SetAllowNullToDbIT.java      |  68 ++++++
 .../dbsync/merge/token/db/SetNotNullToDbIT.java |  64 +++++
 .../merge/token/db/SetPrimaryKeyToDbIT.java     |  60 +++++
 .../merge/token/model/AddColumnToModelIT.java   | 101 ++++++++
 .../merge/token/model/CreateTableToModelIT.java | 100 ++++++++
 .../merge/token/model/DropColumnToModelIT.java  | 238 +++++++++++++++++++
 .../token/model/DropRelationshipToModelIT.java  | 192 +++++++++++++++
 .../merge/token/model/DropTableToModelIT.java   |  97 ++++++++
 .../tools/dbimport/DefaultDbImportAction.java   |   2 +-
 .../dbimport/DefaultDbImportActionTest.java     |  12 +-
 .../modeler/dialog/db/MergerOptions.java        |   2 +-
 94 files changed, 3240 insertions(+), 3184 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
index ce49565..a4dac01 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
@@ -60,8 +60,8 @@ public class DataMapMerger implements Merger<DataMap> {
         prepare(original, importedFromDb);
 
         createDbEntityMerger(original, importedFromDb);
-        createAttributeMerger(original, importedFromDb);
         createRelationshipMerger(original, importedFromDb);
+        createAttributeMerger(original, importedFromDb);
 
         return createTokens();
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
index caee8e4..5c37489 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge;
 
+import java.sql.Types;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -125,7 +126,12 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
         }
 
         if(original.getMaxLength() != imported.getMaxLength()) {
-            return true;
+            int[] typesWithMaxLength = {Types.NCHAR, Types.NVARCHAR, Types.CHAR, Types.VARCHAR};
+            for(int type : typesWithMaxLength) {
+                if(original.getType() == type) {
+                    return true;
+                }
+            }
         }
 
         if(original.getScale() != imported.getScale()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityDictionary.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityDictionary.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityDictionary.java
index 8f2068b..82b6a61 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityDictionary.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityDictionary.java
@@ -40,7 +40,8 @@ class DbEntityDictionary extends MergerDictionary<DbEntity> {
 
     @Override
     String getName(DbEntity entity) {
-        return entity.getFullyQualifiedName();
+//        return entity.getFullyQualifiedName();
+        return entity.getName();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
index e6a0247..9f7a7c6 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.dbsync.merge;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -32,6 +33,7 @@ import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.DetectedDbEntity;
 
 class DbEntityMerger extends AbstractMerger<DataMap, DbEntity> {
@@ -74,7 +76,14 @@ class DbEntityMerger extends AbstractMerger<DataMap, DbEntity> {
      */
     @Override
     Collection<MergerToken> createTokensForMissingImported(DbEntity original) {
-        return Collections.singleton(getTokenFactory().createCreateTableToDb(original));
+        Collection<MergerToken> tokens = new LinkedList<>();
+        // add entity
+        tokens.add(getTokenFactory().createCreateTableToDb(original));
+        // add it's relationships
+        for (DbRelationship rel : original.getRelationships()) {
+            tokens.add(getTokenFactory().createAddRelationshipToDb(original, rel));
+        }
+        return tokens;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
index 5100184..04669f0 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
@@ -20,7 +20,7 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
index 80121fe..54132f1 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
@@ -18,29 +18,29 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
-import org.apache.cayenne.dbsync.merge.token.AddColumnToDb;
-import org.apache.cayenne.dbsync.merge.token.AddColumnToModel;
-import org.apache.cayenne.dbsync.merge.token.AddRelationshipToDb;
-import org.apache.cayenne.dbsync.merge.token.AddRelationshipToModel;
-import org.apache.cayenne.dbsync.merge.token.CreateTableToDb;
-import org.apache.cayenne.dbsync.merge.token.CreateTableToModel;
-import org.apache.cayenne.dbsync.merge.token.DropColumnToDb;
-import org.apache.cayenne.dbsync.merge.token.DropColumnToModel;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToDb;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToModel;
-import org.apache.cayenne.dbsync.merge.token.DropTableToDb;
-import org.apache.cayenne.dbsync.merge.token.DropTableToModel;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToModel;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToModel;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToModel;
-import org.apache.cayenne.dbsync.merge.token.SetPrimaryKeyToDb;
-import org.apache.cayenne.dbsync.merge.token.SetPrimaryKeyToModel;
-import org.apache.cayenne.dbsync.merge.token.SetValueForNullToDb;
 import org.apache.cayenne.dbsync.merge.token.ValueForNullProvider;
+import org.apache.cayenne.dbsync.merge.token.db.AddColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.AddRelationshipToDb;
+import org.apache.cayenne.dbsync.merge.token.db.CreateTableToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropTableToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetValueForNullToDb;
+import org.apache.cayenne.dbsync.merge.token.model.AddColumnToModel;
+import org.apache.cayenne.dbsync.merge.token.model.AddRelationshipToModel;
+import org.apache.cayenne.dbsync.merge.token.model.CreateTableToModel;
+import org.apache.cayenne.dbsync.merge.token.model.DropColumnToModel;
+import org.apache.cayenne.dbsync.merge.token.model.DropRelationshipToModel;
+import org.apache.cayenne.dbsync.merge.token.model.DropTableToModel;
+import org.apache.cayenne.dbsync.merge.token.model.SetAllowNullToModel;
+import org.apache.cayenne.dbsync.merge.token.model.SetColumnTypeToModel;
+import org.apache.cayenne.dbsync.merge.token.model.SetNotNullToModel;
+import org.apache.cayenne.dbsync.merge.token.model.SetPrimaryKeyToModel;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
index 8979fa0..b91234d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
@@ -21,9 +21,9 @@ package org.apache.cayenne.dbsync.merge.factory;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
index ce94ba0..fe36898 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
@@ -21,11 +21,11 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.token.AddColumnToDb;
-import org.apache.cayenne.dbsync.merge.token.DropColumnToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.AddColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
index 803921c..c2d0e5f 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
@@ -22,9 +22,9 @@ package org.apache.cayenne.dbsync.merge.factory;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetPrimaryKeyToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
index d168118..5816871 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
@@ -21,9 +21,9 @@ package org.apache.cayenne.dbsync.merge.factory;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetPrimaryKeyToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 
@@ -59,7 +59,7 @@ public class HSQLMergerTokenFactory extends DefaultMergerTokenFactory {
                 QuotingStrategy context = adapter.getQuotingStrategy();
 
                 return Collections.singletonList("ALTER TABLE " + context.quotedFullyQualifiedName(getEntity())
-                        + " ALTER COLUMN " + context.quotedName(getColumn()) + " NULL");
+                        + " ALTER COLUMN " + context.quotedName(getColumn()) + " SET NULL");
             }
 
         };

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
index 4dc715e..89e329b 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
@@ -20,13 +20,13 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.token.AddRelationshipToDb;
-import org.apache.cayenne.dbsync.merge.token.DropColumnToDb;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.AddRelationshipToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
index 1d4ab9f..ad49bc0 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
@@ -20,12 +20,12 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetPrimaryKeyToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OpenBaseMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OpenBaseMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OpenBaseMergerTokenFactory.java
index 19fa0b9..88a3eb0 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OpenBaseMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OpenBaseMergerTokenFactory.java
@@ -19,12 +19,12 @@
 package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.token.CreateTableToDb;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.CreateTableToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
index 865e5a7..26236ad 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
@@ -20,11 +20,11 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.token.AddColumnToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.AddColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
index a14b99d..c85cfdf 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
@@ -19,10 +19,10 @@
 package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.QuotingStrategy;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
 
 public class PostgresMergerTokenFactory extends DefaultMergerTokenFactory {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
index 00673ad..a15558d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
@@ -20,11 +20,11 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.token.AddColumnToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.AddColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
index 48b5a22..14238ad 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
@@ -20,12 +20,12 @@ package org.apache.cayenne.dbsync.merge.factory;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.token.AddColumnToDb;
-import org.apache.cayenne.dbsync.merge.token.DropColumnToDb;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.merge.token.SetAllowNullToDb;
-import org.apache.cayenne.dbsync.merge.token.SetColumnTypeToDb;
-import org.apache.cayenne.dbsync.merge.token.SetNotNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.AddColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.DropColumnToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToDbToken.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToDbToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToDbToken.java
deleted file mode 100644
index b054ddb..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToDbToken.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.context.MergeDirection;
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.log.JdbcEventLogger;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.validation.SimpleValidationFailure;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.List;
-
-/**
- * Common abstract superclass for all {@link MergerToken}s going from the model
- * to the database.
- */
-public abstract class AbstractToDbToken implements MergerToken, Comparable<MergerToken> {
-
-	private final String tokenName;
-
-	protected AbstractToDbToken(String tokenName) {
-		this.tokenName = tokenName;
-	}
-
-	@Override
-	public final String getTokenName() {
-		return tokenName;
-	}
-
-	@Override
-	public final MergeDirection getDirection() {
-		return MergeDirection.TO_DB;
-	}
-
-	@Override
-	public void execute(MergerContext mergerContext) {
-		for (String sql : createSql(mergerContext.getDataNode().getAdapter())) {
-			executeSql(mergerContext, sql);
-		}
-	}
-
-	protected void executeSql(MergerContext mergerContext, String sql) {
-		JdbcEventLogger logger = mergerContext.getDataNode().getJdbcEventLogger();
-		logger.log(sql);
-
-		try (Connection conn = mergerContext.getDataNode().getDataSource().getConnection();) {
-
-			try (Statement st = conn.createStatement();) {
-				st.execute(sql);
-			}
-		} catch (SQLException e) {
-			mergerContext.getValidationResult().addFailure(new SimpleValidationFailure(sql, e.getMessage()));
-			logger.logQueryError(e);
-		}
-	}
-
-	@Override
-	public String toString() {
-		return getTokenName() + ' ' + getTokenValue() + ' ' + getDirection();
-	}
-
-	public boolean isEmpty() {
-		return false;
-	}
-
-	public abstract List<String> createSql(DbAdapter adapter);
-
-	abstract static class Entity extends AbstractToDbToken {
-
-		private DbEntity entity;
-
-		public Entity(String tokenName, DbEntity entity) {
-			super(tokenName);
-			this.entity = entity;
-		}
-
-		public DbEntity getEntity() {
-			return entity;
-		}
-
-		public String getTokenValue() {
-			return getEntity().getName();
-		}
-
-		public int compareTo(MergerToken o) {
-			// default order as tokens are created
-			return 0;
-		}
-
-	}
-
-	abstract static class EntityAndColumn extends Entity {
-
-		private DbAttribute column;
-
-		public EntityAndColumn(String tokenName, DbEntity entity, DbAttribute column) {
-			super(tokenName, entity);
-			this.column = column;
-		}
-
-		public DbAttribute getColumn() {
-			return column;
-		}
-
-		@Override
-		public String getTokenValue() {
-			return getEntity().getName() + "." + getColumn().getName();
-		}
-
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToModelToken.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToModelToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToModelToken.java
deleted file mode 100644
index f61067e..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractToModelToken.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.MergeDirection;
-import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-
-/**
- * Common abstract superclass for all {@link MergerToken}s going from the database to the
- * model.
- */
-public abstract class AbstractToModelToken implements MergerToken {
-
-    private final String tokenName;
-
-    protected AbstractToModelToken(String tokenName) {
-        this.tokenName = tokenName;
-    }
-
-    protected static void remove(ModelMergeDelegate mergerContext, DbRelationship rel, boolean reverse) {
-        if (rel == null) {
-            return;
-        }
-        if (reverse) {
-            remove(mergerContext, rel.getReverseRelationship(), false);
-        }
-
-        DbEntity dbEntity = rel.getSourceEntity();
-        for (ObjEntity objEntity : dbEntity.mappedObjEntities()) {
-            remove(mergerContext, objEntity.getRelationshipForDbRelationship(rel), true);
-        }
-
-        rel.getSourceEntity().removeRelationship(rel.getName());
-        mergerContext.dbRelationshipRemoved(rel);
-    }
-
-    protected static void remove(ModelMergeDelegate mergerContext, ObjRelationship rel, boolean reverse) {
-        if (rel == null) {
-            return;
-        }
-        if (reverse) {
-            remove(mergerContext, rel.getReverseRelationship(), false);
-        }
-        rel.getSourceEntity().removeRelationship(rel.getName());
-        mergerContext.objRelationshipRemoved(rel);
-    }
-
-    @Override
-    public final String getTokenName() {
-        return tokenName;
-    }
-
-    @Override
-    public final MergeDirection getDirection() {
-        return MergeDirection.TO_MODEL;
-    }
-
-    @Override
-    public String toString() {
-        return getTokenName() + ' ' + getTokenValue() + ' ' + getDirection();
-    }
-
-    public boolean isEmpty() {
-        return false;
-    }
-
-    abstract static class Entity extends AbstractToModelToken {
-
-        private final DbEntity entity;
-
-        protected Entity(String tokenName, DbEntity entity) {
-            super(tokenName);
-            this.entity = entity;
-        }
-
-        public DbEntity getEntity() {
-            return entity;
-        }
-
-        public String getTokenValue() {
-            return getEntity().getName();
-        }
-
-    }
-
-    abstract static class EntityAndColumn extends Entity {
-
-        private final DbAttribute column;
-
-        protected EntityAndColumn(String tokenName, DbEntity entity, DbAttribute column) {
-            super(tokenName, entity);
-            this.column = column;
-        }
-
-        public DbAttribute getColumn() {
-            return column;
-        }
-
-        @Override
-        public String getTokenValue() {
-            return getEntity().getName() + "." + getColumn().getName();
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToDb.java
deleted file mode 100644
index 19ac1ce..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToDb.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-
-import java.util.Collections;
-import java.util.List;
-
-public class AddColumnToDb extends AbstractToDbToken.EntityAndColumn {
-
-    public AddColumnToDb(DbEntity entity, DbAttribute column) {
-        super("Add Column", entity, column);
-    }
-
-    /**
-     * append the part of the token before the actual column data type
-     */
-    protected void appendPrefix(StringBuffer sqlBuffer, QuotingStrategy context) {
-
-        sqlBuffer.append("ALTER TABLE ");
-        sqlBuffer.append(context.quotedFullyQualifiedName(getEntity()));
-        sqlBuffer.append(" ADD COLUMN ");
-        sqlBuffer.append(context.quotedName(getColumn()));
-        sqlBuffer.append(" ");
-    }
-
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        StringBuffer sqlBuffer = new StringBuffer();
-        QuotingStrategy context = adapter.getQuotingStrategy();
-        appendPrefix(sqlBuffer, context);
-
-        sqlBuffer.append(JdbcAdapter.getType(adapter, getColumn()));
-        sqlBuffer.append(JdbcAdapter.sizeAndPrecision(adapter, getColumn()));
-
-        return Collections.singletonList(sqlBuffer.toString());
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createDropColumnToModel(getEntity(), getColumn());
-    }
-
-    @Override
-    public int compareTo(MergerToken o) {
-        // add all AddRelationshipToDb to the end.
-        if (o instanceof AddRelationshipToDb) {
-            return -1;
-        }
-        return super.compareTo(o);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToModel.java
deleted file mode 100644
index e68d271..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddColumnToModel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * A {@link MergerToken} to add a {@link DbAttribute} to a {@link DbEntity}. The
- * {@link EntityMergeSupport} will be used to update the mapped {@link ObjEntity}
- */
-public class AddColumnToModel extends AbstractToModelToken.EntityAndColumn {
-
-    public AddColumnToModel(DbEntity entity, DbAttribute column) {
-        super("Add Column", entity, column);
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createDropColumnToDb(getEntity(), getColumn());
-    }
-
-    @Override
-    public void execute(MergerContext mergerContext) {
-        getEntity().addAttribute(getColumn());
-
-        for (ObjEntity e : getEntity().mappedObjEntities()) {
-            mergerContext.getEntityMergeSupport().synchronizeOnDbAttributeAdded(e, getColumn());
-        }
-
-        mergerContext.getDelegate().dbAttributeAdded(getColumn());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToDb.java
deleted file mode 100644
index 2d19422..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToDb.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.access.DbGenerator;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-
-import java.util.Collections;
-import java.util.List;
-
-public class AddRelationshipToDb extends AbstractToDbToken.Entity {
-
-    private DbRelationship relationship;
-
-    public AddRelationshipToDb(DbEntity entity, DbRelationship relationship) {
-        super("Add foreign key", entity);
-        this.relationship = relationship;
-    }
-
-    /**
-     * @see DbGenerator#createConstraintsQueries(org.apache.cayenne.map.DbEntity)
-     */
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        // TODO: skip FK to a different DB
-        if (!this.isEmpty()) {
-            String fksql = adapter.createFkConstraint(relationship);
-            if (fksql != null) {
-                return Collections.singletonList(fksql);
-            }
-        }
-        return Collections.emptyList();
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createDropRelationshipToModel(getEntity(), relationship);
-    }
-
-    @Override
-    public String getTokenValue() {
-        if (!this.isEmpty()) {
-            return relationship.getSourceEntity().getName() + "->" + relationship.getTargetEntityName();
-        } else {
-            return "Skip. No sql representation.";
-        }
-    }
-
-    @Override
-    public boolean isEmpty() {
-        // Method DbRelationship.isSourceIndependentFromTargetChange() looks same
-        return relationship.isSourceIndependentFromTargetChange();
-        /*return relationship.isToMany()
-                || relationship.isToDependentPK()
-                || !relationship.isToPK(); // TODO it is not necessary primary key it can be unique index
-        */
-    }
-
-    @Override
-    public int compareTo(MergerToken o) {
-        // add all AddRelationshipToDb to the end.
-        if (o instanceof AddRelationshipToDb) {
-            return super.compareTo(o);
-        }
-        return 1;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToModel.java
deleted file mode 100644
index c132bbc..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AddRelationshipToModel.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbJoin;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjEntity;
-
-public class AddRelationshipToModel extends AbstractToModelToken.Entity {
-
-    public static final String COMMA_SEPARATOR = ", ";
-    public static final int COMMA_SEPARATOR_LENGTH = COMMA_SEPARATOR.length();
-
-    private DbRelationship relationship;
-
-    public AddRelationshipToModel(DbEntity entity, DbRelationship relationship) {
-        super("Add Relationship", entity);
-        this.relationship = relationship;
-    }
-
-    public static String getTokenValue(DbRelationship rel) {
-        String attributes = "";
-        if (rel.getJoins().size() == 1) {
-            attributes = rel.getJoins().get(0).getTargetName();
-        } else {
-            for (DbJoin dbJoin : rel.getJoins()) {
-                attributes += dbJoin.getTargetName() + COMMA_SEPARATOR;
-            }
-
-            attributes = "{" + attributes.substring(0, attributes.length() - COMMA_SEPARATOR_LENGTH) + "}";
-        }
-
-        return rel.getName() + " " + rel.getSourceEntity().getName() + "->" + rel.getTargetEntityName() + "." + attributes;
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createDropRelationshipToDb(getEntity(), relationship);
-    }
-
-    @Override
-    public void execute(MergerContext context) {
-        // Set name to relationship if it was created without it, e.g. in createReverse() action
-        if(relationship.getName() == null) {
-            relationship.setName(context.getNameGenerator().relationshipName(relationship));
-        }
-
-        getEntity().addRelationship(relationship);
-        for (ObjEntity e : getEntity().mappedObjEntities()) {
-            context.getEntityMergeSupport().synchronizeOnDbRelationshipAdded(e, relationship);
-        }
-
-        context.getDelegate().dbRelationshipAdded(relationship);
-    }
-
-    @Override
-    public String getTokenValue() {
-        String attributes = "";
-        if (relationship.getJoins().size() == 1) {
-            attributes = relationship.getJoins().get(0).getTargetName();
-        } else {
-            for (DbJoin dbJoin : relationship.getJoins()) {
-                attributes += dbJoin.getTargetName() + COMMA_SEPARATOR;
-            }
-
-            attributes = "{" + attributes.substring(0, attributes.length() - COMMA_SEPARATOR_LENGTH) + "}";
-        }
-
-        return relationship.getName() + " " + relationship.getSourceEntity().getName() + "->" + relationship.getTargetEntityName() + "." + attributes;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToDb.java
deleted file mode 100644
index 6774b89..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToDb.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.access.DataNode;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.validation.SimpleValidationFailure;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class CreateTableToDb extends AbstractToDbToken.Entity {
-
-    public CreateTableToDb(DbEntity entity) {
-        super("Create Table", entity);
-    }
-
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        List<String> sqls = new ArrayList<String>();
-        if(needAutoPkSupport()) {
-            sqls.addAll(adapter.getPkGenerator().createAutoPkStatements(
-                    Collections.singletonList(getEntity())));
-        }
-        sqls.add(adapter.createTable(getEntity()));
-        return sqls;
-    }
-
-    @Override
-    public void execute(MergerContext mergerContext) {
-        try {
-            DataNode node = mergerContext.getDataNode();
-            DbAdapter adapter = node.getAdapter();
-            if(needAutoPkSupport()) {
-                adapter.getPkGenerator().createAutoPk(
-                        node,
-                        Collections.singletonList(getEntity()));
-            }
-            executeSql(mergerContext, adapter.createTable(getEntity()));
-        }
-        catch (Exception e) {
-            mergerContext.getValidationResult().addFailure(
-                    new SimpleValidationFailure(this, e.getMessage()));
-        }
-    }
-
-    private boolean needAutoPkSupport() {
-        DbEntity entity = getEntity();
-        if(entity.getPrimaryKeyGenerator() != null) {
-            return false;
-        }
-
-        for(DbAttribute attribute : entity.getPrimaryKeys()) {
-            if(attribute.isGenerated()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createDropTableToModel(getEntity());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToModel.java
deleted file mode 100644
index 38f710f..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/CreateTableToModel.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * A {@link MergerToken} to add a {@link DbEntity} to a {@link DataMap}
- */
-public class CreateTableToModel extends AbstractToModelToken.Entity {
-
-    /**
-     * className if {@link ObjEntity} should be generated with a
-     * special class name.
-     * Setting this to <code>null</code>, because by default class name should be generated
-     */
-    private String objEntityClassName;
-
-    public CreateTableToModel(DbEntity entity) {
-        super("Create Table", entity);
-    }
-
-    /**
-     * Set the {@link ObjEntity} className if {@link ObjEntity} should be generated with a
-     * special class name. Set to null if the {@link ObjEntity} should be created with a
-     * name based on {@link DataMap#getDefaultPackage()} and {@link ObjEntity#getName()}
-     * <p>
-     * The default value is <code>null</code>
-     */
-    public void setObjEntityClassName(String n) {
-        objEntityClassName = n;
-    }
-
-    @Override
-    public void execute(MergerContext context) {
-        DbEntity dbEntity = getEntity();
-
-        DataMap map = context.getDataMap();
-        map.addDbEntity(dbEntity);
-
-        // create a ObjEntity
-        ObjEntity objEntity = new ObjEntity();
-
-        objEntity.setName(NameBuilder
-                .builder(objEntity, dbEntity.getDataMap())
-                .baseName(context.getNameGenerator().objEntityName(dbEntity))
-                .name());
-        objEntity.setDbEntity(getEntity());
-
-        // try to find a class name for the ObjEntity
-        String className = objEntityClassName;
-        if (className == null) {
-            // generate a className based on the objEntityName
-            className = map.getNameWithDefaultPackage(objEntity.getName());
-        }
-
-        objEntity.setClassName(className);
-        objEntity.setSuperClassName(map.getDefaultSuperclass());
-
-        if (map.isClientSupported()) {
-            objEntity.setClientClassName(map.getNameWithDefaultClientPackage(objEntity.getName()));
-            objEntity.setClientSuperClassName(map.getDefaultClientSuperclass());
-        }
-
-        map.addObjEntity(objEntity);
-
-        // presumably there are no other ObjEntities pointing to this DbEntity, so syncing just this one...
-        context.getEntityMergeSupport().synchronizeWithDbEntity(objEntity);
-
-        context.getDelegate().dbEntityAdded(getEntity());
-        context.getDelegate().objEntityAdded(objEntity);
-    }
-
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createDropTableToDb(getEntity());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToDb.java
deleted file mode 100644
index ecdb970..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToDb.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-
-public class DropColumnToDb extends AbstractToDbToken.EntityAndColumn {
-
-    public DropColumnToDb(DbEntity entity, DbAttribute column) {
-        super("Drop Column", entity, column);
-    }
-
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        StringBuilder sqlBuffer = new StringBuilder();
-        QuotingStrategy context = adapter.getQuotingStrategy();
-        sqlBuffer.append("ALTER TABLE ");
-        sqlBuffer.append(context.quotedFullyQualifiedName(getEntity()));
-        sqlBuffer.append(" DROP COLUMN ");
-        sqlBuffer.append(context.quotedName(getColumn()));
-
-        return Collections.singletonList(sqlBuffer.toString());
-    }
-
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createAddColumnToModel(getEntity(), getColumn());
-    }
-
-    @Override
-    public int compareTo(MergerToken o) {
-        // add all AddRelationshipToDb to the end.
-        if (o instanceof DropRelationshipToDb) {
-            return 1;
-        }
-        return super.compareTo(o);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToModel.java
deleted file mode 100644
index 6c9b09c..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropColumnToModel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbJoin;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A {@link MergerToken} to remove a {@link DbAttribute} from a {@link DbEntity}.
- * 
- */
-public class DropColumnToModel extends AbstractToModelToken.EntityAndColumn {
-
-    public DropColumnToModel(DbEntity entity, DbAttribute column) {
-        super("Drop Column", entity, column);
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createAddColumnToDb(getEntity(), getColumn());
-    }
-
-    @Override
-    public void execute(MergerContext mergerContext) {
-
-        // remove relationships mapped to column. duplicate List to prevent
-        // ConcurrentModificationException
-        List<DbRelationship> dbRelationships = new ArrayList<DbRelationship>(getEntity()
-                .getRelationships());
-        for (DbRelationship dbRelationship : dbRelationships) {
-            for (DbJoin join : dbRelationship.getJoins()) {
-                if (join.getSource() == getColumn() || join.getTarget() == getColumn()) {
-                    remove(mergerContext.getDelegate(), dbRelationship, true);
-                }
-            }
-        }
-
-        // remove ObjAttribute mapped to same column
-        for (ObjEntity objEntity : getEntity().mappedObjEntities()) {
-            ObjAttribute objAttribute = objEntity.getAttributeForDbAttribute(getColumn());
-            if (objAttribute != null) {
-                objEntity.removeAttribute(objAttribute.getName());
-                mergerContext.getDelegate().objAttributeRemoved(objAttribute);
-            }
-
-        }
-
-        // remove DbAttribute
-        getEntity().removeAttribute(getColumn().getName());
-
-        mergerContext.getDelegate().dbAttributeRemoved(getColumn());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToDb.java
deleted file mode 100644
index dce2b81..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToDb.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.dbsync.reverse.db.DbRelationshipDetected;
-
-import java.util.Collections;
-import java.util.List;
-
-public class DropRelationshipToDb extends AbstractToDbToken.Entity {
-
-    private DbRelationship relationship;
-
-    public DropRelationshipToDb(DbEntity entity, DbRelationship relationship) {
-        super("Drop foreign key", entity);
-        this.relationship = relationship;
-    }
-    
-    public String getFkName() {
-        if (relationship instanceof DbRelationshipDetected) {
-            return ((DbRelationshipDetected) relationship).getFkName();
-        }
-        return null;
-    }
-
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        if (isEmpty()) {
-            return Collections.emptyList();
-        }
-
-        QuotingStrategy context = adapter.getQuotingStrategy();
-        return Collections.singletonList(
-                "ALTER TABLE " + context.quotedFullyQualifiedName(getEntity()) + " DROP CONSTRAINT " + getFkName());
-    }
-
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createAddRelationshipToModel(getEntity(), relationship);
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return getFkName() == null || relationship.isToMany();
-    }
-
-    @Override
-    public String getTokenValue() {
-        if(relationship.isToMany()) {
-            return "Skip. No sql representation.";
-        }
-        return relationship.getSourceEntity().getName() + "->" + relationship.getTargetEntityName();
-    }
-
-    @Override
-    public int compareTo(MergerToken o) {
-        // add all AddRelationshipToDb to the end.
-        if (o instanceof DropRelationshipToDb) {
-            return super.compareTo(o);
-        }
-        return -1;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToModel.java
deleted file mode 100644
index d30355d..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropRelationshipToModel.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-
-public class DropRelationshipToModel extends AbstractToModelToken.Entity {
-
-    private final DbRelationship relationship;
-
-    public DropRelationshipToModel(DbEntity entity, DbRelationship relationship) {
-        super("Drop db-relationship ", entity);
-        this.relationship = relationship;
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createAddRelationshipToDb(getEntity(), relationship);
-    }
-
-    @Override
-    public void execute(MergerContext mergerContext) {
-        remove(mergerContext.getDelegate(), relationship, true);
-    }
-
-    @Override
-    public String getTokenValue() {
-        return AddRelationshipToModel.getTokenValue(relationship);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToDb.java
deleted file mode 100644
index d5dd161..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToDb.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbEntity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DropTableToDb extends AbstractToDbToken.Entity {
-
-    public DropTableToDb(DbEntity entity) {
-        super("Drop Table", entity);
-    }
-
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        List<String> sqls = new ArrayList<>();
-        // TODO: fix. some adapters drop the complete AUTO_PK_SUPPORT here
-        /*
-        sqls.addAll(adapter.getPkGenerator().dropAutoPkStatements(
-                Collections.singletonList(entity)));
-         */
-        sqls.addAll(adapter.dropTableStatements(getEntity()));
-        return sqls;
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createCreateTableToModel(getEntity());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToModel.java
deleted file mode 100644
index 1773ec6..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DropTableToModel.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * A {@link MergerToken} to remove a {@link DbEntity} from a {@link DataMap}. Any
- * {@link ObjEntity} mapped to the {@link DbEntity} will also be removed.
- * 
- */
-public class DropTableToModel extends AbstractToModelToken.Entity {
-
-    public DropTableToModel(DbEntity entity) {
-        super("Drop Table", entity);
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createCreateTableToDb(getEntity());
-    }
-
-    @Override
-    public void execute(MergerContext mergerContext) {
-        for (ObjEntity objEntity : getEntity().mappedObjEntities()) {
-            objEntity.getDataMap().removeObjEntity(objEntity.getName(), true);
-            mergerContext.getDelegate().objEntityRemoved(objEntity);
-        }
-        getEntity().getDataMap().removeDbEntity(getEntity().getName(), true);
-        mergerContext.getDelegate().dbEntityRemoved(getEntity());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DummyReverseToken.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DummyReverseToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DummyReverseToken.java
index 6bdb4d9..e8dc4cb 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DummyReverseToken.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DummyReverseToken.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
  * any thing, but {@link #createReverse(MergerTokenFactory)} will get back the reverse that
  * this was made from.
  */
-class DummyReverseToken implements MergerToken {
+public class DummyReverseToken implements MergerToken {
 
     private MergerToken reverse;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/SetAllowNullToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/SetAllowNullToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/SetAllowNullToDb.java
deleted file mode 100644
index f155680..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/SetAllowNullToDb.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.dbsync.merge.token;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A {@link MergerToken} to add a "allow null" clause to a column.
- * 
- */
-public class SetAllowNullToDb extends AbstractToDbToken.EntityAndColumn {
-
-    public SetAllowNullToDb(DbEntity entity, DbAttribute column) {
-        super("Set Allow Null", entity, column);
-    }
-
-    @Override
-    public List<String> createSql(DbAdapter adapter) {
-        StringBuilder sqlBuffer = new StringBuilder();
-        QuotingStrategy context = adapter.getQuotingStrategy();
-        sqlBuffer.append("ALTER TABLE ");
-        sqlBuffer.append(context.quotedFullyQualifiedName(getEntity()));
-        sqlBuffer.append(" ALTER COLUMN ");
-        sqlBuffer.append(context.quotedName(getColumn()));
-        sqlBuffer.append(" DROP NOT NULL");
-
-        return Collections.singletonList(sqlBuffer.toString());
-    }
-
-    @Override
-    public MergerToken createReverse(MergerTokenFactory factory) {
-        return factory.createSetNotNullToModel(getEntity(), getColumn());
-    }
-
-}