Repository: cayenne Updated Branches: refs/heads/master ad9447556 -> 8ac060fce
CAY-2114 cdbimport: object layer settings are not respected * propagating top-level ObjectNameGenerator down to all tokens Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/603117cd Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/603117cd Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/603117cd Branch: refs/heads/master Commit: 603117cd75b45cce71e5cfad1c6d7bf2aea76044 Parents: ad94475 Author: Andrus Adamchik <[email protected]> Authored: Fri Sep 30 21:32:57 2016 +0300 Committer: Andrus Adamchik <[email protected]> Committed: Fri Sep 30 21:38:20 2016 +0300 ---------------------------------------------------------------------- .../cayenne/dbsync/merge/AddColumnToModel.java | 13 ++-- .../dbsync/merge/AddRelationshipToModel.java | 65 +++++++++----------- .../dbsync/merge/CreateTableToModel.java | 14 ++--- .../cayenne/dbsync/merge/DropColumnToModel.java | 6 +- .../dbsync/merge/DropRelationshipToModel.java | 2 +- .../cayenne/dbsync/merge/DropTableToModel.java | 4 +- .../dbsync/merge/EntityMergeSupport.java | 13 ++-- .../cayenne/dbsync/merge/MergerContext.java | 58 ++++++++++++++--- .../cayenne/dbsync/merge/MergerToken.java | 4 +- .../dbsync/merge/SetAllowNullToModel.java | 2 +- .../dbsync/merge/SetColumnTypeToModel.java | 2 +- .../cayenne/dbsync/merge/SetNotNullToModel.java | 2 +- .../dbsync/merge/SetPrimaryKeyToModel.java | 2 +- .../naming/LegacyObjectNameGenerator.java | 8 ++- .../dbsync/merge/EntityMergeSupportIT.java | 4 +- .../tools/dbimport/DbImportConfiguration.java | 15 +++-- .../tools/dbimport/DefaultDbImportAction.java | 22 +++++-- .../modeler/action/CreateObjEntityAction.java | 3 +- .../modeler/dialog/db/MergerOptions.java | 6 +- 19 files changed, 146 insertions(+), 99 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddColumnToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddColumnToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddColumnToModel.java index 30390ca..823a81d 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddColumnToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddColumnToModel.java @@ -26,7 +26,6 @@ import org.apache.cayenne.map.ObjEntity; /** * A {@link MergerToken} to add a {@link DbAttribute} to a {@link DbEntity}. The * {@link EntityMergeSupport} will be used to update the mapped {@link ObjEntity} - * */ public class AddColumnToModel extends AbstractToModelToken.EntityAndColumn { @@ -34,22 +33,20 @@ public class AddColumnToModel extends AbstractToModelToken.EntityAndColumn { super("Add Column", entity, column); } + @Override public MergerToken createReverse(MergerTokenFactory factory) { return factory.createDropColumnToDb(getEntity(), getColumn()); } + @Override public void execute(MergerContext mergerContext) { getEntity().addAttribute(getColumn()); - // TODO: use EntityMergeSupport from DbImportConfiguration... otherwise we are ignoring a bunch of - // important settings - - EntityMergeSupport entityMergeSupport = new EntityMergeSupport(mergerContext.getDataMap()); - for(ObjEntity e : getEntity().mappedObjEntities()) { - entityMergeSupport.synchronizeOnDbAttributeAdded(e, getColumn()); + for (ObjEntity e : getEntity().mappedObjEntities()) { + mergerContext.getEntityMergeSupport().synchronizeOnDbAttributeAdded(e, getColumn()); } - mergerContext.getModelMergeDelegate().dbAttributeAdded(getColumn()); + mergerContext.getDelegate().dbAttributeAdded(getColumn()); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java index f516a3e..5ae2d3f 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java @@ -28,34 +28,15 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity { public static final String COMMA_SEPARATOR = ", "; public static final int COMMA_SEPARATOR_LENGTH = COMMA_SEPARATOR.length(); - private DbRelationship rel; - public AddRelationshipToModel(DbEntity entity, DbRelationship rel) { - super("Add Relationship", entity); - this.rel = rel; - } - - public MergerToken createReverse(MergerTokenFactory factory) { - return factory.createDropRelationshipToDb(getEntity(), rel); - } - - public void execute(MergerContext mergerContext) { - getEntity().addRelationship(rel); - // TODO: add reverse relationship as well if it does not exist - - // TODO: use EntityMergeSupport from DbImportConfiguration... otherwise we are ignoring a bunch of - // important settings - - EntityMergeSupport entityMergeSupport = new EntityMergeSupport(mergerContext.getDataMap()); - for(ObjEntity e : getEntity().mappedObjEntities()) { - entityMergeSupport.synchronizeOnDbRelationshipAdded(e, rel); - } + private DbRelationship relationship; - mergerContext.getModelMergeDelegate().dbRelationshipAdded(rel); + public AddRelationshipToModel(DbEntity entity, DbRelationship relationship) { + super("Add Relationship", entity); + this.relationship = relationship; } - @Override - public String getTokenValue() { + public static String getTokenValue(DbRelationship rel) { String attributes = ""; if (rel.getJoins().size() == 1) { attributes = rel.getJoins().get(0).getTargetName(); @@ -70,26 +51,38 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity { return rel.getName() + " " + rel.getSourceEntity().getName() + "->" + rel.getTargetEntityName() + "." + attributes; } + @Override + public MergerToken createReverse(MergerTokenFactory factory) { + return factory.createDropRelationshipToDb(getEntity(), relationship); + } - public static String getTokenValue(DbRelationship rel) { + @Override + public void execute(MergerContext context) { + + getEntity().addRelationship(relationship); + + // TODO: add reverse relationship as well if it does not exist + + for (ObjEntity e : getEntity().mappedObjEntities()) { + context.getEntityMergeSupport().synchronizeOnDbRelationshipAdded(e, relationship); + } + + context.getDelegate().dbRelationshipAdded(relationship); + } + + @Override + public String getTokenValue() { String attributes = ""; - if (rel.getJoins().size() == 1) { - attributes = rel.getJoins().get(0).getTargetName(); + if (relationship.getJoins().size() == 1) { + attributes = relationship.getJoins().get(0).getTargetName(); } else { - for (DbJoin dbJoin : rel.getJoins()) { + for (DbJoin dbJoin : relationship.getJoins()) { attributes += dbJoin.getTargetName() + COMMA_SEPARATOR; } attributes = "{" + attributes.substring(0, attributes.length() - COMMA_SEPARATOR_LENGTH) + "}"; } - return rel.getName() + " " + rel.getSourceEntity().getName() + "->" + rel.getTargetEntityName() + "." + attributes; + return relationship.getName() + " " + relationship.getSourceEntity().getName() + "->" + relationship.getTargetEntityName() + "." + attributes; } - - public DbRelationship getRelationship() { - return rel; - } - - - } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java index 436a1f5..98a8f3a 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java @@ -53,10 +53,11 @@ public class CreateTableToModel extends AbstractToModelToken.Entity { objEntityClassName = n; } - public void execute(MergerContext mergerContext) { + @Override + public void execute(MergerContext context) { DbEntity dbEntity = getEntity(); - DataMap map = mergerContext.getDataMap(); + DataMap map = context.getDataMap(); map.addDbEntity(dbEntity); // create a ObjEntity @@ -94,13 +95,10 @@ public class CreateTableToModel extends AbstractToModelToken.Entity { map.addObjEntity(objEntity); // presumably there are no other ObjEntities pointing to this DbEntity, so syncing just this one... + context.getEntityMergeSupport().synchronizeWithDbEntity(objEntity); - // TODO: use EntityMergeSupport from DbImportConfiguration... otherwise we are ignoring a bunch of - // important settings - new EntityMergeSupport(map).synchronizeWithDbEntity(objEntity); - - mergerContext.getModelMergeDelegate().dbEntityAdded(getEntity()); - mergerContext.getModelMergeDelegate().objEntityAdded(objEntity); + context.getDelegate().dbEntityAdded(getEntity()); + context.getDelegate().objEntityAdded(objEntity); } public MergerToken createReverse(MergerTokenFactory factory) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropColumnToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropColumnToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropColumnToModel.java index ceb03bc..70d1b1c 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropColumnToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropColumnToModel.java @@ -52,7 +52,7 @@ public class DropColumnToModel extends AbstractToModelToken.EntityAndColumn { for (DbRelationship dbRelationship : dbRelationships) { for (DbJoin join : dbRelationship.getJoins()) { if (join.getSource() == getColumn() || join.getTarget() == getColumn()) { - remove(mergerContext.getModelMergeDelegate(), dbRelationship, true); + remove(mergerContext.getDelegate(), dbRelationship, true); } } } @@ -62,7 +62,7 @@ public class DropColumnToModel extends AbstractToModelToken.EntityAndColumn { ObjAttribute objAttribute = objEntity.getAttributeForDbAttribute(getColumn()); if (objAttribute != null) { objEntity.removeAttribute(objAttribute.getName()); - mergerContext.getModelMergeDelegate().objAttributeRemoved(objAttribute); + mergerContext.getDelegate().objAttributeRemoved(objAttribute); } } @@ -70,6 +70,6 @@ public class DropColumnToModel extends AbstractToModelToken.EntityAndColumn { // remove DbAttribute getEntity().removeAttribute(getColumn().getName()); - mergerContext.getModelMergeDelegate().dbAttributeRemoved(getColumn()); + mergerContext.getDelegate().dbAttributeRemoved(getColumn()); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModel.java index 686df6e..082c33a 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModel.java @@ -36,7 +36,7 @@ public class DropRelationshipToModel extends AbstractToModelToken.Entity { } public void execute(MergerContext mergerContext) { - remove(mergerContext.getModelMergeDelegate(), rel, true); + remove(mergerContext.getDelegate(), rel, true); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropTableToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropTableToModel.java index 7a47f37..3bdd8f3 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropTableToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropTableToModel.java @@ -41,9 +41,9 @@ public class DropTableToModel extends AbstractToModelToken.Entity { public void execute(MergerContext mergerContext) { for (ObjEntity objEntity : getEntity().mappedObjEntities()) { objEntity.getDataMap().removeObjEntity(objEntity.getName(), true); - mergerContext.getModelMergeDelegate().objEntityRemoved(objEntity); + mergerContext.getDelegate().objEntityRemoved(objEntity); } getEntity().getDataMap().removeDbEntity(getEntity().getName(), true); - mergerContext.getModelMergeDelegate().dbEntityRemoved(getEntity()); + mergerContext.getDelegate().dbEntityRemoved(getEntity()); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java index e055883..c7fc8de 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java @@ -20,6 +20,9 @@ package org.apache.cayenne.dbsync.merge; import org.apache.cayenne.dba.TypesMapping; +import org.apache.cayenne.dbsync.naming.DuplicateNameResolver; +import org.apache.cayenne.dbsync.naming.NameCheckers; +import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; @@ -29,10 +32,6 @@ import org.apache.cayenne.map.Entity; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; import org.apache.cayenne.map.ObjRelationship; -import org.apache.cayenne.dbsync.naming.DuplicateNameResolver; -import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator; -import org.apache.cayenne.dbsync.naming.NameCheckers; -import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator; import org.apache.cayenne.util.DeleteRuleUpdater; import org.apache.cayenne.util.EntityMergeListener; import org.apache.commons.logging.Log; @@ -77,11 +76,7 @@ public class EntityMergeSupport { protected boolean removeMeaningfulFKs; protected boolean removeMeaningfulPKs; protected boolean usePrimitives; - - public EntityMergeSupport(DataMap map) { - this(map, new LegacyObjectNameGenerator(), true); - } - + /** * @since 3.0 */ http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java index 772de97..3605e10 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java @@ -20,6 +20,8 @@ package org.apache.cayenne.dbsync.merge; import org.apache.cayenne.access.DataNode; import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.dbsync.reverse.naming.DefaultObjectNameGenerator; +import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.validation.ValidationResult; @@ -36,12 +38,16 @@ public class MergerContext { private DataNode dataNode; private ValidationResult validationResult; private ModelMergeDelegate delegate; + private EntityMergeSupport entityMergeSupport; protected MergerContext() { } + /** + * @since 4.0 + */ public static Builder builder(DataMap dataMap) { - return new Builder().dataMap(dataMap); + return new Builder(dataMap); } /** @@ -53,6 +59,13 @@ public class MergerContext { } /** + * @since 4.0 + */ + public EntityMergeSupport getEntityMergeSupport() { + return entityMergeSupport; + } + + /** * Returns the DataMap that is the target of a the merge operation. * * @return the DataMap that is the target of a the merge operation. @@ -73,23 +86,46 @@ public class MergerContext { * Returns a callback object that is invoked as the merge proceeds through tokens, modifying the DataMap. * * @return a callback object that is invoked as the merge proceeds through tokens, modifying the DataMap. + * @since 4.0 */ - public ModelMergeDelegate getModelMergeDelegate() { + public ModelMergeDelegate getDelegate() { return delegate; } + /** + * @deprecated since 4.0 in favor of {@link #getDelegate()}. + */ + @Deprecated + public ModelMergeDelegate getModelMergeDelegate() { + return getDelegate(); + } + public static class Builder { private MergerContext context; - private Builder() { + private Builder(DataMap dataMap) { this.context = new MergerContext(); + this.context.dataMap = Objects.requireNonNull(dataMap); this.context.validationResult = new ValidationResult(); - this.context.delegate = new DefaultModelMergeDelegate(); - this.context.dataNode = new DataNode(); } public MergerContext build() { + + // init missing defaults ... + + if (context.entityMergeSupport == null) { + nameGenerator(new DefaultObjectNameGenerator()); + } + + if (context.delegate == null) { + delegate(new DefaultModelMergeDelegate()); + } + + if (context.dataNode == null) { + dataNode(new DataNode()); + } + return context; } @@ -98,6 +134,13 @@ public class MergerContext { return this; } + public Builder nameGenerator(ObjectNameGenerator nameGenerator) { + context.entityMergeSupport = new EntityMergeSupport(context.getDataMap(), + Objects.requireNonNull(nameGenerator), + true); // should the last argument also be a part of the builder? + return this; + } + public Builder dataNode(DataNode dataNode) { this.context.dataNode = Objects.requireNonNull(dataNode); return this; @@ -109,10 +152,5 @@ public class MergerContext { dataNode.setAdapter(adapter); return dataNode(dataNode); } - - public Builder dataMap(DataMap dataMap) { - context.dataMap = Objects.requireNonNull(dataMap); - return this; - } } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerToken.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerToken.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerToken.java index 5359b62..5088f97 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerToken.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerToken.java @@ -46,8 +46,8 @@ public interface MergerToken { /** * Executes synchronization operation. * - * @param mergerContext operation context. + * @param context merge operation context. */ - void execute(MergerContext mergerContext); + void execute(MergerContext context); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetAllowNullToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetAllowNullToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetAllowNullToModel.java index 71a0937..5d9c890 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetAllowNullToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetAllowNullToModel.java @@ -38,6 +38,6 @@ public class SetAllowNullToModel extends AbstractToModelToken.EntityAndColumn { public void execute(MergerContext mergerContext) { getColumn().setMandatory(false); - mergerContext.getModelMergeDelegate().dbAttributeModified(getColumn()); + mergerContext.getDelegate().dbAttributeModified(getColumn()); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetColumnTypeToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetColumnTypeToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetColumnTypeToModel.java index 262c3a6..cf2b1e0 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetColumnTypeToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetColumnTypeToModel.java @@ -50,7 +50,7 @@ public class SetColumnTypeToModel extends AbstractToModelToken.Entity { columnOriginal.setMaxLength(columnNew.getMaxLength()); columnOriginal.setAttributePrecision(columnNew.getAttributePrecision()); columnOriginal.setScale(columnNew.getScale()); - mergerContext.getModelMergeDelegate().dbAttributeModified(columnOriginal); + mergerContext.getDelegate().dbAttributeModified(columnOriginal); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetNotNullToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetNotNullToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetNotNullToModel.java index 9ae95b5..7402f57 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetNotNullToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetNotNullToModel.java @@ -38,6 +38,6 @@ public class SetNotNullToModel extends AbstractToModelToken.EntityAndColumn { public void execute(MergerContext mergerContext) { getColumn().setMandatory(true); - mergerContext.getModelMergeDelegate().dbAttributeModified(getColumn()); + mergerContext.getDelegate().dbAttributeModified(getColumn()); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToModel.java index 6785a2f..198fe4f 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToModel.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/SetPrimaryKeyToModel.java @@ -69,7 +69,7 @@ public class SetPrimaryKeyToModel extends AbstractToModelToken.Entity { if (wasPrimaryKey != willBePrimaryKey) { attr.setPrimaryKey(willBePrimaryKey); e.dbAttributeChanged(new AttributeEvent(this, attr, e)); - mergerContext.getModelMergeDelegate().dbAttributeModified(attr); + mergerContext.getDelegate().dbAttributeModified(attr); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java index 1c52a6e..986b192 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java @@ -25,13 +25,14 @@ import org.apache.cayenne.map.DbRelationship; import org.apache.cayenne.util.Util; /** - * BasicNamingStrategy is an naming strategy that creates names in Cayenne's - * old-fashioned manner, i.e. the same way Cayenne did before 3.0 + * An ObjectNameGenerator that creates names in Cayenne's old-fashioned style. I.e. the same way Cayenne did before 3.0, + * with "to" prefixes and "array" suffixes. * * @since 4.0 */ public class LegacyObjectNameGenerator implements ObjectNameGenerator { + @Override public String createDbRelationshipName( ExportedKey key, boolean toMany) { @@ -40,14 +41,17 @@ public class LegacyObjectNameGenerator implements ObjectNameGenerator { return Util.underscoredToJava(uglyName, false); } + @Override public String createObjEntityName(DbEntity dbEntity) { return Util.underscoredToJava(dbEntity.getName(), true); } + @Override public String createObjAttributeName(DbAttribute attr) { return Util.underscoredToJava(attr.getName(), false); } + @Override public String createObjRelationshipName(DbRelationship dbRel) { return Util.underscoredToJava(dbRel.getName(), false); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java index d63c6a4..d21b58c 100644 --- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java +++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.cayenne.dbsync.merge; +import org.apache.cayenne.dbsync.reverse.naming.DefaultObjectNameGenerator; import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.DbJoin; @@ -86,7 +87,8 @@ public class EntityMergeSupportIT extends MergeCase { objEntity2.setDbEntity(dbEntity2); map.addObjEntity(objEntity2); - assertTrue(new EntityMergeSupport(map).synchronizeWithDbEntities(Arrays.asList(objEntity1, objEntity2))); + assertTrue(new EntityMergeSupport(map, new DefaultObjectNameGenerator(), true) + .synchronizeWithDbEntities(Arrays.asList(objEntity1, objEntity2))); assertNotNull(objEntity1.getAttribute("name")); assertNotNull(objEntity1.getRelationship("rel1To2")); assertNotNull(objEntity2.getRelationship("rel2To1")); http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java ---------------------------------------------------------------------- diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java index e45cdf9..57953c5 100644 --- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java +++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java @@ -35,11 +35,11 @@ import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate; import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate; import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter; import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig; +import org.apache.cayenne.dbsync.reverse.naming.DefaultObjectNameGenerator; +import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator; -import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator; import org.apache.cayenne.resource.URLResource; import org.apache.commons.logging.Log; @@ -163,23 +163,28 @@ public class DbImportConfiguration { } }; - // TODO: load via DI AdhocObjectFactory + loader.setNameGenerator(getNameGenerator()); return loader; } public ObjectNameGenerator getNameGenerator() { + + // TODO: load via DI AdhocObjectFactory + + // TODO: not a singleton; called from different places... + String namingStrategy = getNamingStrategy(); if (namingStrategy != null) { try { return (ObjectNameGenerator) Class.forName(namingStrategy).newInstance(); } catch (Exception e) { - throw new CayenneRuntimeException("Error creating name generator", e); + throw new CayenneRuntimeException("Error creating name generator: " + namingStrategy, e); } } - return new LegacyObjectNameGenerator(); // TODO + return new DefaultObjectNameGenerator(); } public String getDriver() { http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java ---------------------------------------------------------------------- diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java index 7d17fd7..e7adb7c 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 @@ -33,6 +33,7 @@ import org.apache.cayenne.dbsync.merge.ModelMergeDelegate; import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate; import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory; import org.apache.cayenne.dbsync.reverse.db.DbLoader; +import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.EntityResolver; @@ -154,14 +155,19 @@ public class DefaultDbImportAction implements DbImportAction { } final Collection<ObjEntity> loadedObjEntities = new LinkedList<>(); - DataMap executed = execute(new ProxyModelMergeDelegate(config.createMergeDelegate()) { + + ModelMergeDelegate delegate = new ProxyModelMergeDelegate(config.createMergeDelegate()) { @Override public void objEntityAdded(ObjEntity ent) { loadedObjEntities.add(ent); super.objEntityAdded(ent); } + }; - }, existing, log(sort(reverse(mergerTokenFactory, mergeTokens)))); + DataMap executed = execute(delegate, + existing, + log(sort(reverse(mergerTokenFactory, mergeTokens))), + config.getNameGenerator()); DbLoader.flattenManyToManyRelationships(executed, loadedObjEntities, config.getNameGenerator()); relationshipsSanity(executed); @@ -226,9 +232,15 @@ public class DefaultDbImportAction implements DbImportAction { /** * Performs configured schema operations via DbGenerator. */ - private DataMap execute(ModelMergeDelegate mergeDelegate, DataMap dataMap, Collection<MergerToken> tokens) { - - MergerContext mergerContext = MergerContext.builder(dataMap).delegate(mergeDelegate).build(); + private DataMap execute(ModelMergeDelegate mergeDelegate, + DataMap dataMap, + Collection<MergerToken> tokens, + ObjectNameGenerator nameGenerator) { + + MergerContext mergerContext = MergerContext.builder(dataMap) + .delegate(mergeDelegate) + .nameGenerator(nameGenerator) + .build(); for (MergerToken token : tokens) { try { http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java index 254f18e..8a2bd4b 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java @@ -24,6 +24,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.dbsync.merge.EntityMergeSupport; import org.apache.cayenne.dbsync.naming.DuplicateNameResolver; import org.apache.cayenne.dbsync.naming.NameCheckers; +import org.apache.cayenne.dbsync.reverse.naming.DefaultObjectNameGenerator; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.ObjEntity; @@ -92,7 +93,7 @@ public class CreateObjEntityAction extends CayenneAction { dataMap.addObjEntity(entity); // perform the merge - EntityMergeSupport merger = new EntityMergeSupport(dataMap); + EntityMergeSupport merger = new EntityMergeSupport(dataMap, new DefaultObjectNameGenerator(), true); merger.addEntityMergeListener(DeleteRuleUpdater.getEntityMergeListener()); merger.synchronizeWithDbEntity(entity); http://git-wip-us.apache.org/repos/asf/cayenne/blob/603117cd/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java index b8e2a08..271fd9b 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java @@ -409,8 +409,10 @@ public class MergerOptions extends CayenneController { DataSource dataSource = connectionInfo.makeDataSource(getApplication() .getClassLoadingService()); - MergerContext mergerContext = MergerContext.builder(dataMap).syntheticDataNode(dataSource, adapter) - .delegate(delegate).build(); + MergerContext mergerContext = MergerContext.builder(dataMap) + .syntheticDataNode(dataSource, adapter) + .delegate(delegate) + .build(); boolean modelChanged = false; for (MergerToken tok : tokensToMigrate) {
