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 b5bfd40e38..7b783218e4 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 @@ -22,7 +22,6 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory; import org.apache.cayenne.dbsync.merge.token.EmptyValueForNullProvider; import org.apache.cayenne.dbsync.merge.token.MergerToken; -import org.apache.cayenne.dbsync.merge.token.TokenComparator; import org.apache.cayenne.dbsync.merge.token.ValueForNullProvider; import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig; import org.apache.cayenne.dbsync.reverse.filters.PatternFilter; @@ -76,7 +75,7 @@ private List createTokens() { for(AbstractMerger merger : mergerList) { tokens.addAll(merger.createMergeTokens()); } - Collections.sort(tokens, new TokenComparator()); + Collections.sort(tokens); return tokens; } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractMergerToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractMergerToken.java new file mode 100644 index 0000000000..40f2980333 --- /dev/null +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/AbstractMergerToken.java @@ -0,0 +1,59 @@ +/***************************************************************** + * 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; + +/** + * @since 4.0 + */ +public abstract class AbstractMergerToken implements MergerToken { + + private final String tokenName; + + private final int sortingWeight; + + protected AbstractMergerToken(String tokenName, int sortingWeight) { + this.tokenName = tokenName; + this.sortingWeight = sortingWeight; + } + + @Override + public final String getTokenName() { + return tokenName; + } + + @Override + public int getSortingWeight() { + return sortingWeight; + } + + @Override + public int compareTo(MergerToken o) { + return getSortingWeight() - o.getSortingWeight(); + } + + @Override + public String toString() { + return getTokenName() + ' ' + getTokenValue() + ' ' + getDirection(); + } + + public boolean isEmpty() { + return false; + } +} 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 e8dc4cb4af..af261dde0e 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 @@ -65,4 +65,14 @@ public String getTokenName() { public String getTokenValue() { return reverse.getTokenValue(); } + + @Override + public int getSortingWeight() { + return 0; + } + + @Override + public int compareTo(MergerToken o) { + return -o.getSortingWeight(); + } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/MergerToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/MergerToken.java index 954f512bf8..1c53f7900c 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/MergerToken.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/MergerToken.java @@ -26,12 +26,14 @@ /** * Represents a minimal atomic synchronization operation between database and Cayenne model. */ -public interface MergerToken { +public interface MergerToken extends Comparable { String getTokenName(); String getTokenValue(); + int getSortingWeight(); + /** * The direction of this token. One of {@link MergeDirection#TO_DB} or * {@link MergeDirection#TO_MODEL} diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/TokenComparator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/TokenComparator.java deleted file mode 100644 index 249b99f1d0..0000000000 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/TokenComparator.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.token; - -import java.util.Comparator; - -import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken; -import org.apache.cayenne.dbsync.merge.token.db.AddRelationshipToDb; -import org.apache.cayenne.dbsync.merge.token.model.AddRelationshipToModel; - -/** - * Simple sort of merge tokens. - * Just move all relationships creation tokens to the end of the list. - */ -public class TokenComparator implements Comparator { - - @Override - public int compare(MergerToken o1, MergerToken o2) { - if (o1 instanceof AbstractToDbToken && o2 instanceof AbstractToDbToken) { - if (o1 instanceof AddRelationshipToDb && o2 instanceof AddRelationshipToDb) { - return 0; - } - - if (!(o1 instanceof AddRelationshipToDb || o2 instanceof AddRelationshipToDb)) { - return 0; - } - - return o1 instanceof AddRelationshipToDb ? 1 : -1; - } - - if (o1 instanceof AddRelationshipToModel && o2 instanceof AddRelationshipToModel) { - return 0; - } - - if (!(o1 instanceof AddRelationshipToModel || o2 instanceof AddRelationshipToModel)) { - return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName()); - } - - return o1 instanceof AddRelationshipToModel ? 1 : -1; - } -} diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java index 11812b87b9..8370a9d1f0 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java @@ -22,6 +22,7 @@ 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.dbsync.merge.token.AbstractMergerToken; import org.apache.cayenne.dbsync.merge.token.MergerToken; import org.apache.cayenne.log.JdbcEventLogger; import org.apache.cayenne.map.DbAttribute; @@ -37,22 +38,10 @@ * Common abstract superclass for all {@link MergerToken}s going from the model * to the database. */ -public abstract class AbstractToDbToken implements MergerToken, Comparable { +public abstract class AbstractToDbToken extends AbstractMergerToken { - 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; + protected AbstractToDbToken(String tokenName, int sortingWeight) { + super(tokenName, sortingWeight); } @Override @@ -62,7 +51,7 @@ public void execute(MergerContext mergerContext) { } } - protected void executeSql(MergerContext mergerContext, String sql) { + void executeSql(MergerContext mergerContext, String sql) { JdbcEventLogger logger = mergerContext.getDataNode().getJdbcEventLogger(); logger.log(sql); @@ -77,23 +66,19 @@ protected void executeSql(MergerContext mergerContext, String sql) { } } - @Override - public String toString() { - return getTokenName() + ' ' + getTokenValue() + ' ' + getDirection(); - } + public abstract List createSql(DbAdapter adapter); - public boolean isEmpty() { - return false; + @Override + public final MergeDirection getDirection() { + return MergeDirection.TO_DB; } - public abstract List createSql(DbAdapter adapter); - abstract static class Entity extends AbstractToDbToken { - private DbEntity entity; + private final DbEntity entity; - public Entity(String tokenName, DbEntity entity) { - super(tokenName); + protected Entity(String tokenName, int sortingWeight, DbEntity entity) { + super(tokenName, sortingWeight); this.entity = entity; } @@ -104,20 +89,14 @@ public DbEntity getEntity() { 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; + private final DbAttribute column; - public EntityAndColumn(String tokenName, DbEntity entity, DbAttribute column) { - super(tokenName, entity); + protected EntityAndColumn(String tokenName, int sortingWeight, DbEntity entity, DbAttribute column) { + super(tokenName, sortingWeight, entity); this.column = column; } @@ -129,6 +108,5 @@ public DbAttribute getColumn() { public String getTokenValue() { return getEntity().getName() + "." + getColumn().getName(); } - } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java index 65ce34153e..f0749fd2bf 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java @@ -33,7 +33,7 @@ public class AddColumnToDb extends AbstractToDbToken.EntityAndColumn { public AddColumnToDb(DbEntity entity, DbAttribute column) { - super("Add Column", entity, column); + super("Add Column", 50, entity, column); } /** @@ -64,13 +64,4 @@ public List createSql(DbAdapter adapter) { 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); - } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java index 9502d06135..3959bd5e24 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java @@ -34,7 +34,7 @@ public class AddRelationshipToDb extends AbstractToDbToken.Entity { private DbRelationship relationship; public AddRelationshipToDb(DbEntity entity, DbRelationship relationship) { - super("Add foreign key", entity); + super("Add foreign key", 110, entity); this.relationship = relationship; } @@ -72,13 +72,4 @@ public boolean isEmpty() { return relationship.isSourceIndependentFromTargetChange(); } - @Override - public int compareTo(MergerToken o) { - // add all AddRelationshipToDb to the end. - if (o instanceof AddRelationshipToDb) { - return super.compareTo(o); - } - return 1; - } - } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java index ac2305b122..22bbd0a366 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java @@ -35,7 +35,7 @@ public class CreateTableToDb extends AbstractToDbToken.Entity { public CreateTableToDb(DbEntity entity) { - super("Create Table", entity); + super("Create Table", 40, entity); } @Override diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java index fc95745007..b96008bc86 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java @@ -32,7 +32,7 @@ public class DropColumnToDb extends AbstractToDbToken.EntityAndColumn { public DropColumnToDb(DbEntity entity, DbAttribute column) { - super("Drop Column", entity, column); + super("Drop Column", 20, entity, column); } @Override @@ -50,14 +50,4 @@ public List createSql(DbAdapter adapter) { 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); - } - } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java index 2e2e540593..f4f94c9f76 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java @@ -35,7 +35,7 @@ public class DropRelationshipToDb extends AbstractToDbToken.Entity { private DbRelationship relationship; public DropRelationshipToDb(DbEntity entity, DbRelationship relationship) { - super("Drop foreign key", entity); + super("Drop foreign key", 10, entity); this.relationship = relationship; } @@ -73,13 +73,4 @@ public String getTokenValue() { } 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; - } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java index 0c202d5fbe..59baa661d2 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java @@ -30,7 +30,7 @@ public class DropTableToDb extends AbstractToDbToken.Entity { public DropTableToDb(DbEntity entity) { - super("Drop Table", entity); + super("Drop Table", 30, entity); } @Override diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java index 0c25db98e2..85317c708c 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java @@ -36,7 +36,7 @@ public class SetAllowNullToDb extends AbstractToDbToken.EntityAndColumn { public SetAllowNullToDb(DbEntity entity, DbAttribute column) { - super("Set Allow Null", entity, column); + super("Set Allow Null", 70, entity, column); } @Override diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java index d5e998835d..331d550506 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java @@ -40,7 +40,7 @@ public class SetColumnTypeToDb extends AbstractToDbToken.Entity { private DbAttribute columnNew; public SetColumnTypeToDb(DbEntity entity, DbAttribute columnOriginal, DbAttribute columnNew) { - super("Set Column Type", entity); + super("Set Column Type", 60, entity); this.columnOriginal = columnOriginal; this.columnNew = columnNew; } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java index 34af9aaad3..735e20e004 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java @@ -35,7 +35,7 @@ public class SetNotNullToDb extends AbstractToDbToken.EntityAndColumn { public SetNotNullToDb(DbEntity entity, DbAttribute column) { - super("Set Not Null", entity, column); + super("Set Not Null", 90, entity, column); } @Override diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java index c48133a1a8..b35899bed0 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java @@ -39,7 +39,7 @@ public class SetPrimaryKeyToDb extends AbstractToDbToken.Entity { public SetPrimaryKeyToDb(DbEntity entity, Collection primaryKeyOriginal, Collection primaryKeyNew, String detectedPrimaryKeyName) { - super("Set Primary Key", entity); + super("Set Primary Key", 100, entity); this.primaryKeyOriginal = primaryKeyOriginal; this.primaryKeyNew = primaryKeyNew; diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java index 20918477e7..8bd29d0ccc 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java @@ -35,7 +35,7 @@ public class SetValueForNullToDb extends AbstractToDbToken.EntityAndColumn { private ValueForNullProvider valueForNullProvider; public SetValueForNullToDb(DbEntity entity, DbAttribute column, ValueForNullProvider valueForNullProvider) { - super("Set value for null", entity, column); + super("Set value for null", 80, entity, column); this.valueForNullProvider = valueForNullProvider; } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java index cdf0a74029..a6544b2933 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java @@ -20,6 +20,7 @@ package org.apache.cayenne.dbsync.merge.token.model; import org.apache.cayenne.dbsync.merge.context.MergeDirection; +import org.apache.cayenne.dbsync.merge.token.AbstractMergerToken; import org.apache.cayenne.dbsync.merge.token.MergerToken; import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate; import org.apache.cayenne.map.DbAttribute; @@ -32,12 +33,10 @@ * Common abstract superclass for all {@link MergerToken}s going from the database to the * model. */ -public abstract class AbstractToModelToken implements MergerToken { +public abstract class AbstractToModelToken extends AbstractMergerToken { - private final String tokenName; - - protected AbstractToModelToken(String tokenName) { - this.tokenName = tokenName; + protected AbstractToModelToken(String tokenName, int sortingWeight) { + super(tokenName, sortingWeight); } protected static void remove(ModelMergeDelegate mergerContext, DbRelationship rel, boolean reverse) { @@ -68,31 +67,17 @@ protected static void remove(ModelMergeDelegate mergerContext, ObjRelationship r 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); + protected Entity(String tokenName, int sortingWeight, DbEntity entity) { + super(tokenName, sortingWeight); this.entity = entity; } @@ -103,15 +88,14 @@ public DbEntity getEntity() { 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); + protected EntityAndColumn(String tokenName, int sortingWeight, DbEntity entity, DbAttribute column) { + super(tokenName, sortingWeight, entity); this.column = column; } @@ -123,7 +107,5 @@ public DbAttribute getColumn() { public String getTokenValue() { return getEntity().getName() + "." + getColumn().getName(); } - } - } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java index 583277474c..07ce9475d9 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java @@ -34,7 +34,7 @@ public class AddColumnToModel extends AbstractToModelToken.EntityAndColumn { public AddColumnToModel(DbEntity entity, DbAttribute column) { - super("Add Column", entity, column); + super("Add Column", 55, entity, column); } @Override diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java index 73f611afb5..9202bd5681 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java @@ -35,7 +35,7 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity { private DbRelationship relationship; public AddRelationshipToModel(DbEntity entity, DbRelationship relationship) { - super("Add Relationship", entity); + super("Add Relationship", 115, entity); this.relationship = relationship; } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java index 05ae2e1a97..22158a6cc0 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java @@ -40,7 +40,7 @@ public class CreateTableToModel extends AbstractToModelToken.Entity { private String objEntityClassName; public CreateTableToModel(DbEntity entity) { - super("Create Table", entity); + super("Create Table", 45, entity); } /** 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 index d477eb36ea..63f35b719a 100644 --- 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 @@ -39,7 +39,7 @@ public class DropColumnToModel extends AbstractToModelToken.EntityAndColumn { public DropColumnToModel(DbEntity entity, DbAttribute column) { - super("Drop Column", entity, column); + super("Drop Column", 25, entity, column); } @Override 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 index 8d1a267b89..d11a0f3243 100644 --- 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 @@ -30,7 +30,7 @@ public class DropRelationshipToModel extends AbstractToModelToken.Entity { private final DbRelationship relationship; public DropRelationshipToModel(DbEntity entity, DbRelationship relationship) { - super("Drop db-relationship ", entity); + super("Drop db-relationship ", 15, entity); this.relationship = relationship; } 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 index 16c7d46f37..0f911dd09f 100644 --- 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 @@ -34,7 +34,7 @@ public class DropTableToModel extends AbstractToModelToken.Entity { public DropTableToModel(DbEntity entity) { - super("Drop Table", entity); + super("Drop Table", 35, entity); } @Override 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 index 7ac7a7de35..f7897bb521 100644 --- 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 @@ -32,7 +32,7 @@ public class SetAllowNullToModel extends AbstractToModelToken.EntityAndColumn { public SetAllowNullToModel(DbEntity entity, DbAttribute column) { - super("Set Allow Null", entity, column); + super("Set Allow Null", 75, entity, column); } @Override 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 index baf7e7dda2..e1a3566eca 100644 --- 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 @@ -38,7 +38,7 @@ public class SetColumnTypeToModel extends AbstractToModelToken.Entity { private DbAttribute columnNew; public SetColumnTypeToModel(DbEntity entity, DbAttribute columnOriginal, DbAttribute columnNew) { - super("Set Column Type", entity); + super("Set Column Type", 65, entity); this.columnOriginal = columnOriginal; this.columnNew = columnNew; } 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 index d8393227d8..807949d483 100644 --- 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 @@ -32,7 +32,7 @@ public class SetNotNullToModel extends AbstractToModelToken.EntityAndColumn { public SetNotNullToModel(DbEntity entity, DbAttribute column) { - super("Set Not Null", entity, column); + super("Set Not Null", 95, entity, column); } @Override 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 index 93d9cf0efb..308f290877 100644 --- 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 @@ -40,7 +40,7 @@ public class SetPrimaryKeyToModel extends AbstractToModelToken.Entity { public SetPrimaryKeyToModel(DbEntity entity, Collection primaryKeyOriginal, Collection primaryKeyNew, String detectedPrimaryKeyName) { - super("Set Primary Key", entity); + super("Set Primary Key", 105, entity); this.primaryKeyOriginal = primaryKeyOriginal; this.primaryKeyNew = primaryKeyNew; @@ -76,8 +76,6 @@ public void execute(MergerContext mergerContext) { e.dbAttributeChanged(new AttributeEvent(this, attr, e)); mergerContext.getDelegate().dbAttributeModified(attr); } - } - } } 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/TokenSortTest.java similarity index 70% rename from cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/TokenComparatorTest.java rename to cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/TokenSortTest.java index fc69a56a79..27703a22af 100644 --- 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/TokenSortTest.java @@ -41,14 +41,7 @@ import static org.junit.Assert.assertEquals; -public class TokenComparatorTest { - - TokenComparator comparator; - - @Before - public void setUp() { - comparator = new TokenComparator(); - } +public class TokenSortTest { private List toClassesNames(List sort) { List res = new ArrayList(sort.size()); @@ -58,6 +51,50 @@ private List toClassesNames(List sort) { return res; } + @Test + public void testSortStability() throws Exception { + List tokens = Arrays.asList( + new AddRelationshipToModel(null, null), + new AddColumnToModel(null, null), + new AddColumnToDb(null, null), + new CreateTableToModel(null), + new DropTableToModel(null), + new DropColumnToModel(null, null), + new DropRelationshipToModel(null, null) + ); + Collections.sort(tokens); + List actual = toClassesNames(tokens); + + List expected = Arrays.asList( + "DropRelationshipToModel", + "DropColumnToModel", + "DropTableToModel", + "CreateTableToModel", + "AddColumnToDb", + "AddColumnToModel", + "AddRelationshipToModel" + ); + + assertEquals(expected, actual); + + Collections.sort(tokens); + actual = toClassesNames(tokens); + assertEquals(expected, actual); + + List tokens2 = Arrays.asList( + new AddColumnToModel(null, null), + new AddRelationshipToModel(null, null), + new CreateTableToModel(null), + new AddColumnToDb(null, null), + new DropColumnToModel(null, null), + new DropRelationshipToModel(null, null), + new DropTableToModel(null) + ); + Collections.sort(tokens2); + actual = toClassesNames(tokens); + assertEquals(expected, actual); + } + @Test public void testToModelTokensCompare() throws Exception { List tokens = Arrays.asList( @@ -68,16 +105,16 @@ public void testToModelTokensCompare() throws Exception { new AddRelationshipToModel(null, null), new AddColumnToModel(null, null), new CreateTableToModel(null)); - Collections.sort(tokens, comparator); + Collections.sort(tokens); List actual = toClassesNames(tokens); List expected = Arrays.asList( - "AddColumnToDb", - "AddColumnToModel", - "CreateTableToModel", - "DropColumnToModel", "DropRelationshipToModel", + "DropColumnToModel", "DropTableToModel", + "CreateTableToModel", + "AddColumnToDb", + "AddColumnToModel", "AddRelationshipToModel" ); @@ -94,16 +131,16 @@ public void testToDbTokensCompare() throws Exception { new AddRelationshipToDb(null, null), new AddColumnToDb(null, null), new CreateTableToDb(null)); - Collections.sort(tokens, comparator); + Collections.sort(tokens); List actual = toClassesNames(tokens); List expected = Arrays.asList( - "AddColumnToModel", - "DropColumnToDb", "DropRelationshipToDb", + "DropColumnToDb", "DropTableToDb", - "AddColumnToDb", "CreateTableToDb", + "AddColumnToDb", + "AddColumnToModel", "AddRelationshipToDb" ); diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java index bee2de1a9c..575b0a49bf 100644 --- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java +++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java @@ -30,7 +30,6 @@ import org.apache.cayenne.dbsync.merge.token.MergerToken; import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate; import org.apache.cayenne.dbsync.reverse.dbload.ProxyModelMergeDelegate; -import org.apache.cayenne.dbsync.merge.token.TokenComparator; import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory; import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider; import org.apache.cayenne.dbsync.naming.ObjectNameGenerator; @@ -96,7 +95,7 @@ public DefaultDbImportAction(@Inject Log logger, } protected static List sort(List reverse) { - Collections.sort(reverse, new TokenComparator()); + Collections.sort(reverse); return reverse; } diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java index f17db1caee..42ff6e9f8f 100644 --- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java +++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java @@ -342,7 +342,7 @@ public void testMergeTokensSorting() { tokens.add(new CreateTableToDb(null)); tokens.add(new CreateTableToModel(null)); - assertEquals(asList("AddColumnToModel", "CreateTableToDb", "CreateTableToModel", "AddRelationshipToModel"), + assertEquals(asList("CreateTableToDb", "CreateTableToModel", "AddColumnToModel", "AddRelationshipToModel"), toClasses(DefaultDbImportAction.sort(tokens))); } diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt index 740698c9db..937d8e0c50 100644 --- a/docs/doc/src/main/resources/RELEASE-NOTES.txt +++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt @@ -19,6 +19,7 @@ CAY-2165 Explicit "contribution" API for easier expansion of DI collections and CAY-2166 Auto-loading of Cayenne modules CAY-2168 Split DbLoader to parts and clean it up CAY-2169 Split DbMerger to parts and clean it up +CAY-2170 MergeToken sorting is highly unstable Bug Fixes: diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java index 20e31e3ed6..14112c1f39 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java @@ -20,7 +20,6 @@ import org.apache.cayenne.dbsync.merge.context.MergeDirection; import org.apache.cayenne.dbsync.merge.token.MergerToken; -import org.apache.cayenne.dbsync.merge.token.TokenComparator; import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory; import org.apache.cayenne.modeler.Application; import org.apache.cayenne.modeler.util.CayenneController; @@ -232,7 +231,7 @@ public void reverseAllAction() { } } - Collections.sort(selectableTokensList, new TokenComparator()); + Collections.sort(selectableTokensList); AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel(); model.fireTableDataChanged(); } diff --git a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java index bbe88cd610..e92a63e328 100644 --- a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java +++ b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java @@ -47,7 +47,9 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Objects; import static org.apache.commons.lang.StringUtils.isBlank; @@ -205,6 +207,13 @@ public void testForceDataMapSchema() throws Exception { test("testForceDataMapSchema"); } + @Test + public void testComplexChangeOrder() throws Exception { + // after applying fix for CAY-2174 addressId should no longer be in CHILD table so this test will fail + // to fix it just remove "addressId" ObjAttribute in testComplexChangeOrder.map.xml-result + test("testComplexChangeOrder"); + } + /** * CREATE TABLE APP.A ( * id INTEGER NOT NULL, @@ -354,7 +363,10 @@ private void cleanDb(DbImportConfiguration dbImportConfiguration) throws ClassNo ResultSet keys = connection.getMetaData().getExportedKeys(null, schema, tableName); while (keys.next()) { - execute(stmt, "ALTER TABLE " + keys.getString("FKTABLE_NAME") + " DROP CONSTRAINT " + keys.getString("FK_NAME")); + String fkTableSchem = keys.getString("FKTABLE_SCHEM"); + String fkTableName = keys.getString("FKTABLE_NAME"); + String fkTableNameFull = (isBlank(fkTableSchem) ? "" : fkTableSchem + ".") + fkTableName; + execute(stmt, "ALTER TABLE " + fkTableNameFull + " DROP CONSTRAINT " + keys.getString("FK_NAME")); } String sql = "DROP TABLE " + tableNameFull; diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder-pom.xml new file mode 100644 index 0000000000..994fffefaf --- /dev/null +++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder-pom.xml @@ -0,0 +1,42 @@ + + + + + DbImporterMojo Test1 + + + + + maven-cayenne-plugin + + target/test-classes/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml + org.apache.derby.jdbc.EmbeddedDriver + jdbc:derby:memory:DbImporterMojoTest;create=true + + SCHEMA_01 + + + + + + + diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml new file mode 100644 index 0000000000..20ccc6904a --- /dev/null +++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml-result new file mode 100644 index 0000000000..95c3495a40 --- /dev/null +++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.map.xml-result @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.sql new file mode 100644 index 0000000000..9885bc7c50 --- /dev/null +++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testComplexChangeOrder.sql @@ -0,0 +1,34 @@ +-- 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. + +CREATE SCHEMA schema_01; +SET SCHEMA schema_01; + +CREATE TABLE schema_01.address ( + addrStr VARCHAR (250), + id INTEGER NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE schema_01.child ( + address_id INTEGER , + "date" DATE, + id INTEGER , + name VARCHAR(30) NOT NULL, + parent_id INTEGER , + CONSTRAINT fk_address FOREIGN KEY (address_id) REFERENCES schema_01.address (id) +); \ No newline at end of file