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:46 UTC

[10/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)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropColumnToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropColumnToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropColumnToModel.java
new file mode 100644
index 0000000..d477eb3
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropColumnToModel.java
@@ -0,0 +1,80 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+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/model/DropRelationshipToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropRelationshipToModel.java
new file mode 100644
index 0000000..8d1a267
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropRelationshipToModel.java
@@ -0,0 +1,52 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+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/model/DropTableToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropTableToModel.java
new file mode 100644
index 0000000..16c7d46
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/DropTableToModel.java
@@ -0,0 +1,54 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+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/model/SetAllowNullToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetAllowNullToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetAllowNullToModel.java
new file mode 100644
index 0000000..7ac7a7d
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetAllowNullToModel.java
@@ -0,0 +1,48 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+/**
+ * A {@link MergerToken} to set the mandatory field of a {@link DbAttribute} to false
+ * 
+ */
+public class SetAllowNullToModel extends AbstractToModelToken.EntityAndColumn {
+
+    public SetAllowNullToModel(DbEntity entity, DbAttribute column) {
+        super("Set Allow Null", entity, column);
+    }
+
+    @Override
+    public MergerToken createReverse(MergerTokenFactory factory) {
+        return factory.createSetNotNullToDb(getEntity(), getColumn());
+    }
+
+    @Override
+    public void execute(MergerContext mergerContext) {
+        getColumn().setMandatory(false);
+        mergerContext.getDelegate().dbAttributeModified(getColumn());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetColumnTypeToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetColumnTypeToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetColumnTypeToModel.java
new file mode 100644
index 0000000..baf7e7d
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetColumnTypeToModel.java
@@ -0,0 +1,98 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+/**
+ * A {@link MergerToken} that modifies one original {@link DbAttribute} to match another
+ * new {@link DbAttribute}s type, maxLength and precision. The name and mandatory fields
+ * are not modified by this token.
+ * 
+ */
+public class SetColumnTypeToModel extends AbstractToModelToken.Entity {
+
+    private DbAttribute columnOriginal;
+    private DbAttribute columnNew;
+
+    public SetColumnTypeToModel(DbEntity entity, DbAttribute columnOriginal, DbAttribute columnNew) {
+        super("Set Column Type", entity);
+        this.columnOriginal = columnOriginal;
+        this.columnNew = columnNew;
+    }
+
+    @Override
+    public MergerToken createReverse(MergerTokenFactory factory) {
+        return factory.createSetColumnTypeToDb(getEntity(), columnNew, columnOriginal);
+    }
+
+    @Override
+    public void execute(MergerContext mergerContext) {
+        columnOriginal.setType(columnNew.getType());
+        columnOriginal.setMaxLength(columnNew.getMaxLength());
+        columnOriginal.setAttributePrecision(columnNew.getAttributePrecision());
+        columnOriginal.setScale(columnNew.getScale());
+        mergerContext.getDelegate().dbAttributeModified(columnOriginal);
+    }
+
+    @Override
+    public String getTokenValue() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getEntity().getName());
+        sb.append(".");
+        sb.append(columnNew.getName());
+
+        if (columnOriginal.getType() != columnNew.getType()) {
+            sb.append(" type: ");
+            sb.append(TypesMapping.getSqlNameByType(columnOriginal.getType()));
+            sb.append(" -> ");
+            sb.append(TypesMapping.getSqlNameByType(columnNew.getType()));
+        }
+
+        if (columnOriginal.getMaxLength() != columnNew.getMaxLength()) {
+            sb.append(" maxLength: ");
+            sb.append(columnOriginal.getMaxLength());
+            sb.append(" -> ");
+            sb.append(columnNew.getMaxLength());
+        }
+
+        if (columnOriginal.getAttributePrecision() != columnNew.getAttributePrecision()) {
+            sb.append(" precision: ");
+            sb.append(columnOriginal.getAttributePrecision());
+            sb.append(" -> ");
+            sb.append(columnNew.getAttributePrecision());
+        }
+
+        if (columnOriginal.getScale() != columnNew.getScale()) {
+            sb.append(" scale: ");
+            sb.append(columnOriginal.getScale());
+            sb.append(" -> ");
+            sb.append(columnNew.getScale());
+        }
+
+        return sb.toString();
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetNotNullToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetNotNullToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetNotNullToModel.java
new file mode 100644
index 0000000..d839322
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetNotNullToModel.java
@@ -0,0 +1,48 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+/**
+ * A {@link MergerToken} to set the mandatory field of a {@link DbAttribute} to true
+ * 
+ */
+public class SetNotNullToModel extends AbstractToModelToken.EntityAndColumn {
+
+    public SetNotNullToModel(DbEntity entity, DbAttribute column) {
+        super("Set Not Null", entity, column);
+    }
+
+    @Override
+    public MergerToken createReverse(MergerTokenFactory factory) {
+        return factory.createSetAllowNullToDb(getEntity(), getColumn());
+    }
+
+    @Override
+    public void execute(MergerContext mergerContext) {
+        getColumn().setMandatory(true);
+        mergerContext.getDelegate().dbAttributeModified(getColumn());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetPrimaryKeyToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetPrimaryKeyToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetPrimaryKeyToModel.java
new file mode 100644
index 0000000..93d9cf0
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetPrimaryKeyToModel.java
@@ -0,0 +1,83 @@
+/*****************************************************************
+ *   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.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.event.AttributeEvent;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+public class SetPrimaryKeyToModel extends AbstractToModelToken.Entity {
+
+    private Collection<DbAttribute> primaryKeyOriginal;
+    private Collection<DbAttribute> primaryKeyNew;
+    private String detectedPrimaryKeyName;
+    private Set<String> primaryKeyNewAttributeNames = new HashSet<String>();
+
+    public SetPrimaryKeyToModel(DbEntity entity,
+            Collection<DbAttribute> primaryKeyOriginal,
+            Collection<DbAttribute> primaryKeyNew, String detectedPrimaryKeyName) {
+        super("Set Primary Key", entity);
+        
+        this.primaryKeyOriginal = primaryKeyOriginal;
+        this.primaryKeyNew = primaryKeyNew;
+        this.detectedPrimaryKeyName = detectedPrimaryKeyName;
+        
+        for (DbAttribute attr : primaryKeyNew) {
+            primaryKeyNewAttributeNames.add(attr.getName().toUpperCase());
+        }
+    }
+
+    @Override
+    public MergerToken createReverse(MergerTokenFactory factory) {
+        return factory.createSetPrimaryKeyToDb(
+                getEntity(),
+                primaryKeyNew,
+                primaryKeyOriginal,
+                detectedPrimaryKeyName);
+    }
+
+    @Override
+    public void execute(MergerContext mergerContext) {
+        DbEntity e = getEntity();
+
+        for (DbAttribute attr : e.getAttributes()) {
+
+            boolean wasPrimaryKey = attr.isPrimaryKey();
+            boolean willBePrimaryKey = primaryKeyNewAttributeNames.contains(attr
+                    .getName()
+                    .toUpperCase());
+
+            if (wasPrimaryKey != willBePrimaryKey) {
+                attr.setPrimaryKey(willBePrimaryKey);
+                e.dbAttributeChanged(new AttributeEvent(this, attr, e));
+                mergerContext.getDelegate().dbAttributeModified(attr);
+            }
+
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/AddColumnToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/AddColumnToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/AddColumnToModelIT.java
deleted file mode 100644
index 318e0da..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/AddColumnToModelIT.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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.dbsync.merge.token.AddColumnToModel;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.junit.Test;
-
-public class AddColumnToModelIT extends MergeCase {
-
-    @Test
-    public void testAddColumn() throws Exception {
-        dropTableIfPresent("NEW_TABLE");
-        assertTokensAndExecute(0, 0);
-
-        DbEntity dbEntity = new DbEntity("NEW_TABLE");
-
-        DbAttribute column1 = new DbAttribute("ID", Types.INTEGER, dbEntity);
-        column1.setMandatory(true);
-        column1.setPrimaryKey(true);
-        dbEntity.addAttribute(column1);
-
-        DbAttribute column2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity);
-        column2.setMaxLength(10);
-        column2.setMandatory(false);
-        dbEntity.addAttribute(column2);
-
-        map.addDbEntity(dbEntity);
-
-        assertTokensAndExecute(1, 0);
-        assertTokensAndExecute(0, 0);
-
-        ObjEntity objEntity = new ObjEntity("NewTable");
-        objEntity.setDbEntity(dbEntity);
-        ObjAttribute oatr1 = new ObjAttribute("name");
-        oatr1.setDbAttributePath(column2.getName());
-        oatr1.setType("java.lang.String");
-        objEntity.addAttribute(oatr1);
-        map.addObjEntity(objEntity);
-
-        // remove name column
-        objEntity.removeAttribute(oatr1.getName());
-        dbEntity.removeAttribute(column2.getName());
-        assertNull(objEntity.getAttribute(oatr1.getName()));
-        assertEquals(0, objEntity.getAttributes().size());
-        assertNull(dbEntity.getAttribute(column2.getName()));
-
-        List<MergerToken> tokens = createMergeTokens();
-        assertEquals(1, tokens.size());
-        MergerToken token = tokens.get(0);
-        if (token.getDirection().isToDb()) {
-            token = token.createReverse(mergerFactory());
-        }
-        assertTrue(token instanceof AddColumnToModel);
-        execute(token);
-        assertEquals(1, objEntity.getAttributes().size());
-        assertEquals("java.lang.String", objEntity.getAttributes().iterator()
-                .next().getType());
-
-        // clear up
-        map.removeObjEntity(objEntity.getName(), true);
-        map.removeDbEntity(dbEntity.getName(), true);
-        resolver.refreshMappingCache();
-        assertNull(map.getObjEntity(objEntity.getName()));
-        assertNull(map.getDbEntity(dbEntity.getName()));
-        assertFalse(map.getDbEntities().contains(dbEntity));
-
-        assertTokensAndExecute(1, 0);
-        assertTokensAndExecute(0, 0);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CreateTableToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CreateTableToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CreateTableToModelIT.java
deleted file mode 100644
index b3a695b..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CreateTableToModelIT.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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.dbsync.merge.token.CreateTableToModel;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjEntity;
-import org.junit.Test;
-
-public class CreateTableToModelIT extends MergeCase {
-
-	@Test
-	public void testAddTable() throws Exception {
-		dropTableIfPresent("NEW_TABLE");
-		assertTokensAndExecute(0, 0);
-
-		DbEntity dbEntity = new DbEntity("NEW_TABLE");
-
-		DbAttribute column1 = new DbAttribute("ID", Types.INTEGER, dbEntity);
-		column1.setMandatory(true);
-		column1.setPrimaryKey(true);
-		dbEntity.addAttribute(column1);
-
-		DbAttribute column2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity);
-		column2.setMaxLength(10);
-		column2.setMandatory(false);
-		dbEntity.addAttribute(column2);
-
-		// for the new entity to the db
-		execute(mergerFactory().createCreateTableToDb(dbEntity));
-
-		List<MergerToken> tokens = createMergeTokens();
-		assertEquals(1, tokens.size());
-		MergerToken token = tokens.get(0);
-		if (token.getDirection().isToDb()) {
-			token = token.createReverse(mergerFactory());
-		}
-		assertTrue(token.getClass().getName(), token instanceof CreateTableToModel);
-
-		execute(token);
-
-		ObjEntity objEntity = null;
-		for (ObjEntity candidate : map.getObjEntities()) {
-			if (dbEntity.getName().equalsIgnoreCase(candidate.getDbEntityName())) {
-				objEntity = candidate;
-				break;
-			}
-		}
-		assertNotNull(objEntity);
-
-		assertEquals(objEntity.getClassName(), map.getDefaultPackage() + "." + objEntity.getName());
-		assertEquals(objEntity.getSuperClassName(), map.getDefaultSuperclass());
-		assertEquals(objEntity.getClientClassName(), map.getDefaultClientPackage() + "." + objEntity.getName());
-		assertEquals(objEntity.getClientSuperClassName(), map.getDefaultClientSuperclass());
-
-		assertEquals(1, objEntity.getAttributes().size());
-		assertEquals("java.lang.String", objEntity.getAttributes().iterator().next().getType());
-
-		// clear up
-		// fix psql case issue
-		map.removeDbEntity(objEntity.getDbEntity().getName(), true);
-		map.removeObjEntity(objEntity.getName(), true);
-		map.removeDbEntity(dbEntity.getName(), true);
-		resolver.refreshMappingCache();
-		assertNull(map.getObjEntity(objEntity.getName()));
-		assertNull(map.getDbEntity(dbEntity.getName()));
-		assertFalse(map.getDbEntities().contains(dbEntity));
-
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
index c70752a..7bcb1c2 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.merge;
 import org.apache.cayenne.dbsync.merge.builders.DbEntityBuilder;
 import org.apache.cayenne.dbsync.merge.factory.HSQLMergerTokenFactory;
 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.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropColumnToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropColumnToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropColumnToModelIT.java
deleted file mode 100644
index b0a23a7..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropColumnToModelIT.java
+++ /dev/null
@@ -1,238 +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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.dbsync.merge.token.DropColumnToModel;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToModel;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-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 org.apache.cayenne.map.ObjRelationship;
-import org.junit.Test;
-
-public class DropColumnToModelIT extends MergeCase {
-
-	@Test
-	public void testSimpleColumn() throws Exception {
-		dropTableIfPresent("NEW_TABLE");
-
-		assertTokensAndExecute(0, 0);
-
-		DbEntity dbEntity = new DbEntity("NEW_TABLE");
-
-		DbAttribute column1 = new DbAttribute("ID", Types.INTEGER, dbEntity);
-		column1.setMandatory(true);
-		column1.setPrimaryKey(true);
-		dbEntity.addAttribute(column1);
-
-		DbAttribute column2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity);
-		column2.setMaxLength(10);
-		column2.setMandatory(false);
-		dbEntity.addAttribute(column2);
-
-		map.addDbEntity(dbEntity);
-
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-
-		ObjEntity objEntity = new ObjEntity("NewTable");
-		objEntity.setDbEntity(dbEntity);
-		ObjAttribute oatr1 = new ObjAttribute("name");
-		oatr1.setDbAttributePath(column2.getName());
-		oatr1.setType("java.lang.String");
-		objEntity.addAttribute(oatr1);
-		map.addObjEntity(objEntity);
-
-		// force drop name column in db
-		MergerToken token = mergerFactory().createDropColumnToDb(dbEntity, column2);
-		execute(token);
-
-		List<MergerToken> tokens = createMergeTokens();
-		assertEquals(1, tokens.size());
-		token = tokens.get(0);
-		if (token.getDirection().isToDb()) {
-			token = token.createReverse(mergerFactory());
-		}
-		assertTrue(token instanceof DropColumnToModel);
-		execute(token);
-		assertNull(dbEntity.getAttribute(column2.getName()));
-		assertNull(objEntity.getAttribute(oatr1.getName()));
-
-		// clear up
-		map.removeObjEntity(objEntity.getName(), true);
-		map.removeDbEntity(dbEntity.getName(), true);
-		resolver.refreshMappingCache();
-		assertNull(map.getObjEntity(objEntity.getName()));
-		assertNull(map.getDbEntity(dbEntity.getName()));
-		assertFalse(map.getDbEntities().contains(dbEntity));
-
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-	}
-
-	@Test
-	public void testRemoveFKColumnWithoutRelationshipInDb() throws Exception {
-		dropTableIfPresent("NEW_TABLE");
-		dropTableIfPresent("NEW_TABLE2");
-
-		assertTokensAndExecute(0, 0);
-
-		DbEntity dbEntity1 = new DbEntity("NEW_TABLE");
-
-		DbAttribute e1col1 = new DbAttribute("ID", Types.INTEGER, dbEntity1);
-		e1col1.setMandatory(true);
-		e1col1.setPrimaryKey(true);
-		dbEntity1.addAttribute(e1col1);
-
-		DbAttribute e1col2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity1);
-		e1col2.setMaxLength(10);
-		e1col2.setMandatory(false);
-		dbEntity1.addAttribute(e1col2);
-
-		map.addDbEntity(dbEntity1);
-
-		DbEntity dbEntity2 = new DbEntity("NEW_TABLE2");
-		DbAttribute e2col1 = new DbAttribute("ID", Types.INTEGER, dbEntity2);
-		e2col1.setMandatory(true);
-		e2col1.setPrimaryKey(true);
-		dbEntity2.addAttribute(e2col1);
-		DbAttribute e2col2 = new DbAttribute("FK", Types.INTEGER, dbEntity2);
-		dbEntity2.addAttribute(e2col2);
-		DbAttribute e2col3 = new DbAttribute("NAME", Types.VARCHAR, dbEntity2);
-		e2col3.setMaxLength(10);
-		dbEntity2.addAttribute(e2col3);
-
-		map.addDbEntity(dbEntity2);
-
-		assertTokensAndExecute(2, 0);
-		assertTokensAndExecute(0, 0);
-
-		// force drop fk column in db
-		execute(mergerFactory().createDropColumnToDb(dbEntity2, e2col2));
-
-		// create db relationships, but do not sync them to db
-		DbRelationship rel1To2 = new DbRelationship("rel1To2");
-		rel1To2.setSourceEntity(dbEntity1);
-		rel1To2.setTargetEntityName(dbEntity2);
-		rel1To2.setToMany(true);
-		rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
-		dbEntity1.addRelationship(rel1To2);
-		DbRelationship rel2To1 = new DbRelationship("rel2To1");
-		rel2To1.setSourceEntity(dbEntity2);
-		rel2To1.setTargetEntityName(dbEntity1);
-		rel2To1.setToMany(false);
-		rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
-		dbEntity2.addRelationship(rel2To1);
-		assertSame(rel1To2, rel2To1.getReverseRelationship());
-		assertSame(rel2To1, rel1To2.getReverseRelationship());
-
-		// create ObjEntities
-		ObjEntity objEntity1 = new ObjEntity("NewTable");
-		objEntity1.setDbEntity(dbEntity1);
-		ObjAttribute oatr1 = new ObjAttribute("name");
-		oatr1.setDbAttributePath(e1col2.getName());
-		oatr1.setType("java.lang.String");
-		objEntity1.addAttribute(oatr1);
-		map.addObjEntity(objEntity1);
-		ObjEntity objEntity2 = new ObjEntity("NewTable2");
-		objEntity2.setDbEntity(dbEntity2);
-		ObjAttribute o2a1 = new ObjAttribute("name");
-		o2a1.setDbAttributePath(e2col3.getName());
-		o2a1.setType("java.lang.String");
-		objEntity2.addAttribute(o2a1);
-		map.addObjEntity(objEntity2);
-
-		// create ObjRelationships
-		assertEquals(0, objEntity1.getRelationships().size());
-		assertEquals(0, objEntity2.getRelationships().size());
-		ObjRelationship objRel1To2 = new ObjRelationship("objRel1To2");
-		objRel1To2.addDbRelationship(rel1To2);
-		objRel1To2.setSourceEntity(objEntity1);
-		objRel1To2.setTargetEntityName(objEntity2);
-		objEntity1.addRelationship(objRel1To2);
-		ObjRelationship objRel2To1 = new ObjRelationship("objRel2To1");
-		objRel2To1.addDbRelationship(rel2To1);
-		objRel2To1.setSourceEntity(objEntity2);
-		objRel2To1.setTargetEntityName(objEntity1);
-		objEntity2.addRelationship(objRel2To1);
-		assertEquals(1, objEntity1.getRelationships().size());
-		assertEquals(1, objEntity2.getRelationships().size());
-		assertSame(objRel1To2, objRel2To1.getReverseRelationship());
-		assertSame(objRel2To1, objRel1To2.getReverseRelationship());
-
-		// try do use the merger to remove the column and relationship in the
-		// model
-		List<MergerToken> tokens = createMergeTokens();
-		assertTokens(tokens, 2, 0);
-		// TODO: reversing the following two tokens should also reverse the
-		// order
-		MergerToken token0 = tokens.get(0).createReverse(mergerFactory());
-		MergerToken token1 = tokens.get(1).createReverse(mergerFactory());
-		if (!(token0 instanceof DropRelationshipToModel && token1 instanceof DropColumnToModel || token1 instanceof DropRelationshipToModel
-				&& token0 instanceof DropColumnToModel)) {
-			fail();
-		}
-		// do not execute DropRelationshipToModel, only DropColumnToModel.
-		if (token1 instanceof DropColumnToModel) {
-			execute(token1);
-		} else {
-			execute(token0);
-		}
-
-		// check after merging
-		assertNull(dbEntity2.getAttribute(e2col2.getName()));
-		assertEquals(0, dbEntity1.getRelationships().size());
-		assertEquals(0, dbEntity2.getRelationships().size());
-		assertEquals(0, objEntity1.getRelationships().size());
-		assertEquals(0, objEntity2.getRelationships().size());
-
-		// clear up
-
-		dbEntity1.removeRelationship(rel1To2.getName());
-		dbEntity2.removeRelationship(rel2To1.getName());
-		map.removeObjEntity(objEntity1.getName(), true);
-		map.removeDbEntity(dbEntity1.getName(), true);
-		map.removeObjEntity(objEntity2.getName(), true);
-		map.removeDbEntity(dbEntity2.getName(), true);
-		resolver.refreshMappingCache();
-		assertNull(map.getObjEntity(objEntity1.getName()));
-		assertNull(map.getDbEntity(dbEntity1.getName()));
-		assertNull(map.getObjEntity(objEntity2.getName()));
-		assertNull(map.getDbEntity(dbEntity2.getName()));
-		assertFalse(map.getDbEntities().contains(dbEntity1));
-		assertFalse(map.getDbEntities().contains(dbEntity2));
-
-		assertTokensAndExecute(2, 0);
-		assertTokensAndExecute(0, 0);
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
deleted file mode 100644
index d2ac514..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
+++ /dev/null
@@ -1,193 +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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.dbsync.merge.token.DropColumnToModel;
-import org.apache.cayenne.dbsync.merge.token.DropRelationshipToModel;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-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 org.apache.cayenne.map.ObjRelationship;
-import org.junit.Test;
-
-public class DropRelationshipToModelIT extends MergeCase {
-
-	@Test
-	public void testForeignKey() throws Exception {
-		dropTableIfPresent("NEW_TABLE");
-		dropTableIfPresent("NEW_TABLE2");
-
-		assertTokensAndExecute(0, 0);
-
-		DbEntity dbEntity1 = new DbEntity("NEW_TABLE");
-
-		DbAttribute e1col1 = new DbAttribute("ID", Types.INTEGER, dbEntity1);
-		e1col1.setMandatory(true);
-		e1col1.setPrimaryKey(true);
-		dbEntity1.addAttribute(e1col1);
-
-		DbAttribute e1col2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity1);
-		e1col2.setMaxLength(10);
-		e1col2.setMandatory(false);
-		dbEntity1.addAttribute(e1col2);
-
-		map.addDbEntity(dbEntity1);
-
-		DbEntity dbEntity2 = new DbEntity("NEW_TABLE2");
-		DbAttribute e2col1 = new DbAttribute("ID", Types.INTEGER, dbEntity2);
-		e2col1.setMandatory(true);
-		e2col1.setPrimaryKey(true);
-		dbEntity2.addAttribute(e2col1);
-		DbAttribute e2col2 = new DbAttribute("FK", Types.INTEGER, dbEntity2);
-		dbEntity2.addAttribute(e2col2);
-		DbAttribute e2col3 = new DbAttribute("NAME", Types.VARCHAR, dbEntity2);
-		e2col3.setMaxLength(10);
-		dbEntity2.addAttribute(e2col3);
-
-		map.addDbEntity(dbEntity2);
-
-		// create db relationships
-		DbRelationship rel1To2 = new DbRelationship("rel1To2");
-		rel1To2.setSourceEntity(dbEntity1);
-		rel1To2.setTargetEntityName(dbEntity2);
-		rel1To2.setToMany(true);
-		rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
-		dbEntity1.addRelationship(rel1To2);
-		DbRelationship rel2To1 = new DbRelationship("rel2To1");
-		rel2To1.setSourceEntity(dbEntity2);
-		rel2To1.setTargetEntityName(dbEntity1);
-		rel2To1.setToMany(false);
-		rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
-		dbEntity2.addRelationship(rel2To1);
-		assertSame(rel1To2, rel2To1.getReverseRelationship());
-		assertSame(rel2To1, rel1To2.getReverseRelationship());
-
-		assertTokensAndExecute(3, 0);
-		assertTokensAndExecute(0, 0);
-
-		// create ObjEntities
-		ObjEntity objEntity1 = new ObjEntity("NewTable");
-		objEntity1.setDbEntity(dbEntity1);
-		ObjAttribute oatr1 = new ObjAttribute("name");
-		oatr1.setDbAttributePath(e1col2.getName());
-		oatr1.setType("java.lang.String");
-		objEntity1.addAttribute(oatr1);
-		map.addObjEntity(objEntity1);
-		ObjEntity objEntity2 = new ObjEntity("NewTable2");
-		objEntity2.setDbEntity(dbEntity2);
-		ObjAttribute o2a1 = new ObjAttribute("name");
-		o2a1.setDbAttributePath(e2col3.getName());
-		o2a1.setType("java.lang.String");
-		objEntity2.addAttribute(o2a1);
-		map.addObjEntity(objEntity2);
-
-		// create ObjRelationships
-		assertEquals(0, objEntity1.getRelationships().size());
-		assertEquals(0, objEntity2.getRelationships().size());
-		ObjRelationship objRel1To2 = new ObjRelationship("objRel1To2");
-		objRel1To2.addDbRelationship(rel1To2);
-		objRel1To2.setSourceEntity(objEntity1);
-		objRel1To2.setTargetEntityName(objEntity2);
-		objEntity1.addRelationship(objRel1To2);
-		ObjRelationship objRel2To1 = new ObjRelationship("objRel2To1");
-		objRel2To1.addDbRelationship(rel2To1);
-		objRel2To1.setSourceEntity(objEntity2);
-		objRel2To1.setTargetEntityName(objEntity1);
-		objEntity2.addRelationship(objRel2To1);
-		assertEquals(1, objEntity1.getRelationships().size());
-		assertEquals(1, objEntity2.getRelationships().size());
-		assertSame(objRel1To2, objRel2To1.getReverseRelationship());
-		assertSame(objRel2To1, objRel1To2.getReverseRelationship());
-
-        // remove relationship and fk from model, merge to db and read to model
-        dbEntity2.removeRelationship(rel2To1.getName());
-        dbEntity1.removeRelationship(rel1To2.getName());
-        dbEntity2.removeAttribute(e2col2.getName());
-        List<MergerToken> tokens = createMergeTokens();
-
-        /**
-         * Add Relationship NEW_TABLE->NEW_TABLE2 To Model
-         * Drop Relationship NEW_TABLE2->NEW_TABLE To DB
-         * Drop Column NEW_TABLE2.FK To DB
-         * */
-        assertTokens(tokens, 2, 0);
-        for (MergerToken token : tokens) {
-            if (token.getDirection().isToDb()) {
-                execute(token);
-            }
-        }
-        assertTokensAndExecute(0, 0);
-
-        dbEntity2.addRelationship(rel2To1);
-        dbEntity1.addRelationship(rel1To2);
-        dbEntity2.addAttribute(e2col2);
-
-		// try do use the merger to remove the relationship in the model
-		tokens = createMergeTokens();
-		assertTokens(tokens, 2, 0);
-		// TODO: reversing the following two tokens should also reverse the
-		// order
-		MergerToken token0 = tokens.get(0).createReverse(mergerFactory());
-		MergerToken token1 = tokens.get(1).createReverse(mergerFactory());
-		if (!(token0 instanceof DropRelationshipToModel && token1 instanceof DropColumnToModel || token1 instanceof DropRelationshipToModel
-				&& token0 instanceof DropColumnToModel)) {
-			fail();
-		}
-		execute(token0);
-		execute(token1);
-
-		// check after merging
-		assertNull(dbEntity2.getAttribute(e2col2.getName()));
-		assertEquals(0, dbEntity1.getRelationships().size());
-		assertEquals(0, dbEntity2.getRelationships().size());
-		assertEquals(0, objEntity1.getRelationships().size());
-		assertEquals(0, objEntity2.getRelationships().size());
-
-		// clear up
-		dbEntity1.removeRelationship(rel1To2.getName());
-		dbEntity2.removeRelationship(rel2To1.getName());
-		map.removeObjEntity(objEntity1.getName(), true);
-		map.removeDbEntity(dbEntity1.getName(), true);
-		map.removeObjEntity(objEntity2.getName(), true);
-		map.removeDbEntity(dbEntity2.getName(), true);
-		resolver.refreshMappingCache();
-		assertNull(map.getObjEntity(objEntity1.getName()));
-		assertNull(map.getDbEntity(dbEntity1.getName()));
-		assertNull(map.getObjEntity(objEntity2.getName()));
-		assertNull(map.getDbEntity(dbEntity2.getName()));
-		assertFalse(map.getDbEntities().contains(dbEntity1));
-		assertFalse(map.getDbEntities().contains(dbEntity2));
-
-		assertTokensAndExecute(2, 0);
-		assertTokensAndExecute(0, 0);
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropTableToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropTableToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropTableToModelIT.java
deleted file mode 100644
index 63e0047..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropTableToModelIT.java
+++ /dev/null
@@ -1,96 +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;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.dbsync.merge.token.DropTableToModel;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.junit.Test;
-
-public class DropTableToModelIT extends MergeCase {
-
-	@Test
-	public void testDropTable() throws Exception {
-		dropTableIfPresent("NEW_TABLE");
-		assertTokensAndExecute(0, 0);
-
-		DbEntity dbEntity = new DbEntity("NEW_TABLE");
-
-		DbAttribute column1 = new DbAttribute("ID", Types.INTEGER, dbEntity);
-		column1.setMandatory(true);
-		column1.setPrimaryKey(true);
-		dbEntity.addAttribute(column1);
-
-		DbAttribute column2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity);
-		column2.setMaxLength(10);
-		column2.setMandatory(false);
-		dbEntity.addAttribute(column2);
-
-		map.addDbEntity(dbEntity);
-
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-
-		ObjEntity objEntity = new ObjEntity("NewTable");
-		objEntity.setDbEntity(dbEntity);
-		ObjAttribute oatr1 = new ObjAttribute("name");
-		oatr1.setDbAttributePath(column2.getName());
-		oatr1.setType("java.lang.String");
-		objEntity.addAttribute(oatr1);
-		map.addObjEntity(objEntity);
-
-		// force drop table in db
-		MergerToken token = mergerFactory().createDropTableToDb(dbEntity);
-		execute(token);
-
-		List<MergerToken> tokens = createMergeTokens();
-		assertEquals(1, tokens.size());
-		token = tokens.get(0);
-		if (token.getDirection().isToDb()) {
-			token = token.createReverse(mergerFactory());
-		}
-		assertTrue(token instanceof DropTableToModel);
-		execute(token);
-		resolver.refreshMappingCache();
-		assertNull(map.getDbEntity(dbEntity.getName()));
-		assertNull(map.getObjEntity(objEntity.getName()));
-
-		// clear up
-		map.removeObjEntity(objEntity.getName(), true);
-		map.removeDbEntity(dbEntity.getName(), true);
-		resolver.refreshMappingCache();
-		assertNull(map.getObjEntity(objEntity.getName()));
-		assertNull(map.getDbEntity(dbEntity.getName()));
-		assertFalse(map.getDbEntities().contains(dbEntity));
-
-		assertTokensAndExecute(0, 0);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/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 08eae3c..a722856 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
@@ -25,7 +25,7 @@ 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.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.merge.token.AbstractToDbToken;
+import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.naming.NoStemStemmer;
@@ -99,8 +99,8 @@ public abstract class MergeCase extends DbSyncCase {
         assertTokensAndExecute(0, 0);
     }
 
-    protected DbMerger.Builder merger() {
-        return DbMerger.builder(mergerFactory());
+    protected DataMapMerger.Builder merger() {
+        return DataMapMerger.builder(mergerFactory());
     }
 
     protected List<MergerToken> createMergeTokens() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetAllowNullToDbIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetAllowNullToDbIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetAllowNullToDbIT.java
deleted file mode 100644
index 6391ad0..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetAllowNullToDbIT.java
+++ /dev/null
@@ -1,66 +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;
-
-import static org.junit.Assert.assertNotNull;
-
-import java.sql.Types;
-
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.junit.Test;
-
-public class SetAllowNullToDbIT extends MergeCase {
-
-	@Test
-	public void test() throws Exception {
-		DbEntity dbEntity = map.getDbEntity("PAINTING");
-		assertNotNull(dbEntity);
-
-		// create and add new column to model and db
-		DbAttribute column = new DbAttribute("NEWCOL2", Types.VARCHAR, dbEntity);
-
-		try {
-
-			column.setMandatory(true);
-			column.setMaxLength(10);
-			dbEntity.addAttribute(column);
-			assertTokensAndExecute(2, 0);
-
-			// check that is was merged
-			assertTokensAndExecute(0, 0);
-
-			// set null
-			column.setMandatory(false);
-
-			// merge to db
-			assertTokensAndExecute(1, 0);
-
-			// check that is was merged
-			assertTokensAndExecute(0, 0);
-
-			// clean up
-		} finally {
-			dbEntity.removeAttribute(column.getName());
-			assertTokensAndExecute(1, 0);
-			assertTokensAndExecute(0, 0);
-		}
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetNotNullToDbIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetNotNullToDbIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetNotNullToDbIT.java
deleted file mode 100644
index 508d0f8..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetNotNullToDbIT.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;
-
-import static org.junit.Assert.assertNotNull;
-
-import java.sql.Types;
-
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.junit.Test;
-
-public class SetNotNullToDbIT extends MergeCase {
-
-	@Test
-	public void test() throws Exception {
-		DbEntity dbEntity = map.getDbEntity("PAINTING");
-		assertNotNull(dbEntity);
-
-		// create and add new column to model and db
-		DbAttribute column = new DbAttribute("NEWCOL2", Types.VARCHAR, dbEntity);
-
-		column.setMandatory(false);
-		column.setMaxLength(10);
-		dbEntity.addAttribute(column);
-		assertTokensAndExecute(1, 0);
-
-		// check that is was merged
-		assertTokensAndExecute(0, 0);
-
-		// set not null
-		column.setMandatory(true);
-
-		// merge to db
-		assertTokensAndExecute(1, 0);
-
-		// check that is was merged
-		assertTokensAndExecute(0, 0);
-
-		// clean up
-		dbEntity.removeAttribute(column.getName());
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToDbIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToDbIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToDbIT.java
deleted file mode 100644
index 3b513e7..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToDbIT.java
+++ /dev/null
@@ -1,58 +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;
-
-import java.sql.Types;
-
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.junit.Test;
-
-public class SetPrimaryKeyToDbIT extends MergeCase {
-
-	@Test
-	public void test() throws Exception {
-		dropTableIfPresent("NEW_TABLE");
-		assertTokensAndExecute(0, 0);
-
-		DbEntity dbEntity1 = new DbEntity("NEW_TABLE");
-
-		DbAttribute e1col1 = new DbAttribute("ID1", Types.INTEGER, dbEntity1);
-		e1col1.setMandatory(true);
-		e1col1.setPrimaryKey(true);
-		dbEntity1.addAttribute(e1col1);
-		map.addDbEntity(dbEntity1);
-
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-
-		DbAttribute e1col2 = new DbAttribute("ID2", Types.INTEGER, dbEntity1);
-		e1col2.setMandatory(true);
-		dbEntity1.addAttribute(e1col2);
-
-		assertTokensAndExecute(2, 0);
-		assertTokensAndExecute(0, 0);
-
-		e1col1.setPrimaryKey(false);
-		e1col2.setPrimaryKey(true);
-
-		assertTokensAndExecute(1, 0);
-		assertTokensAndExecute(0, 0);
-	}
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokenComparatorTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokenComparatorTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokenComparatorTest.java
deleted file mode 100644
index edb43fa..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokenComparatorTest.java
+++ /dev/null
@@ -1,115 +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;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-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.TokenComparator;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class TokenComparatorTest {
-
-    TokenComparator comparator;
-
-    @Before
-    public void setUp() {
-        comparator = new TokenComparator();
-    }
-
-    private List<String> toClassesNames(List<MergerToken> sort) {
-        List<String> res = new ArrayList<String>(sort.size());
-        for (MergerToken mergerToken : sort) {
-            res.add(mergerToken.getClass().getSimpleName());
-        }
-        return res;
-    }
-
-    @Test
-    public void testToModelTokensCompare() throws Exception {
-        List<MergerToken> tokens = Arrays.<MergerToken>asList(
-                new DropColumnToModel(null, null),
-                new DropRelationshipToModel(null, null),
-                new DropTableToModel(null),
-                new AddColumnToDb(null, null),
-                new AddRelationshipToModel(null, null),
-                new AddColumnToModel(null, null),
-                new CreateTableToModel(null));
-        Collections.sort(tokens, comparator);
-
-        List<String> actual = toClassesNames(tokens);
-        List<String> expected = Arrays.asList(
-                "AddColumnToDb",
-                "AddColumnToModel",
-                "CreateTableToModel",
-                "DropColumnToModel",
-                "DropRelationshipToModel",
-                "DropTableToModel",
-                "AddRelationshipToModel"
-        );
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testToDbTokensCompare() throws Exception {
-        List<MergerToken> tokens = Arrays.<MergerToken>asList(
-                new DropColumnToDb(null, null),
-                new DropRelationshipToDb(null, null),
-                new DropTableToDb(null),
-                new AddColumnToModel(null, null),
-                new AddRelationshipToDb(null, null),
-                new AddColumnToDb(null, null),
-                new CreateTableToDb(null));
-        Collections.sort(tokens, comparator);
-
-        List<String> actual = toClassesNames(tokens);
-        List<String> expected = Arrays.asList(
-                "AddColumnToModel",
-                "DropRelationshipToDb",
-                "DropColumnToDb",
-                "DropTableToDb",
-                "AddColumnToDb",
-                "AddRelationshipToDb",
-                "CreateTableToDb"
-        );
-
-        assertEquals(expected, actual);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java
deleted file mode 100644
index da1ce9d..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.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;
-
-import org.apache.cayenne.dbsync.merge.factory.HSQLMergerTokenFactory;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.merge.token.DefaultValueForNullProvider;
-import org.apache.cayenne.dbsync.merge.token.MergerToken;
-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.junit.Assert;
-import org.junit.Test;
-
-import java.util.Collections;
-
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbAttr;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbEntity;
-
-/**
- * @since 4.0.
- */
-public class TokensReverseTest {
-
-    @Test
-    public void testReverses() {
-        DbAttribute attr = dbAttr().build();
-        DbEntity entity = dbEntity().attributes(attr).build();
-        DbRelationship rel = new DbRelationship("rel");
-        rel.setSourceEntity(entity);
-        rel.addJoin(new DbJoin(rel, attr.getName(), "dontKnow"));
-
-        testOneToOneReverse(factory().createAddColumnToDb(entity, attr));
-        testOneToOneReverse(factory().createAddColumnToModel(entity, attr));
-        testOneToOneReverse(factory().createDropColumnToDb(entity, attr));
-        testOneToOneReverse(factory().createDropColumnToModel(entity, attr));
-
-        testOneToOneReverse(factory().createAddRelationshipToDb(entity, rel));
-        testOneToOneReverse(factory().createAddRelationshipToModel(entity, rel));
-        testOneToOneReverse(factory().createDropRelationshipToDb(entity, rel));
-        testOneToOneReverse(factory().createDropRelationshipToModel(entity, rel));
-
-        testOneToOneReverse(factory().createCreateTableToDb(entity));
-        testOneToOneReverse(factory().createCreateTableToModel(entity));
-        testOneToOneReverse(factory().createDropTableToDb(entity));
-        testOneToOneReverse(factory().createDropTableToModel(entity));
-
-        testOneToOneReverse(factory().createSetAllowNullToDb(entity, attr));
-        testOneToOneReverse(factory().createSetAllowNullToModel(entity, attr));
-        testOneToOneReverse(factory().createSetNotNullToDb(entity, attr));
-        testOneToOneReverse(factory().createSetNotNullToModel(entity, attr));
-
-        DbAttribute attr2 = dbAttr().build();
-        testOneToOneReverse(factory().createSetColumnTypeToDb(entity, attr, attr2));
-        testOneToOneReverse(factory().createSetColumnTypeToModel(entity, attr, attr2));
-
-        testOneToOneReverse(factory().createSetPrimaryKeyToDb(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
-        testOneToOneReverse(factory().createSetPrimaryKeyToModel(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
-
-        testOneToOneReverse(factory().createSetValueForNullToDb(entity, attr, new DefaultValueForNullProvider()));
-    }
-
-    private void testOneToOneReverse(MergerToken token) {
-        MergerToken token2 = token.createReverse(factory()).createReverse(factory());
-
-        Assert.assertEquals(token.getTokenName(), token2.getTokenName());
-        Assert.assertEquals(token.getTokenValue(), token2.getTokenValue());
-        Assert.assertEquals(token.getDirection(), token2.getDirection());
-    }
-
-    private MergerTokenFactory factory() {
-        return new HSQLMergerTokenFactory();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensToModelExecutionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensToModelExecutionTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensToModelExecutionTest.java
deleted file mode 100644
index fde39c3..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensToModelExecutionTest.java
+++ /dev/null
@@ -1,81 +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;
-
-import org.apache.cayenne.access.DataNode;
-import org.apache.cayenne.dbsync.merge.context.MergerContext;
-import org.apache.cayenne.dbsync.merge.factory.DefaultMergerTokenFactory;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.junit.Test;
-
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dataMap;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbAttr;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbEntity;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- * @since 4.0.
- */
-public class TokensToModelExecutionTest {
-
-    @Test
-    public void testCreateAndDropTable() throws Exception {
-        DbEntity entity = dbEntity().build();
-
-        DataMap dataMap = dataMap().build();
-        assertTrue(dataMap.getDbEntityMap().isEmpty());
-        assertTrue(dataMap.getObjEntityMap().isEmpty());
-
-        MergerContext context = MergerContext.builder(dataMap).dataNode(new DataNode()).build();
-        new DefaultMergerTokenFactory().createCreateTableToModel(entity).execute(context);
-
-        assertEquals(1, dataMap.getDbEntityMap().size());
-        assertEquals(1, dataMap.getObjEntities().size());
-        assertEquals(entity, dataMap.getDbEntity(entity.getName()));
-
-        new DefaultMergerTokenFactory().createDropTableToModel(entity).execute(context);
-        assertTrue(dataMap.getDbEntityMap().isEmpty());
-        assertTrue(dataMap.getObjEntityMap().isEmpty());
-    }
-
-    @Test
-    public void testCreateAndDropColumn() throws Exception {
-        DbAttribute attr = dbAttr("attr").build();
-        DbEntity entity = dbEntity().build();
-
-        DataMap dataMap = dataMap().with(entity).build();
-        assertEquals(1, dataMap.getDbEntityMap().size());
-        assertTrue(dataMap.getObjEntityMap().isEmpty());
-
-        MergerContext context = MergerContext.builder(dataMap).dataNode(new DataNode()).build();
-        new DefaultMergerTokenFactory().createAddColumnToModel(entity, attr).execute(context);
-
-        assertEquals(1, dataMap.getDbEntityMap().size());
-        assertEquals(1, entity.getAttributes().size());
-        assertEquals(attr, entity.getAttribute(attr.getName()));
-
-        new DefaultMergerTokenFactory().createDropColumnToModel(entity, attr).execute(context);
-        assertEquals(1, dataMap.getDbEntityMap().size());
-        assertTrue(entity.getAttributes().isEmpty());
-        assertTrue(dataMap.getObjEntityMap().isEmpty());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/ValueForNullIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/ValueForNullIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/ValueForNullIT.java
deleted file mode 100644
index 03a572b..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/ValueForNullIT.java
+++ /dev/null
@@ -1,127 +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;
-
-import junit.framework.AssertionFailedError;
-import org.apache.cayenne.DataObject;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.access.jdbc.SQLParameterBinding;
-import org.apache.cayenne.dbsync.merge.token.DefaultValueForNullProvider;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.query.SelectQuery;
-import org.junit.Test;
-
-import java.sql.Types;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-public class ValueForNullIT extends MergeCase {
-
-    private static final String DEFAULT_VALUE_STRING = "DEFSTRING";
-
-    @Inject
-    private DataContext context;
-
-    @Test
-    public void test() throws Exception {
-        DbEntity dbEntity = map.getDbEntity("PAINTING");
-        assertNotNull(dbEntity);
-        ObjEntity objEntity = map.getObjEntity("Painting");
-        assertNotNull(objEntity);
-
-        // insert some rows before adding "not null" column
-        final int nrows = 10;
-        for (int i = 0; i < nrows; i++) {
-            DataObject o = (DataObject) context.newObject("Painting");
-            o.writeProperty("paintingTitle", "ptitle" + i);
-        }
-        context.commitChanges();
-
-        // create and add new column to model and db
-        DbAttribute column = new DbAttribute("NEWCOL2", Types.VARCHAR, dbEntity);
-
-        column.setMandatory(false);
-        column.setMaxLength(10);
-        dbEntity.addAttribute(column);
-        assertTrue(dbEntity.getAttributes().contains(column));
-        assertEquals(column, dbEntity.getAttribute(column.getName()));
-        assertTokensAndExecute(1, 0);
-
-        // need obj attr to be able to query
-        ObjAttribute objAttr = new ObjAttribute("newcol2");
-        objAttr.setDbAttributePath(column.getName());
-        objEntity.addAttribute(objAttr);
-
-        // check that is was merged
-        assertTokensAndExecute(0, 0);
-
-        // set not null
-        column.setMandatory(true);
-
-        // merge to db
-        assertTokensAndExecute(2, 0);
-
-        // check that is was merged
-        assertTokensAndExecute(0, 0);
-
-        // check values for null
-        Expression qual = ExpressionFactory.matchExp(objAttr.getName(), DEFAULT_VALUE_STRING);
-        SelectQuery query = new SelectQuery("Painting", qual);
-        List<Persistent> rows = context.performQuery(query);
-        assertEquals(nrows, rows.size());
-
-        // clean up
-        dbEntity.removeAttribute(column.getName());
-        assertTokensAndExecute(1, 0);
-        assertTokensAndExecute(0, 0);
-    }
-
-    @Override
-    protected DbMerger.Builder merger() {
-        return super.merger().valueForNullProvider(new DefaultValueForNullProvider() {
-
-            @Override
-            protected SQLParameterBinding get(DbEntity entity, DbAttribute column) {
-                int type = column.getType();
-                switch (type) {
-                    case Types.VARCHAR:
-                        return new SQLParameterBinding(DEFAULT_VALUE_STRING, type, -1);
-                    default:
-                        throw new AssertionFailedError("should not get here");
-                }
-            }
-
-            @Override
-            public boolean hasValueFor(DbEntity entity, DbAttribute column) {
-                return true;
-            }
-        });
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/725e6ae9/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/TokenComparatorTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/TokenComparatorTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/TokenComparatorTest.java
new file mode 100644
index 0000000..fc69a56
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/TokenComparatorTest.java
@@ -0,0 +1,113 @@
+/*****************************************************************
+ *   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.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+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.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.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TokenComparatorTest {
+
+    TokenComparator comparator;
+
+    @Before
+    public void setUp() {
+        comparator = new TokenComparator();
+    }
+
+    private List<String> toClassesNames(List<MergerToken> sort) {
+        List<String> res = new ArrayList<String>(sort.size());
+        for (MergerToken mergerToken : sort) {
+            res.add(mergerToken.getClass().getSimpleName());
+        }
+        return res;
+    }
+
+    @Test
+    public void testToModelTokensCompare() throws Exception {
+        List<MergerToken> tokens = Arrays.<MergerToken>asList(
+                new DropColumnToModel(null, null),
+                new DropRelationshipToModel(null, null),
+                new DropTableToModel(null),
+                new AddColumnToDb(null, null),
+                new AddRelationshipToModel(null, null),
+                new AddColumnToModel(null, null),
+                new CreateTableToModel(null));
+        Collections.sort(tokens, comparator);
+
+        List<String> actual = toClassesNames(tokens);
+        List<String> expected = Arrays.asList(
+                "AddColumnToDb",
+                "AddColumnToModel",
+                "CreateTableToModel",
+                "DropColumnToModel",
+                "DropRelationshipToModel",
+                "DropTableToModel",
+                "AddRelationshipToModel"
+        );
+
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testToDbTokensCompare() throws Exception {
+        List<MergerToken> tokens = Arrays.<MergerToken>asList(
+                new DropColumnToDb(null, null),
+                new DropRelationshipToDb(null, null),
+                new DropTableToDb(null),
+                new AddColumnToModel(null, null),
+                new AddRelationshipToDb(null, null),
+                new AddColumnToDb(null, null),
+                new CreateTableToDb(null));
+        Collections.sort(tokens, comparator);
+
+        List<String> actual = toClassesNames(tokens);
+        List<String> expected = Arrays.asList(
+                "AddColumnToModel",
+                "DropColumnToDb",
+                "DropRelationshipToDb",
+                "DropTableToDb",
+                "AddColumnToDb",
+                "CreateTableToDb",
+                "AddRelationshipToDb"
+        );
+
+        assertEquals(expected, actual);
+    }
+
+}