This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 0c5819521803598dd4f985aa66944f6cbcef2968 Author: Andrus Adamchik <[email protected]> AuthorDate: Sun Jul 19 18:30:32 2026 +0200 NameBuilder cleanup switch instead of visitor for main operations always passing parent to the factory --- .../dbsync/merge/context/EntityMergeSupport.java | 4 +- .../merge/token/model/AddRelationshipToModel.java | 5 +- .../merge/token/model/CreateTableToModel.java | 2 +- .../apache/cayenne/dbsync/naming/CallbackNode.java | 37 ++++ .../dbsync/naming/DeduplicationVisitor.java | 191 --------------------- .../dbsync/naming/DefaultBaseNameVisitor.java | 116 ------------- .../apache/cayenne/dbsync/naming/NameBuilder.java | 187 +++++++++++++++----- .../dbsync/naming/NormalizationVisitor.java | 117 ------------- .../dbimport/ManyToManyCandidateEntity.java | 2 +- .../dbsync/reverse/dbload/RelationshipLoader.java | 2 +- .../cayenne/dbsync/naming/NameBuilderTest.java | 70 ++++---- .../modeler/ui/action/CreateAttributeAction.java | 6 +- .../ui/action/CreateCallbackMethodAction.java | 3 +- .../modeler/ui/action/CreateDataMapAction.java | 2 +- .../modeler/ui/action/CreateDbEntityAction.java | 2 +- .../modeler/ui/action/CreateEmbeddableAction.java | 2 +- .../modeler/ui/action/CreateNodeAction.java | 2 +- .../modeler/ui/action/CreateObjEntityAction.java | 4 +- .../modeler/ui/action/CreateProcedureAction.java | 2 +- .../ui/action/CreateProcedureParameterAction.java | 2 +- .../modeler/ui/action/ImportDataMapAction.java | 2 +- .../modeler/ui/action/ImportEOModelAction.java | 2 +- .../modeler/ui/action/NewProjectAction.java | 2 +- .../cayenne/modeler/ui/action/PasteAction.java | 37 ++-- .../autorelationship/InferRelationshipsDialog.java | 5 +- .../ui/dbrelationship/DbRelationshipDialog.java | 6 +- .../relinfo/ObjRelationshipInfoDialog.java | 2 +- .../ui/project/querytype/QueryTypeDialog.java | 2 +- .../apache/cayenne/wocompat/EOModelProcessor.java | 2 +- 29 files changed, 268 insertions(+), 550 deletions(-) diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java index 0fc341035..6f37b18b4 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java @@ -201,7 +201,7 @@ public class EntityMergeSupport { private boolean createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) { ObjRelationship or = new ObjRelationship(); - or.setName(NameBuilder.of(or).parent(entity) + or.setName(NameBuilder.of(or, entity) .baseName(nameGenerator.relationshipName(dr)) .name()); @@ -268,7 +268,7 @@ public class EntityMergeSupport { private void addMissingAttribute(ObjEntity entity, DbAttribute da) { ObjAttribute oa = new ObjAttribute(); - oa.setName(NameBuilder.of(oa).parent(entity).baseName(nameGenerator.objAttributeName(da)).name()); + oa.setName(NameBuilder.of(oa, entity).baseName(nameGenerator.objAttributeName(da)).name()); oa.setEntity(entity); oa.setType(getTypeForObjAttribute(da)); oa.setDbAttributePath(da.getName()); 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 4c498af63..da4422c47 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 @@ -22,6 +22,7 @@ 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.dbsync.naming.NameBuilder; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.DbJoin; import org.apache.cayenne.map.DbRelationship; @@ -67,7 +68,9 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity { public void execute(MergerContext context) { // Set name to relationship if it was created without it, e.g. in createReverse() action if (relationship.getName() == null) { - relationship.setName(context.getNameGenerator().relationshipName(relationship)); + relationship.setName(NameBuilder.of(relationship, getEntity()) + .baseName(context.getNameGenerator().relationshipName(relationship)) + .name()); } getEntity().addRelationship(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 35f6405e3..c9d925522 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 @@ -65,7 +65,7 @@ public class CreateTableToModel extends AbstractToModelToken.Entity { ObjEntity objEntity = new ObjEntity(); objEntity.setName(NameBuilder - .of(objEntity).parent(dbEntity.getDataMap()) + .of(objEntity, dbEntity.getDataMap()) .baseName(context.getNameGenerator().objEntityName(dbEntity)) .name()); objEntity.setDbEntity(getEntity()); diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNode.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNode.java new file mode 100644 index 000000000..7ce508503 --- /dev/null +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNode.java @@ -0,0 +1,37 @@ +/* + * 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 + * + * https://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.naming; + +import org.apache.cayenne.configuration.ConfigurationNode; +import org.apache.cayenne.configuration.ConfigurationNodeVisitor; + +/** + * A pseudo-node representing an {@link org.apache.cayenne.map.ObjEntity} callback method. Callback methods are not + * {@link ConfigurationNode}s in the model, so this stand-in lets them flow through the {@link NameBuilder} naming + * algorithm like any other node. + * + * @since 5.0 + */ +public class CallbackNode implements ConfigurationNode { + + @Override + public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) { + return null; + } +} diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DeduplicationVisitor.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DeduplicationVisitor.java deleted file mode 100644 index 7483a8bd0..000000000 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DeduplicationVisitor.java +++ /dev/null @@ -1,191 +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 - * - * https://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.naming; - -import org.apache.cayenne.configuration.ConfigurationNode; -import org.apache.cayenne.configuration.ConfigurationNodeVisitor; -import org.apache.cayenne.configuration.DataChannelDescriptor; -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.DbAttribute; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.DbRelationship; -import org.apache.cayenne.map.Embeddable; -import org.apache.cayenne.map.EmbeddableAttribute; -import org.apache.cayenne.map.ObjAttribute; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.ObjRelationship; -import org.apache.cayenne.map.Procedure; -import org.apache.cayenne.map.ProcedureParameter; -import org.apache.cayenne.map.QueryDescriptor; - -import java.util.Objects; -import java.util.function.Predicate; - -class DeduplicationVisitor implements ConfigurationNodeVisitor<String> { - - private final ConfigurationNode parent; - private final String baseName; - private final String dupesPattern; - - DeduplicationVisitor(ConfigurationNode parent, String baseName, String dupesPattern) { - this.parent = parent; - this.baseName = Objects.requireNonNull(baseName); - this.dupesPattern = Objects.requireNonNull(dupesPattern); - } - - @Override - public String visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) { - // DataChannelDescriptor is top-level. No context or naming conflicts are expected... - return baseName; - } - - @Override - public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) { - return resolve(name -> { - DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) parent; - for (DataNodeDescriptor dataNodeDescriptor : dataChannelDescriptor.getNodeDescriptors()) { - if (dataNodeDescriptor.getName().equals(name)) { - return true; - } - } - - return false; - }); - } - - @Override - public String visitDataMap(DataMap dataMap) { - return resolve(name -> { - // null context is a situation when DataMap is a top level object of the project - if (parent == null) { - return false; - } - - if (parent instanceof DataChannelDescriptor domain) { - return domain.getDataMap(name) != null; - } - return false; - }); - } - - @Override - public String visitObjEntity(ObjEntity entity) { - return resolve(name -> ((DataMap) parent).getObjEntity(name) != null); - } - - @Override - public String visitDbEntity(DbEntity entity) { - return resolve(name -> ((DataMap) parent).getDbEntity(name) != null); - } - - @Override - public String visitEmbeddable(Embeddable embeddable) { - return resolve(name -> { - DataMap map = (DataMap) parent; - return map.getEmbeddable(map.getNameWithDefaultPackage(name)) != null; - }); - } - - @Override - public String visitEmbeddableAttribute(EmbeddableAttribute attribute) { - return resolve(name -> ((Embeddable) parent).getAttribute(name) != null); - } - - @Override - public String visitObjAttribute(ObjAttribute attribute) { - return resolveObjEntityProperty(); - } - - @Override - public String visitDbAttribute(DbAttribute attribute) { - return resolveDbEntityProperty(); - } - - @Override - public String visitObjRelationship(ObjRelationship relationship) { - return resolveObjEntityProperty(); - } - - @Override - public String visitDbRelationship(DbRelationship relationship) { - return resolveDbEntityProperty(); - } - - @Override - public String visitProcedure(Procedure procedure) { - return resolve(name -> ((DataMap) parent).getProcedure(name) != null); - } - - @Override - public String visitProcedureParameter(ProcedureParameter parameter) { - return resolve(name -> { - - // it doesn't matter if we create a parameter with a duplicate name.. parameters are positional anyway.. - // still try to use unique names for visual consistency - - Procedure procedure = (Procedure) parent; - for (ProcedureParameter parameter1 : procedure.getCallParameters()) { - if (name.equals(parameter1.getName())) { - return true; - } - } - - return false; - }); - } - - @Override - public String visitQuery(QueryDescriptor query) { - return resolve(name -> ((DataMap) parent).getQueryDescriptor(name) != null); - } - - String resolve(Predicate<String> nameChecker) { - int c = 1; - String name = baseName; - while (nameChecker.test(name)) { - name = String.format(dupesPattern, baseName, c++); - } - - return name; - } - - private String resolveDbEntityProperty() { - return resolve(name -> { - DbEntity entity = (DbEntity) parent; - // check if either attribute or relationship name matches... - return entity.getAttribute(name) != null || entity.getRelationship(name) != null; - }); - } - - private String resolveObjEntityProperty() { - return resolve(name -> { - ObjEntity entity = (ObjEntity) parent; - - // check if either attribute or relationship name matches... - if (entity.getAttribute(name) != null || entity.getRelationship(name) != null) { - return true; - } - - // check if there's a callback method that shadows attribute getter (unlikely, but still) - String conflictingCallback = "get" + NameUtil.capitalize(name); - return entity.getCallbackMethods().contains(conflictingCallback); - }); - } -} diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultBaseNameVisitor.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultBaseNameVisitor.java deleted file mode 100644 index 5801bc0d4..000000000 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultBaseNameVisitor.java +++ /dev/null @@ -1,116 +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 - * - * https://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.naming; - -import org.apache.cayenne.configuration.ConfigurationNodeVisitor; -import org.apache.cayenne.configuration.DataChannelDescriptor; -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.DbAttribute; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.DbRelationship; -import org.apache.cayenne.map.Embeddable; -import org.apache.cayenne.map.EmbeddableAttribute; -import org.apache.cayenne.map.ObjAttribute; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.ObjRelationship; -import org.apache.cayenne.map.Procedure; -import org.apache.cayenne.map.ProcedureParameter; -import org.apache.cayenne.map.QueryDescriptor; - -/** - * @since 4.0 - */ -class DefaultBaseNameVisitor implements ConfigurationNodeVisitor<String> { - - static final DefaultBaseNameVisitor INSTANCE = new DefaultBaseNameVisitor(); - - private DefaultBaseNameVisitor() { - } - - @Override - public String visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) { - return "project"; - } - - @Override - public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) { - return "datanode"; - } - - @Override - public String visitDataMap(DataMap dataMap) { - return "datamap"; - } - - @Override - public String visitObjEntity(ObjEntity entity) { - return "ObjEntity"; - } - - @Override - public String visitDbEntity(DbEntity entity) { - return "db_entity"; - } - - @Override - public String visitEmbeddable(Embeddable embeddable) { - return "Embeddable"; - } - - @Override - public String visitEmbeddableAttribute(EmbeddableAttribute attribute) { - return "untitledAttr"; - } - - @Override - public String visitObjAttribute(ObjAttribute attribute) { - return "untitledAttr"; - } - - @Override - public String visitDbAttribute(DbAttribute attribute) { - return "untitledAttr"; - } - - @Override - public String visitObjRelationship(ObjRelationship relationship) { - return "untitledRel"; - } - - @Override - public String visitDbRelationship(DbRelationship relationship) { - return "untitledRel"; - } - - @Override - public String visitProcedure(Procedure procedure) { - return "procedure"; - } - - @Override - public String visitProcedureParameter(ProcedureParameter parameter) { - return "UntitledProcedureParameter"; - } - - @Override - public String visitQuery(QueryDescriptor query) { - return "query"; - } -} diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java index 638fe7dc9..be98020db 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java @@ -19,10 +19,23 @@ package org.apache.cayenne.dbsync.naming; import org.apache.cayenne.configuration.ConfigurationNode; -import org.apache.cayenne.configuration.ConfigurationNodeVisitor; +import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.DbAttribute; +import org.apache.cayenne.map.DbEntity; +import org.apache.cayenne.map.DbRelationship; +import org.apache.cayenne.map.Embeddable; +import org.apache.cayenne.map.EmbeddableAttribute; +import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.map.ObjRelationship; +import org.apache.cayenne.map.Procedure; +import org.apache.cayenne.map.ProcedureParameter; +import org.apache.cayenne.map.QueryDescriptor; import java.util.Objects; +import java.util.function.Predicate; /** * A builder of names for model objects. Ensures that newly generated names do not conflict with the names of siblings @@ -33,30 +46,25 @@ import java.util.Objects; */ public class NameBuilder { - public static NameBuilder of(ConfigurationNode node) { - return new NameBuilder(node); - } - - // TODO: make callback a ConfigurationNode (or remove it from the model all together) to avoid a special case here - public static NameBuilder ofCallbackMethod() { - return new CallbackNameBuilder(); + /** + * Creates a builder for naming the given node under the given parent. The parent may be null for a top-level + * node (such as a project root) that has no siblings to clash with. + */ + public static NameBuilder of(ConfigurationNode node, ConfigurationNode parent) { + return new NameBuilder(node, parent); } private final ConfigurationNode nodeToName; - protected ConfigurationNode parent; - protected String dupesPattern; - protected String baseName; + private final ConfigurationNode parent; + private String dupesPattern; + private String baseName; - private NameBuilder(ConfigurationNode nodeToName) { + private NameBuilder(ConfigurationNode nodeToName, ConfigurationNode parent) { this.nodeToName = Objects.requireNonNull(nodeToName); + this.parent = parent; this.dupesPattern = "%s%d"; } - public NameBuilder parent(ConfigurationNode parent) { - this.parent = Objects.requireNonNull(parent); - return this; - } - public NameBuilder dupesPattern(String dupesPattern) { this.dupesPattern = Objects.requireNonNull(dupesPattern); return this; @@ -70,50 +78,139 @@ public class NameBuilder { public String name() { String baseName = this.baseName != null && !this.baseName.isEmpty() ? this.baseName - : nodeToName.acceptVisitor(DefaultBaseNameVisitor.INSTANCE); + : defaultBaseName(nodeToName); - String normalizedBaseName = nodeToName.acceptVisitor(new NormalizationVisitor(baseName)); - return nodeToName.acceptVisitor(new DeduplicationVisitor(parent, normalizedBaseName, dupesPattern)); + String normalizedBaseName = normalize(nodeToName, baseName); + return deduplicate(nodeToName, normalizedBaseName); } - static class CallbackNameBuilder extends NameBuilder { + private static String defaultBaseName(ConfigurationNode node) { + return switch (node) { + case DataChannelDescriptor ignored -> "project"; + case DataNodeDescriptor ignored -> "datanode"; + case DataMap ignored -> "datamap"; + case ObjEntity ignored -> "ObjEntity"; + case DbEntity ignored -> "db_entity"; + case Embeddable ignored -> "Embeddable"; + case EmbeddableAttribute ignored -> "untitledAttr"; + case ObjAttribute ignored -> "untitledAttr"; + case DbAttribute ignored -> "untitledAttr"; + case ObjRelationship ignored -> "untitledRel"; + case DbRelationship ignored -> "untitledRel"; + case Procedure ignored -> "procedure"; + case ProcedureParameter ignored -> "UntitledProcedureParameter"; + case QueryDescriptor ignored -> "query"; + case CallbackNode ignored -> "onEvent"; + default -> throw new IllegalArgumentException("Unsupported node type: " + node.getClass().getName()); + }; + } - public CallbackNameBuilder() { - super(new CallbackNode()); + private static String normalize(ConfigurationNode node, String baseName) { + return switch (node) { + case ObjEntity ignored -> NameUtil.capitalize(baseName); + case Embeddable ignored -> NameUtil.capitalize(baseName); + case EmbeddableAttribute ignored -> NameUtil.uncapitalize(baseName); + case ObjAttribute ignored -> NameUtil.uncapitalize(baseName); + case ObjRelationship ignored -> NameUtil.uncapitalize(baseName); + case DbRelationship ignored -> NameUtil.uncapitalize(baseName); + default -> baseName; + }; + } + + private String deduplicate(ConfigurationNode node, String baseName) { + + // a top-level node (e.g. a DataChannelDescriptor or a project-level DataMap) has no siblings to clash with + if (parent == null) { + return baseName; } - @Override - public String name() { - String baseName = this.baseName != null - ? this.baseName - : "onEvent"; + Predicate<String> nameChecker = switch (node) { + case DataNodeDescriptor ignored -> this::dataNodeExists; + case DataMap ignored -> name -> ((DataChannelDescriptor) parent).getDataMap(name) != null; + case ObjEntity ignored -> name -> ((DataMap) parent).getObjEntity(name) != null; + case DbEntity ignored -> name -> ((DataMap) parent).getDbEntity(name) != null; + case Embeddable ignored -> this::embeddableExists; + case EmbeddableAttribute ignored -> name -> ((Embeddable) parent).getAttribute(name) != null; + case ObjAttribute ignored -> this::objEntityPropertyExists; + case DbAttribute ignored -> this::dbEntityPropertyExists; + case ObjRelationship ignored -> this::objEntityPropertyExists; + case DbRelationship ignored -> this::dbEntityPropertyExists; + case Procedure ignored -> name -> ((DataMap) parent).getProcedure(name) != null; + case ProcedureParameter ignored -> this::procedureParameterExists; + case QueryDescriptor ignored -> name -> ((DataMap) parent).getQueryDescriptor(name) != null; + case CallbackNode ignored -> this::callbackMethodExists; + default -> throw new IllegalArgumentException("Unsupported node type: " + node.getClass().getName()); + }; + + int c = 1; + String name = baseName; + while (nameChecker.test(name)) { + name = String.format(dupesPattern, baseName, c++); + } + return name; + } - return new DeduplicationVisitor(parent, baseName, dupesPattern).resolve(name -> { + private boolean dataNodeExists(String name) { + DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) parent; + for (DataNodeDescriptor dataNodeDescriptor : dataChannelDescriptor.getNodeDescriptors()) { + if (dataNodeDescriptor.getName().equals(name)) { + return true; + } + } + return false; + } - ObjEntity entity = (ObjEntity) parent; + private boolean embeddableExists(String name) { + DataMap map = (DataMap) parent; + return map.getEmbeddable(map.getNameWithDefaultPackage(name)) != null; + } - if (entity.getCallbackMethods().contains(name)) { - return true; - } + private boolean procedureParameterExists(String name) { + // it doesn't matter if we create a parameter with a duplicate name. parameters are positional anyway. + // still try to use unique names for visual consistency + Procedure procedure = (Procedure) parent; + for (ProcedureParameter parameter : procedure.getCallParameters()) { + if (name.equals(parameter.getName())) { + return true; + } + } + return false; + } - if (name.startsWith("get")) { - String conflictingProperty = NameUtil.uncapitalize(name.substring(3)); + private boolean dbEntityPropertyExists(String name) { + DbEntity entity = (DbEntity) parent; + // check if either attribute or relationship name matches... + return entity.getAttribute(name) != null || entity.getRelationship(name) != null; + } - // check if either attribute or relationship name matches... - return entity.getAttribute(conflictingProperty) != null - || entity.getRelationship(conflictingProperty) != null; - } + private boolean objEntityPropertyExists(String name) { + ObjEntity entity = (ObjEntity) parent; - return false; - }); + // check if either attribute or relationship name matches... + if (entity.getAttribute(name) != null || entity.getRelationship(name) != null) { + return true; } + + // check if there's a callback method that shadows attribute getter (unlikely, but still) + String conflictingCallback = "get" + NameUtil.capitalize(name); + return entity.getCallbackMethods().contains(conflictingCallback); } - static class CallbackNode implements ConfigurationNode { + private boolean callbackMethodExists(String name) { + ObjEntity entity = (ObjEntity) parent; - @Override - public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) { - return null; + if (entity.getCallbackMethods().contains(name)) { + return true; } + + if (name.startsWith("get")) { + String conflictingProperty = NameUtil.uncapitalize(name.substring(3)); + + // check if either attribute or relationship name matches... + return entity.getAttribute(conflictingProperty) != null + || entity.getRelationship(conflictingProperty) != null; + } + + return false; } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NormalizationVisitor.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NormalizationVisitor.java deleted file mode 100644 index 10ff0e442..000000000 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NormalizationVisitor.java +++ /dev/null @@ -1,117 +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 - * - * https://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.naming; - -import org.apache.cayenne.configuration.ConfigurationNodeVisitor; -import org.apache.cayenne.configuration.DataChannelDescriptor; -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.DbAttribute; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.DbRelationship; -import org.apache.cayenne.map.Embeddable; -import org.apache.cayenne.map.EmbeddableAttribute; -import org.apache.cayenne.map.ObjAttribute; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.ObjRelationship; -import org.apache.cayenne.map.Procedure; -import org.apache.cayenne.map.ProcedureParameter; -import org.apache.cayenne.map.QueryDescriptor; - -/** - * @since 4.0 - */ -class NormalizationVisitor implements ConfigurationNodeVisitor<String> { - - private String baseName; - - public NormalizationVisitor(String baseName) { - this.baseName = baseName; - } - - @Override - public String visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) { - return baseName; - } - - @Override - public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) { - return baseName; - } - - @Override - public String visitDataMap(DataMap dataMap) { - return baseName; - } - - @Override - public String visitObjEntity(ObjEntity entity) { - return NameUtil.capitalize(baseName); - } - - @Override - public String visitDbEntity(DbEntity entity) { - return baseName; - } - - @Override - public String visitEmbeddable(Embeddable embeddable) { - return NameUtil.capitalize(baseName); - } - - @Override - public String visitEmbeddableAttribute(EmbeddableAttribute attribute) { - return NameUtil.uncapitalize(baseName); - } - - @Override - public String visitObjAttribute(ObjAttribute attribute) { - return NameUtil.uncapitalize(baseName); - } - - @Override - public String visitDbAttribute(DbAttribute attribute) { - return baseName; - } - - @Override - public String visitObjRelationship(ObjRelationship relationship) { - return NameUtil.uncapitalize(baseName); - } - - @Override - public String visitDbRelationship(DbRelationship relationship) { - return NameUtil.uncapitalize(baseName); - } - - @Override - public String visitProcedure(Procedure procedure) { - return baseName; - } - - @Override - public String visitProcedureParameter(ProcedureParameter parameter) { - return baseName; - } - - @Override - public String visitQuery(QueryDescriptor query) { - return baseName; - } -} diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java index e4e82848c..6b5954258 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java @@ -100,7 +100,7 @@ class ManyToManyCandidateEntity { ObjRelationship newRelationship = new ObjRelationship(); newRelationship.setName(NameBuilder - .of(newRelationship).parent(srcEntity) + .of(newRelationship, srcEntity) .baseName(nameGenerator.relationshipName(rel1, rel2)) .name()); diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java index 4baf6a095..1b224b2e5 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java @@ -104,7 +104,7 @@ public class RelationshipLoader extends AbstractLoader { private void setRelationshipName(DbEntity entity, DbRelationship relationship) { relationship.setName(NameBuilder - .of(relationship).parent(entity) + .of(relationship, entity) .baseName(nameGenerator.relationshipName(relationship)) .name()); } diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java index bf9288533..434b9ab36 100644 --- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java +++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java @@ -40,7 +40,7 @@ public class NameBuilderTest { @Test public void name_Root() { - assertEquals("project", NameBuilder.of(new DataChannelDescriptor()).name()); + assertEquals("project", NameBuilder.of(new DataChannelDescriptor(), null).name()); } @Test @@ -48,22 +48,22 @@ public class NameBuilderTest { DataChannelDescriptor descriptor = new DataChannelDescriptor(); DataMap m0 = new DataMap(); - m0.setName(NameBuilder.of(m0).parent(descriptor).name()); + m0.setName(NameBuilder.of(m0, descriptor).name()); assertEquals("datamap", m0.getName()); descriptor.getDataMaps().add(m0); DataMap m1 = new DataMap(); - m1.setName(NameBuilder.of(m1).parent(descriptor).name()); + m1.setName(NameBuilder.of(m1, descriptor).name()); assertEquals("datamap1", m1.getName()); descriptor.getDataMaps().add(m1); DataNodeDescriptor nd0 = new DataNodeDescriptor(); - nd0.setName(NameBuilder.of(nd0).parent(descriptor).name()); + nd0.setName(NameBuilder.of(nd0, descriptor).name()); assertEquals("datanode", nd0.getName()); descriptor.getNodeDescriptors().add(nd0); DataNodeDescriptor nd1 = new DataNodeDescriptor(); - nd1.setName(NameBuilder.of(nd1).parent(descriptor).name()); + nd1.setName(NameBuilder.of(nd1, descriptor).name()); assertEquals("datanode1", nd1.getName()); descriptor.getNodeDescriptors().add(nd1); } @@ -75,62 +75,62 @@ public class NameBuilderTest { map.setDefaultPackage("com.foo"); DbEntity de0 = new DbEntity(); - de0.setName(NameBuilder.of(de0).parent(map).name()); + de0.setName(NameBuilder.of(de0, map).name()); assertEquals("db_entity", de0.getName()); map.addDbEntity(de0); DbEntity de1 = new DbEntity(); - de1.setName(NameBuilder.of(de1).parent(map).name()); + de1.setName(NameBuilder.of(de1, map).name()); assertEquals("db_entity1", de1.getName()); map.addDbEntity(de1); ObjEntity oe0 = new ObjEntity(); - oe0.setName(NameBuilder.of(oe0).parent(map).name()); + oe0.setName(NameBuilder.of(oe0, map).name()); assertEquals("ObjEntity", oe0.getName()); map.addObjEntity(oe0); ObjEntity oe1 = new ObjEntity(); - oe1.setName(NameBuilder.of(oe1).parent(map).name()); + oe1.setName(NameBuilder.of(oe1, map).name()); assertEquals("ObjEntity1", oe1.getName()); map.addObjEntity(oe1); ObjEntity oe2 = new ObjEntity(); - oe2.setName(NameBuilder.of(oe0).parent(map).baseName("db_entity").name()); + oe2.setName(NameBuilder.of(oe0, map).baseName("db_entity").name()); assertEquals("Db_entity", oe2.getName(), "Should not conflict with similarly named DbEntity"); map.addObjEntity(oe2); Procedure p0 = new Procedure(); - p0.setName(NameBuilder.of(p0).parent(map).name()); + p0.setName(NameBuilder.of(p0, map).name()); assertEquals("procedure", p0.getName()); map.addProcedure(p0); Procedure p1 = new Procedure(); - p1.setName(NameBuilder.of(p1).parent(map).name()); + p1.setName(NameBuilder.of(p1, map).name()); assertEquals("procedure1", p1.getName()); map.addProcedure(p1); Procedure p2 = new Procedure(); - p2.setName(NameBuilder.of(p1).parent(map).baseName("db_enity").name()); + p2.setName(NameBuilder.of(p1, map).baseName("db_enity").name()); assertEquals("db_enity", p2.getName(), "Should not conflict with similarly named DbEntity"); map.addProcedure(p2); QueryDescriptor q0 = QueryDescriptor.selectQueryDescriptor(); - q0.setName(NameBuilder.of(q0).parent(map).name()); + q0.setName(NameBuilder.of(q0, map).name()); assertEquals("query", q0.getName()); map.addQueryDescriptor(q0); QueryDescriptor q1 = QueryDescriptor.ejbqlQueryDescriptor(); - q1.setName(NameBuilder.of(q1).parent(map).name()); + q1.setName(NameBuilder.of(q1, map).name()); assertEquals("query1", q1.getName()); map.addQueryDescriptor(q1); Embeddable e0 = new Embeddable(); - e0.setClassName("com.foo." + NameBuilder.of(e0).parent(map).name()); + e0.setClassName("com.foo." + NameBuilder.of(e0, map).name()); assertEquals("com.foo.Embeddable", e0.getClassName()); map.addEmbeddable(e0); Embeddable e1 = new Embeddable(); - e1.setClassName("com.foo." + NameBuilder.of(e1).parent(map).name()); + e1.setClassName("com.foo." + NameBuilder.of(e1, map).name()); assertEquals("com.foo.Embeddable1", e1.getClassName()); map.addEmbeddable(e1); } @@ -143,31 +143,31 @@ public class NameBuilderTest { entity.getCallbackMap().getPostAdd().addCallbackMethod("getMe"); ObjAttribute a0 = new ObjAttribute(); - String na0 = NameBuilder.of(a0).parent(entity).name(); + String na0 = NameBuilder.of(a0, entity).name(); assertEquals("untitledAttr", na0); a0.setName(na0); entity.addAttribute(a0); ObjAttribute a1 = new ObjAttribute(); - String na1 = NameBuilder.of(a1).parent(entity).name(); + String na1 = NameBuilder.of(a1, entity).name(); assertEquals("untitledAttr1", na1); a1.setName(na1); entity.addAttribute(a1); ObjAttribute a2 = new ObjAttribute(); - String na2 = NameBuilder.of(a2).parent(entity).baseName("me").name(); + String na2 = NameBuilder.of(a2, entity).baseName("me").name(); assertEquals("me1", na2, "Conflict with callback method was not detected"); a2.setName(na2); entity.addAttribute(a2); ObjRelationship r0 = new ObjRelationship(); - String nr0 = NameBuilder.of(r0).parent(entity).name(); + String nr0 = NameBuilder.of(r0, entity).name(); assertEquals("untitledRel", nr0); r0.setName(nr0); entity.addRelationship(r0); ObjRelationship r1 = new ObjRelationship(); - String nr1 = NameBuilder.of(r1).parent(entity).name(); + String nr1 = NameBuilder.of(r1, entity).name(); assertEquals("untitledRel1", nr1); r1.setName(nr1); entity.addRelationship(r1); @@ -178,25 +178,25 @@ public class NameBuilderTest { DbEntity entity = new DbEntity(); DbAttribute a0 = new DbAttribute(); - String na0 = NameBuilder.of(a0).parent(entity).name(); + String na0 = NameBuilder.of(a0, entity).name(); assertEquals("untitledAttr", na0); a0.setName(na0); entity.addAttribute(a0); DbAttribute a1 = new DbAttribute(); - String na1 = NameBuilder.of(a1).parent(entity).name(); + String na1 = NameBuilder.of(a1, entity).name(); assertEquals("untitledAttr1", na1); a1.setName(na1); entity.addAttribute(a1); DbRelationship r0 = new DbRelationship(); - String nr0 = NameBuilder.of(r0).parent(entity).name(); + String nr0 = NameBuilder.of(r0, entity).name(); assertEquals("untitledRel", nr0); r0.setName(nr0); entity.addRelationship(r0); DbRelationship r1 = new DbRelationship(); - String nr1 = NameBuilder.of(r1).parent(entity).name(); + String nr1 = NameBuilder.of(r1, entity).name(); assertEquals("untitledRel1", nr1); r1.setName(nr1); entity.addRelationship(r1); @@ -207,12 +207,12 @@ public class NameBuilderTest { Procedure procedure = new Procedure(); ProcedureParameter p0 = new ProcedureParameter(); - p0.setName(NameBuilder.of(p0).parent(procedure).name()); + p0.setName(NameBuilder.of(p0, procedure).name()); assertEquals("UntitledProcedureParameter", p0.getName()); procedure.addCallParameter(p0); ProcedureParameter p1 = new ProcedureParameter(); - p1.setName(NameBuilder.of(p1).parent(procedure).name()); + p1.setName(NameBuilder.of(p1, procedure).name()); assertEquals("UntitledProcedureParameter1", p1.getName()); procedure.addCallParameter(p1); } @@ -222,12 +222,12 @@ public class NameBuilderTest { Embeddable embeddable = new Embeddable(); EmbeddableAttribute ea0 = new EmbeddableAttribute(); - ea0.setName(NameBuilder.of(ea0).parent(embeddable).name()); + ea0.setName(NameBuilder.of(ea0, embeddable).name()); assertEquals("untitledAttr", ea0.getName()); embeddable.addAttribute(ea0); EmbeddableAttribute ea1 = new EmbeddableAttribute(); - ea1.setName(NameBuilder.of(ea1).parent(embeddable).name()); + ea1.setName(NameBuilder.of(ea1, embeddable).name()); assertEquals("untitledAttr1", ea1.getName()); embeddable.addAttribute(ea1); } @@ -238,13 +238,13 @@ public class NameBuilderTest { ObjEntity entity = new ObjEntity(); ObjAttribute a0 = new ObjAttribute(); - String na0 = NameBuilder.of(a0).parent(entity).baseName("myName").name(); + String na0 = NameBuilder.of(a0, entity).baseName("myName").name(); assertEquals("myName", na0); a0.setName(na0); entity.addAttribute(a0); ObjAttribute a1 = new ObjAttribute(); - String na1 = NameBuilder.of(a1).parent(entity).baseName("MyName").name(); + String na1 = NameBuilder.of(a1, entity).baseName("MyName").name(); assertEquals("myName1", na1); a1.setName(na1); entity.addAttribute(a1); @@ -255,17 +255,17 @@ public class NameBuilderTest { ObjEntity entity = new ObjEntity(); - String c0 = NameBuilder.ofCallbackMethod().parent(entity).name(); + String c0 = NameBuilder.of(new CallbackNode(), entity).name(); assertEquals("onEvent", c0); entity.getCallbackMap().getPostAdd().addCallbackMethod(c0); - String c1 = NameBuilder.ofCallbackMethod().parent(entity).name(); + String c1 = NameBuilder.of(new CallbackNode(), entity).name(); assertEquals("onEvent1", c1); entity.getCallbackMap().getPostAdd().addCallbackMethod(c1); entity.addAttribute(new ObjAttribute("untitledAttr")); - String c3 = NameBuilder.ofCallbackMethod().parent(entity).baseName("getUntitledAttr").name(); + String c3 = NameBuilder.of(new CallbackNode(), entity).baseName("getUntitledAttr").name(); assertEquals("getUntitledAttr1", c3); entity.getCallbackMap().getPostAdd().addCallbackMethod(c3); } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java index deaa71cb8..fbf5f8185 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java @@ -110,7 +110,7 @@ public class CreateAttributeAction extends AppAction { EmbeddableAttribute attr = new EmbeddableAttribute(); attr.setName(NameBuilder - .of(attr).parent(embeddable) + .of(attr, embeddable) .name()); createEmbAttribute(embeddable, attr); @@ -124,7 +124,7 @@ public class CreateAttributeAction extends AppAction { ObjEntity objEntity = session.getSelectedObjEntity(); ObjAttribute attr = new ObjAttribute(); - attr.setName(NameBuilder.of(attr).parent(objEntity).name()); + attr.setName(NameBuilder.of(attr, objEntity).name()); createObjAttribute(session.getSelectedDataMap(), objEntity, attr); @@ -135,7 +135,7 @@ public class CreateAttributeAction extends AppAction { DbEntity dbEntity = getProjectSession().getSelectedDbEntity(); DbAttribute attr = new DbAttribute(); - attr.setName(NameBuilder.of(attr).parent(dbEntity).name()); + attr.setName(NameBuilder.of(attr, dbEntity).name()); attr.setType(TypesMapping.NOT_DEFINED); attr.setEntity(dbEntity); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java index 5597addec..469e7d2e6 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.cayenne.modeler.ui.action; +import org.apache.cayenne.dbsync.naming.CallbackNode; import org.apache.cayenne.dbsync.naming.NameBuilder; import org.apache.cayenne.map.CallbackMap; import org.apache.cayenne.map.LifecycleEvent; @@ -56,7 +57,7 @@ public class CreateCallbackMethodAction extends AppAction { CallbackType callbackType = getProjectSession().getSelectedCallbackType(); String methodName = NameBuilder - .ofCallbackMethod().parent(getProjectSession().getSelectedObjEntity()) + .of(new CallbackNode(), getProjectSession().getSelectedObjEntity()) .baseName(toMethodName(callbackType.getType())) .name(); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java index 691715069..8d384946f 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java @@ -73,7 +73,7 @@ public class CreateDataMapAction extends AppAction { .getRootNode(); DataMap map = new DataMap(); - map.setName(NameBuilder.of(map).parent(dataChannelDescriptor).name()); + map.setName(NameBuilder.of(map, dataChannelDescriptor).name()); onMapCreated(this, getProjectSession(), map); app.getUndoManager().addEdit(new CreateDataMapUndoableEdit(getProjectSession(), dataChannelDescriptor, map)); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java index 606cd1feb..d9ffabdce 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java @@ -63,7 +63,7 @@ public class CreateDbEntityAction extends AppAction { public void performAction(ActionEvent e) { DataMap map = getProjectSession().getSelectedDataMap(); DbEntity entity = new DbEntity(); - entity.setName(NameBuilder.of(entity).parent(map).name()); + entity.setName(NameBuilder.of(entity, map).name()); createEntity(map, entity); app.getUndoManager().addEdit(new CreateDbEntityUndoableEdit(getProjectSession(), map, entity)); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java index 26e4d1944..cb4c4cb18 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java @@ -68,7 +68,7 @@ public class CreateEmbeddableAction extends AppAction { DataMap dataMap = getProjectSession().getSelectedDataMap(); Embeddable embeddable = new Embeddable(); - String baseName = NameBuilder.of(embeddable).parent(dataMap).name(); + String baseName = NameBuilder.of(embeddable, dataMap).name(); String nameWithPackage = dataMap.getNameWithDefaultPackage(baseName); embeddable.setClassName(nameWithPackage); createEmbeddable(dataMap, embeddable); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java index 92c105ef9..dd7bb5f06 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java @@ -91,7 +91,7 @@ public class CreateNodeAction extends AppAction { */ DataNodeDescriptor buildDataNode(DataChannelDescriptor dataChannelDescriptor) { DataNodeDescriptor node = new DataNodeDescriptor(); - node.setName(NameBuilder.of(node).parent(dataChannelDescriptor).name()); + node.setName(NameBuilder.of(node, dataChannelDescriptor).name()); node.setDataChannelDescriptor(dataChannelDescriptor); return node; diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java index f0ca27c81..56062ade1 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java @@ -76,7 +76,7 @@ public class CreateObjEntityAction extends AppAction { DataMap dataMap = session.getSelectedDataMap(); ObjEntity entity = new ObjEntity(); - entity.setName(NameBuilder.of(entity).parent(dataMap).name()); + entity.setName(NameBuilder.of(entity, dataMap).name()); // init defaults entity.setSuperClassName(dataMap.getDefaultSuperclass()); @@ -89,7 +89,7 @@ public class CreateObjEntityAction extends AppAction { // TODO: use injectable name generator String baseName = new DefaultObjectNameGenerator(NoStemStemmer.getInstance()).objEntityName(dbEntity); entity.setName(NameBuilder - .of(entity).parent(dbEntity.getDataMap()) + .of(entity, dbEntity.getDataMap()) .baseName(baseName) .name()); } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java index 3507c76c3..a82edfa1b 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java @@ -61,7 +61,7 @@ public class CreateProcedureAction extends AppAction { DataMap map = getProjectSession().getSelectedDataMap(); Procedure procedure = new Procedure(); - procedure.setName(NameBuilder.of(procedure).parent(map).name()); + procedure.setName(NameBuilder.of(procedure, map).name()); createProcedure(map, procedure); app.getUndoManager().addEdit(new CreateProcedureUndoableEdit(getProjectSession(), map, procedure)); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java index 703c1c554..6b134bf56 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java @@ -71,7 +71,7 @@ public class CreateProcedureParameterAction extends AppAction { if (getProjectSession().getSelectedProcedure() != null) { Procedure procedure = getProjectSession().getSelectedProcedure(); ProcedureParameter parameter = new ProcedureParameter(); - parameter.setName(NameBuilder.of(parameter).parent(procedure).name()); + parameter.setName(NameBuilder.of(parameter, procedure).name()); createProcedureParameter(procedure, parameter); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java index e515145ff..66a34c342 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java @@ -78,7 +78,7 @@ public class ImportDataMapAction extends AppAction { ConfigurationNode root = getProjectSession().project().getRootNode(); newMap.setName(NameBuilder - .of(newMap).parent(root) + .of(newMap, root) .baseName(newMap.getName()) .name()); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java index 61bad0719..f9e4e4041 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java @@ -285,7 +285,7 @@ public class ImportEOModelAction extends AppAction { // fix DataMap name, as there maybe a map with the same name already ConfigurationNode root = session.project().getRootNode(); map.setName(NameBuilder - .of(map).parent(root) + .of(map, root) .baseName(map.getName()) .name()); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java index 397bca333..46e5acf4e 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java @@ -61,7 +61,7 @@ public class NewProjectAction extends AppAction { DataChannelDescriptor dataChannelDescriptor = new DataChannelDescriptor(); dataChannelDescriptor.setName(NameBuilder - .of(dataChannelDescriptor) + .of(dataChannelDescriptor, null) .name()); Project project = new Project(new ConfigurationTree<>(dataChannelDescriptor)); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java index dd09b1851..540b8a9ef 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java @@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.ui.action; import org.apache.cayenne.configuration.ConfigurationNode; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.dbsync.naming.CallbackNode; import org.apache.cayenne.dbsync.naming.NameBuilder; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbAttribute; @@ -158,7 +159,7 @@ public class PasteAction extends AppAction implements FlavorListener { // paste DataMap to DataDomain or DataNode dataMap.setName(NameBuilder - .of(dataMap).parent(dataChannelDescriptor) + .of(dataMap, dataChannelDescriptor) .baseName(dataMap.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -173,7 +174,7 @@ public class PasteAction extends AppAction implements FlavorListener { for (DbEntity dbEntity : dataMap.getDbEntities()) { String oldName = dbEntity.getName(); dbEntity.setName(NameBuilder - .of(dbEntity).parent(dataMap) + .of(dbEntity, dataMap) .baseName(dbEntity.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -186,7 +187,7 @@ public class PasteAction extends AppAction implements FlavorListener { for (ObjEntity objEntity : dataMap.getObjEntities()) { String oldName = objEntity.getName(); objEntity.setName(NameBuilder - .of(objEntity).parent(dataMap) + .of(objEntity, dataMap) .baseName(objEntity.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -198,7 +199,7 @@ public class PasteAction extends AppAction implements FlavorListener { for (Embeddable embeddable : dataMap.getEmbeddables()) { embeddable.setClassName(NameBuilder - .of(embeddable).parent(dataMap) + .of(embeddable, dataMap) .baseName(embeddable.getClassName()) .dupesPattern(COPY_PATTERN) .name()); @@ -206,14 +207,14 @@ public class PasteAction extends AppAction implements FlavorListener { for (Procedure procedure : dataMap.getProcedures()) { procedure.setName(NameBuilder - .of(procedure).parent(dataMap) + .of(procedure, dataMap) .baseName(procedure.getName()) .dupesPattern(COPY_PATTERN) .name()); } for (QueryDescriptor query : dataMap.getQueryDescriptors()) { - query.setName(NameBuilder.of(query).parent(dataMap) + query.setName(NameBuilder.of(query, dataMap) .baseName(query.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -256,7 +257,7 @@ public class PasteAction extends AppAction implements FlavorListener { if (content instanceof DbEntity dbEntity) { dbEntity.setName(NameBuilder - .of(dbEntity).parent(dataMap) + .of(dbEntity, dataMap) .baseName(dbEntity.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -265,7 +266,7 @@ public class PasteAction extends AppAction implements FlavorListener { CreateDbEntityAction.onDbEntityCreated(this, session, dbEntity); } else if (content instanceof ObjEntity objEntity) { // paste ObjEntity to DataMap - objEntity.setName(NameBuilder.of(objEntity).parent(dataMap) + objEntity.setName(NameBuilder.of(objEntity, dataMap) .baseName(objEntity.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -279,7 +280,7 @@ public class PasteAction extends AppAction implements FlavorListener { } else if (content instanceof Embeddable embeddable) { // paste Embeddable to DataMap embeddable.setClassName(NameBuilder - .of(embeddable).parent(dataMap) + .of(embeddable, dataMap) .baseName(embeddable.getClassName()) .dupesPattern(COPY_PATTERN) .name()); @@ -293,7 +294,7 @@ public class PasteAction extends AppAction implements FlavorListener { } else if (content instanceof QueryDescriptor query) { query.setName(NameBuilder - .of(query).parent(dataMap) + .of(query, dataMap) .dupesPattern(COPY_PATTERN) .baseName(query.getName()) .name()); @@ -304,7 +305,7 @@ public class PasteAction extends AppAction implements FlavorListener { } else if (content instanceof Procedure procedure) { // paste Procedure to DataMap procedure.setName(NameBuilder - .of(procedure).parent(dataMap) + .of(procedure, dataMap) .dupesPattern(COPY_PATTERN) .baseName(procedure.getName()) .name()); @@ -320,7 +321,7 @@ public class PasteAction extends AppAction implements FlavorListener { if (content instanceof DbAttribute attr) { attr.setName(NameBuilder - .of(attr).parent(dbEntity) + .of(attr, dbEntity) .dupesPattern(COPY_PATTERN) .baseName(attr.getName()) .name()); @@ -330,7 +331,7 @@ public class PasteAction extends AppAction implements FlavorListener { .getSelectedDataMap(), dbEntity, attr); } else if (content instanceof DbRelationship rel) { rel.setName(NameBuilder - .of(rel).parent(dbEntity) + .of(rel, dbEntity) .baseName(rel.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -346,7 +347,7 @@ public class PasteAction extends AppAction implements FlavorListener { if (content instanceof ObjAttribute attr) { attr.setName(NameBuilder - .of(attr).parent(objEntity) + .of(attr, objEntity) .baseName(attr.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -356,7 +357,7 @@ public class PasteAction extends AppAction implements FlavorListener { .getSelectedDataMap(), objEntity, attr); } else if (content instanceof ObjRelationship rel) { rel.setName(NameBuilder - .of(rel).parent(objEntity) + .of(rel, objEntity) .baseName(rel.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -370,7 +371,7 @@ public class PasteAction extends AppAction implements FlavorListener { } else if (content instanceof ObjCallbackMethod method) { method.setName(NameBuilder - .ofCallbackMethod().parent(objEntity) + .of(new CallbackNode(), objEntity) .baseName(method.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -387,7 +388,7 @@ public class PasteAction extends AppAction implements FlavorListener { if (content instanceof EmbeddableAttribute attr) { attr.setName(NameBuilder - .of(attr).parent(embeddable) + .of(attr, embeddable) .baseName(attr.getName()) .dupesPattern(COPY_PATTERN) .name()); @@ -406,7 +407,7 @@ public class PasteAction extends AppAction implements FlavorListener { if (content instanceof ProcedureParameter param) { param.setName(NameBuilder - .of(param).parent(procedure) + .of(param, procedure) .baseName(param.getName()) .dupesPattern(COPY_PATTERN) .name()); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java index 80c76a438..521ee7c2b 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.cayenne.modeler.ui.autorelationship; +import org.apache.cayenne.dbsync.naming.NameBuilder; import org.apache.cayenne.dbsync.naming.ObjectNameGenerator; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbAttribute; @@ -310,7 +311,9 @@ public class InferRelationshipsDialog extends ProjectDialog { localRelationship.setTargetEntityName(myir.getSource().getName()); } - myir.setName(strategy.relationshipName(localRelationship)); + myir.setName(NameBuilder.of(localRelationship, localRelationship.getSourceEntity()) + .baseName(strategy.relationshipName(localRelationship)) + .name()); } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java index bdecb3f23..3cf676afd 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java @@ -93,7 +93,7 @@ public class DbRelationshipDialog extends ProjectDialog { public static Optional<DbRelationship> openForCreate(ProjectSession session, Window owner, DbEntity sourceEntity) { DbRelationship relationship = new DbRelationship(); - relationship.setName(NameBuilder.of(relationship).parent(sourceEntity).name()); + relationship.setName(NameBuilder.of(relationship, sourceEntity).name()); relationship.setSourceEntity(sourceEntity); DbRelationshipDialog dialog = new DbRelationshipDialog(session, owner, relationship, true); @@ -347,7 +347,7 @@ public class DbRelationshipDialog extends ProjectDialog { if (reverse == null) { reverse = new DbRelationship(); reverse.setName(NameBuilder - .of(reverse).parent(relationship.getTargetEntity()) + .of(reverse, relationship.getTargetEntity()) .baseName(reverseName.getText().trim()) .name()); @@ -455,7 +455,7 @@ public class DbRelationshipDialog extends ProjectDialog { } String newName = NameBuilder - .of(rel).parent(rel.getSourceEntity()) + .of(rel, rel.getSourceEntity()) .baseName(userInputName) .name(); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java index 5cfafbaed..9dc5a5624 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java @@ -139,7 +139,7 @@ public class ObjRelationshipInfoDialog extends ProjectDialog implements TreeSele public ObjRelationshipInfoDialog createRelationship(ObjEntity objEntity) { ObjRelationship rel = new ObjRelationship(); - rel.setName(NameBuilder.of(rel).parent(objEntity).name()); + rel.setName(NameBuilder.of(rel, objEntity).name()); rel.setSourceEntity(objEntity); DeleteRuleUpdater.updateObjRelationship(rel); isCreate = true; diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java index 3ab4c555e..4447fa14b 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java @@ -115,7 +115,7 @@ public class QueryTypeDialog extends ProjectDialog { private void createQuery() { QueryDescriptor query = QueryDescriptor.descriptor(selectedQueryType()); - query.setName(NameBuilder.of(query).parent(dataMap).name()); + query.setName(NameBuilder.of(query, dataMap).name()); query.setDataMap(dataMap); dataMap.addQueryDescriptor(query); diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java index cc7b78fa8..5dda1e7dc 100644 --- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java +++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java @@ -684,7 +684,7 @@ public class EOModelProcessor { if (relationship.getReverseRelationship() == null) { DbRelationship reverse = relationship.createReverseRelationship(); - reverse.setName(NameBuilder.of(reverse).parent(reverse.getSourceEntity()) + reverse.setName(NameBuilder.of(reverse, reverse.getSourceEntity()) // TODO: we can do better with ObjectNameGenerator .baseName(relationship.getName() + "Reverse") .name());
