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


The following commit(s) were added to refs/heads/master by this push:
     new 4adbc49a7 cleanup, refactoring
4adbc49a7 is described below

commit 4adbc49a7fcd170e569b39fe3b42bedeacd61bb8
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sat Jul 18 20:03:32 2026 -0400

    cleanup, refactoring
---
 .../dbsync/merge/context/EntityMergeSupport.java   |  4 +-
 .../merge/token/model/CreateTableToModel.java      |  2 +-
 .../cayenne/dbsync/naming/CallbackNameBuilder.java | 71 -------------------
 .../dbsync/naming/DeduplicationVisitor.java        | 15 ++--
 .../dbsync/naming/DefaultObjectNameGenerator.java  |  8 ---
 .../apache/cayenne/dbsync/naming/NameBuilder.java  | 81 +++++++++++++++-------
 .../cayenne/dbsync/naming/PatternStemmer.java      |  2 +-
 .../dbimport/ManyToManyCandidateEntity.java        |  2 +-
 .../dbsync/reverse/dbload/RelationshipLoader.java  | 12 ++--
 .../cayenne/dbsync/naming/NameBuilderTest.java     | 70 +++++++++----------
 .../reverse/dbload/RelationshipsLoaderIT.java      |  7 +-
 .../cayenne/modeler/NameGeneratorPreferences.java  |  4 +-
 .../modeler/ui/action/CreateAttributeAction.java   |  6 +-
 .../ui/action/CreateCallbackMethodAction.java      |  2 +-
 .../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   |  6 +-
 .../modeler/ui/action/CreateProcedureAction.java   |  2 +-
 .../ui/action/CreateProcedureParameterAction.java  |  2 +-
 .../modeler/ui/action/DbEntitySyncAction.java      | 20 +++---
 .../modeler/ui/action/ImportDataMapAction.java     |  2 +-
 .../modeler/ui/action/ImportEOModelAction.java     |  2 +-
 .../modeler/ui/action/NewProjectAction.java        |  5 +-
 .../modeler/ui/action/ObjEntitySyncAction.java     |  3 +-
 .../cayenne/modeler/ui/action/PasteAction.java     | 36 +++++-----
 .../ui/dbrelationship/DbRelationshipDialog.java    |  6 +-
 .../relinfo/ObjRelationshipInfoDialog.java         |  2 +-
 .../ui/project/querytype/QueryTypeDialog.java      |  2 +-
 .../apache/cayenne/wocompat/EOModelProcessor.java  |  3 +-
 31 files changed, 166 insertions(+), 219 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 df6693771..0fc341035 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.builder(or, entity)
+        or.setName(NameBuilder.of(or).parent(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.builder(oa, 
entity).baseName(nameGenerator.objAttributeName(da)).name());
+        
oa.setName(NameBuilder.of(oa).parent(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/CreateTableToModel.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
index 4ff8ba5b5..35f6405e3 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
-                .builder(objEntity, dbEntity.getDataMap())
+                .of(objEntity).parent(dbEntity.getDataMap())
                 .baseName(context.getNameGenerator().objEntityName(dbEntity))
                 .name());
         objEntity.setDbEntity(getEntity());
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNameBuilder.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNameBuilder.java
deleted file mode 100644
index 0466f24b8..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNameBuilder.java
+++ /dev/null
@@ -1,71 +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.map.ObjEntity;
-
-/**
- * @since 4.0
- */
-// TODO: fold CallbackMethod to org.apache.cayenne.map package and make it a 
ConfigurationNode
-// then we can get rid off this fork...
-class CallbackNameBuilder extends NameBuilder {
-
-    public CallbackNameBuilder() {
-        super(new CallbackNode());
-    }
-
-    @Override
-    public String name() {
-        String baseName = this.baseName != null
-                ? this.baseName
-                : "onEvent";
-
-        return new DeduplicationVisitor(parent, baseName, 
dupesPattern).resolve(name -> {
-
-            ObjEntity entity = (ObjEntity) parent;
-
-            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...
-                if (entity.getAttribute(conflictingProperty) != null
-                        || entity.getRelationship(conflictingProperty) != 
null) {
-                    return true;
-                }
-            }
-
-            return false;
-        });
-    }
-
-    static 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
index 6138898e9..7483a8bd0 100644
--- 
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
@@ -38,14 +38,11 @@ import org.apache.cayenne.map.QueryDescriptor;
 import java.util.Objects;
 import java.util.function.Predicate;
 
-/**
- * @since 4.0
- */
 class DeduplicationVisitor implements ConfigurationNodeVisitor<String> {
 
-    private ConfigurationNode parent;
-    private String baseName;
-    private String dupesPattern;
+    private final ConfigurationNode parent;
+    private final String baseName;
+    private final String dupesPattern;
 
     DeduplicationVisitor(ConfigurationNode parent, String baseName, String 
dupesPattern) {
         this.parent = parent;
@@ -76,14 +73,12 @@ class DeduplicationVisitor implements 
ConfigurationNodeVisitor<String> {
     @Override
     public String visitDataMap(DataMap dataMap) {
         return resolve(name -> {
-            // null context is a situation when DataMap is a
-            // top level object of the project
+            // null context is a situation when DataMap is a top level object 
of the project
             if (parent == null) {
                 return false;
             }
 
-            if (parent instanceof DataChannelDescriptor) {
-                DataChannelDescriptor domain = (DataChannelDescriptor) parent;
+            if (parent instanceof DataChannelDescriptor domain) {
                 return domain.getDataMap(name) != null;
             }
             return false;
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGenerator.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGenerator.java
index 387176a57..909dbe50b 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGenerator.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGenerator.java
@@ -36,10 +36,6 @@ public class DefaultObjectNameGenerator implements 
ObjectNameGenerator {
 
     private final DbEntityNameStemmer dbEntityNameStemmer;
 
-    public DefaultObjectNameGenerator() {
-        this.dbEntityNameStemmer = NoStemStemmer.getInstance();
-    }
-
     public DefaultObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) 
{
         this.dbEntityNameStemmer = dbEntityNameStemmer;
     }
@@ -77,12 +73,8 @@ public class DefaultObjectNameGenerator implements 
ObjectNameGenerator {
     }
 
     protected String toManyRelationshipName(DbRelationship... 
relationshipChain) {
-
         DbRelationship last = relationshipChain[relationshipChain.length - 1];
-
         String baseName = stemmed(last.getTargetEntityName());
-
-        // by default we use English rules here...
         return EnglishInflector.pluralOf(baseName.toLowerCase());
     }
 
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 3366db901..638fe7dc9 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,6 +19,7 @@
 package org.apache.cayenne.dbsync.naming;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.map.ObjEntity;
 
 import java.util.Objects;
@@ -26,43 +27,32 @@ import java.util.Objects;
 /**
  * A builder of names for model objects. Ensures that newly generated names do 
not conflict with the names of siblings
  * under the same parent node. Name generation can be performed based on 
default base names for each model object type,
- * or with a user-provided base name. Used standalone or in conjunction with 
{@link ObjectNameGenerator} that implements
- * DB-to-object name mapping conversions. Names generated by {@link 
ObjectNameGenerator} can be used as "base names" for
- * {@link NameBuilder}.
+ * or with a user-provided base name.
  *
  * @since 4.0
  */
 public class NameBuilder {
 
-    protected ConfigurationNode nodeToName;
+    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();
+    }
+
+    private final ConfigurationNode nodeToName;
     protected ConfigurationNode parent;
     protected String dupesPattern;
     protected String baseName;
 
-    protected NameBuilder(ConfigurationNode nodeToName) {
+    private NameBuilder(ConfigurationNode nodeToName) {
         this.nodeToName = Objects.requireNonNull(nodeToName);
         this.dupesPattern = "%s%d";
     }
 
-    public static NameBuilder builder(ConfigurationNode node) {
-        return new NameBuilder(node);
-    }
-
-    public static NameBuilder builder(ConfigurationNode node, 
ConfigurationNode parent) {
-        return new NameBuilder(node).in(parent);
-    }
-
-    /**
-     * A special builder starter for callback methods. Eventually callback 
methods will be made into ConfigurationNodes,
-     * and we can use regular {@link #builder(ConfigurationNode)} methods to 
name them.
-     */
-    // TODO: fold CallbackMethod to org.apache.cayenne.map package and make it 
a ConfigurationNode
-    // then we can use normal API for it... for now have to keep a special 
one-off method...
-    public static NameBuilder builderForCallbackMethod(ObjEntity parent) {
-        return new CallbackNameBuilder().in(parent);
-    }
-
-    public NameBuilder in(ConfigurationNode parent) {
+    public NameBuilder parent(ConfigurationNode parent) {
         this.parent = Objects.requireNonNull(parent);
         return this;
     }
@@ -78,11 +68,52 @@ public class NameBuilder {
     }
 
     public String name() {
-        String baseName = this.baseName != null && this.baseName.length() > 0
+        String baseName = this.baseName != null && !this.baseName.isEmpty()
                 ? this.baseName
                 : nodeToName.acceptVisitor(DefaultBaseNameVisitor.INSTANCE);
 
         String normalizedBaseName = nodeToName.acceptVisitor(new 
NormalizationVisitor(baseName));
         return nodeToName.acceptVisitor(new DeduplicationVisitor(parent, 
normalizedBaseName, dupesPattern));
     }
+
+    static class CallbackNameBuilder extends NameBuilder {
+
+        public CallbackNameBuilder() {
+            super(new CallbackNode());
+        }
+
+        @Override
+        public String name() {
+            String baseName = this.baseName != null
+                    ? this.baseName
+                    : "onEvent";
+
+            return new DeduplicationVisitor(parent, baseName, 
dupesPattern).resolve(name -> {
+
+                ObjEntity entity = (ObjEntity) parent;
+
+                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;
+            });
+        }
+    }
+
+    static 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/PatternStemmer.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
index d57fa85ce..66edf28e6 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
@@ -26,7 +26,7 @@ import java.util.regex.Pattern;
  */
 public class PatternStemmer implements DbEntityNameStemmer {
 
-    private Pattern pattern;
+    private final Pattern pattern;
 
     public PatternStemmer(String stripPattern, boolean caseSensitive) {
 
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 b331c4656..e4e82848c 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
-                .builder(newRelationship, srcEntity)
+                .of(newRelationship).parent(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 76e3da376..4baf6a095 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
@@ -19,11 +19,6 @@
 
 package org.apache.cayenne.dbsync.reverse.dbload;
 
-import java.sql.DatabaseMetaData;
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
@@ -34,6 +29,11 @@ import org.apache.cayenne.map.DbRelationship;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.util.Map;
+import java.util.Set;
+
 public class RelationshipLoader extends AbstractLoader {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DbLoader.class);
@@ -104,7 +104,7 @@ public class RelationshipLoader extends AbstractLoader {
 
     private void setRelationshipName(DbEntity entity, DbRelationship 
relationship) {
         relationship.setName(NameBuilder
-                .builder(relationship, entity)
+                .of(relationship).parent(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 86ed87962..bf9288533 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.builder(new 
DataChannelDescriptor()).name());
+        assertEquals("project", NameBuilder.of(new 
DataChannelDescriptor()).name());
     }
 
     @Test
@@ -48,22 +48,22 @@ public class NameBuilderTest {
         DataChannelDescriptor descriptor = new DataChannelDescriptor();
 
         DataMap m0 = new DataMap();
-        m0.setName(NameBuilder.builder(m0).in(descriptor).name());
+        m0.setName(NameBuilder.of(m0).parent(descriptor).name());
         assertEquals("datamap", m0.getName());
         descriptor.getDataMaps().add(m0);
 
         DataMap m1 = new DataMap();
-        m1.setName(NameBuilder.builder(m1).in(descriptor).name());
+        m1.setName(NameBuilder.of(m1).parent(descriptor).name());
         assertEquals("datamap1", m1.getName());
         descriptor.getDataMaps().add(m1);
 
         DataNodeDescriptor nd0 = new DataNodeDescriptor();
-        nd0.setName(NameBuilder.builder(nd0).in(descriptor).name());
+        nd0.setName(NameBuilder.of(nd0).parent(descriptor).name());
         assertEquals("datanode", nd0.getName());
         descriptor.getNodeDescriptors().add(nd0);
 
         DataNodeDescriptor nd1 = new DataNodeDescriptor();
-        nd1.setName(NameBuilder.builder(nd1).in(descriptor).name());
+        nd1.setName(NameBuilder.of(nd1).parent(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.builder(de0).in(map).name());
+        de0.setName(NameBuilder.of(de0).parent(map).name());
         assertEquals("db_entity", de0.getName());
         map.addDbEntity(de0);
 
         DbEntity de1 = new DbEntity();
-        de1.setName(NameBuilder.builder(de1).in(map).name());
+        de1.setName(NameBuilder.of(de1).parent(map).name());
         assertEquals("db_entity1", de1.getName());
         map.addDbEntity(de1);
 
         ObjEntity oe0 = new ObjEntity();
-        oe0.setName(NameBuilder.builder(oe0).in(map).name());
+        oe0.setName(NameBuilder.of(oe0).parent(map).name());
         assertEquals("ObjEntity", oe0.getName());
         map.addObjEntity(oe0);
 
         ObjEntity oe1 = new ObjEntity();
-        oe1.setName(NameBuilder.builder(oe1).in(map).name());
+        oe1.setName(NameBuilder.of(oe1).parent(map).name());
         assertEquals("ObjEntity1", oe1.getName());
         map.addObjEntity(oe1);
 
         ObjEntity oe2 = new ObjEntity();
-        
oe2.setName(NameBuilder.builder(oe0).in(map).baseName("db_entity").name());
+        
oe2.setName(NameBuilder.of(oe0).parent(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.builder(p0).in(map).name());
+        p0.setName(NameBuilder.of(p0).parent(map).name());
         assertEquals("procedure", p0.getName());
         map.addProcedure(p0);
 
         Procedure p1 = new Procedure();
-        p1.setName(NameBuilder.builder(p1).in(map).name());
+        p1.setName(NameBuilder.of(p1).parent(map).name());
         assertEquals("procedure1", p1.getName());
         map.addProcedure(p1);
 
         Procedure p2 = new Procedure();
-        
p2.setName(NameBuilder.builder(p1).in(map).baseName("db_enity").name());
+        p2.setName(NameBuilder.of(p1).parent(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.builder(q0).in(map).name());
+        q0.setName(NameBuilder.of(q0).parent(map).name());
         assertEquals("query", q0.getName());
         map.addQueryDescriptor(q0);
 
         QueryDescriptor q1 = QueryDescriptor.ejbqlQueryDescriptor();
-        q1.setName(NameBuilder.builder(q1).in(map).name());
+        q1.setName(NameBuilder.of(q1).parent(map).name());
         assertEquals("query1", q1.getName());
         map.addQueryDescriptor(q1);
 
         Embeddable e0 = new Embeddable();
-        e0.setClassName("com.foo." + NameBuilder.builder(e0).in(map).name());
+        e0.setClassName("com.foo." + NameBuilder.of(e0).parent(map).name());
         assertEquals("com.foo.Embeddable", e0.getClassName());
         map.addEmbeddable(e0);
 
         Embeddable e1 = new Embeddable();
-        e1.setClassName("com.foo." + NameBuilder.builder(e1).in(map).name());
+        e1.setClassName("com.foo." + NameBuilder.of(e1).parent(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.builder(a0).in(entity).name();
+        String na0 = NameBuilder.of(a0).parent(entity).name();
         assertEquals("untitledAttr", na0);
         a0.setName(na0);
         entity.addAttribute(a0);
 
         ObjAttribute a1 = new ObjAttribute();
-        String na1 = NameBuilder.builder(a1).in(entity).name();
+        String na1 = NameBuilder.of(a1).parent(entity).name();
         assertEquals("untitledAttr1", na1);
         a1.setName(na1);
         entity.addAttribute(a1);
 
         ObjAttribute a2 = new ObjAttribute();
-        String na2 = NameBuilder.builder(a2).in(entity).baseName("me").name();
+        String na2 = NameBuilder.of(a2).parent(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.builder(r0).in(entity).name();
+        String nr0 = NameBuilder.of(r0).parent(entity).name();
         assertEquals("untitledRel", nr0);
         r0.setName(nr0);
         entity.addRelationship(r0);
 
         ObjRelationship r1 = new ObjRelationship();
-        String nr1 = NameBuilder.builder(r1).in(entity).name();
+        String nr1 = NameBuilder.of(r1).parent(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.builder(a0).in(entity).name();
+        String na0 = NameBuilder.of(a0).parent(entity).name();
         assertEquals("untitledAttr", na0);
         a0.setName(na0);
         entity.addAttribute(a0);
 
         DbAttribute a1 = new DbAttribute();
-        String na1 = NameBuilder.builder(a1).in(entity).name();
+        String na1 = NameBuilder.of(a1).parent(entity).name();
         assertEquals("untitledAttr1", na1);
         a1.setName(na1);
         entity.addAttribute(a1);
 
         DbRelationship r0 = new DbRelationship();
-        String nr0 = NameBuilder.builder(r0).in(entity).name();
+        String nr0 = NameBuilder.of(r0).parent(entity).name();
         assertEquals("untitledRel", nr0);
         r0.setName(nr0);
         entity.addRelationship(r0);
 
         DbRelationship r1 = new DbRelationship();
-        String nr1 = NameBuilder.builder(r1).in(entity).name();
+        String nr1 = NameBuilder.of(r1).parent(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.builder(p0).in(procedure).name());
+        p0.setName(NameBuilder.of(p0).parent(procedure).name());
         assertEquals("UntitledProcedureParameter", p0.getName());
         procedure.addCallParameter(p0);
 
         ProcedureParameter p1 = new ProcedureParameter();
-        p1.setName(NameBuilder.builder(p1).in(procedure).name());
+        p1.setName(NameBuilder.of(p1).parent(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.builder(ea0).in(embeddable).name());
+        ea0.setName(NameBuilder.of(ea0).parent(embeddable).name());
         assertEquals("untitledAttr", ea0.getName());
         embeddable.addAttribute(ea0);
 
         EmbeddableAttribute ea1 = new EmbeddableAttribute();
-        ea1.setName(NameBuilder.builder(ea1).in(embeddable).name());
+        ea1.setName(NameBuilder.of(ea1).parent(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.builder(a0).in(entity).baseName("myName").name();
+        String na0 = 
NameBuilder.of(a0).parent(entity).baseName("myName").name();
         assertEquals("myName", na0);
         a0.setName(na0);
         entity.addAttribute(a0);
 
         ObjAttribute a1 = new ObjAttribute();
-        String na1 = 
NameBuilder.builder(a1).in(entity).baseName("MyName").name();
+        String na1 = 
NameBuilder.of(a1).parent(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.builderForCallbackMethod(entity).name();
+        String c0 = NameBuilder.ofCallbackMethod().parent(entity).name();
         assertEquals("onEvent", c0);
         entity.getCallbackMap().getPostAdd().addCallbackMethod(c0);
 
-        String c1 = NameBuilder.builderForCallbackMethod(entity).name();
+        String c1 = NameBuilder.ofCallbackMethod().parent(entity).name();
         assertEquals("onEvent1", c1);
         entity.getCallbackMap().getPostAdd().addCallbackMethod(c1);
 
         entity.addAttribute(new ObjAttribute("untitledAttr"));
 
-        String c3 = 
NameBuilder.builderForCallbackMethod(entity).baseName("getUntitledAttr").name();
+        String c3 = 
NameBuilder.ofCallbackMethod().parent(entity).baseName("getUntitledAttr").name();
         assertEquals("getUntitledAttr1", c3);
         entity.getCallbackMap().getPostAdd().addCallbackMethod(c3);
     }
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipsLoaderIT.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipsLoaderIT.java
index 445b525c0..a46c34964 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipsLoaderIT.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipsLoaderIT.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.dbsync.reverse.dbload;
 
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.junit.jupiter.api.Test;
@@ -55,7 +56,7 @@ public class RelationshipsLoaderIT extends BaseLoaderIT {
         exportedKeyLoader.load(metaData, store);
 
         // *** TESTING THIS ***
-        RelationshipLoader relationshipLoader = new 
RelationshipLoader(EMPTY_CONFIG, delegate, new DefaultObjectNameGenerator());
+        RelationshipLoader relationshipLoader = new 
RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
         relationshipLoader.load(metaData, store);
 
         Collection<DbRelationship> rels = 
getDbEntity("ARTIST").getRelationships();
@@ -94,7 +95,7 @@ public class RelationshipsLoaderIT extends BaseLoaderIT {
         new PrimaryKeyLoader(EMPTY_CONFIG, delegate).load(metaData, store);
         new ExportedKeyLoader(EMPTY_CONFIG, delegate).load(metaData, store);
 
-        new RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator()).load(metaData, store);
+        new RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance())).load(metaData, store);
 
         // COMPOUND_FK_TEST has a 2-column FK (F_KEY1, F_KEY2) -> 
COMPOUND_PK_TEST (KEY1, KEY2)
         DbEntity fkEntity = getDbEntity("COMPOUND_FK_TEST");
@@ -131,7 +132,7 @@ public class RelationshipsLoaderIT extends BaseLoaderIT {
         new PrimaryKeyLoader(EMPTY_CONFIG, delegate).load(metaData, store);
         new ExportedKeyLoader(EMPTY_CONFIG, delegate).load(metaData, store);
 
-        new RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator()).load(metaData, store);
+        new RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance())).load(metaData, store);
 
         // TWO_FK_B has two separate single-column FKs (A_ID1, A_ID2) -> 
TWO_FK_A (ID)
         DbEntity bEntity = getDbEntity("TWO_FK_B");
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
index 06d41e6b7..033aa9593 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
@@ -74,7 +74,7 @@ public class NameGeneratorPreferences {
 
         // move to top
         strategies.remove(strategy);
-        strategies.add(0, strategy);
+        strategies.addFirst(strategy);
 
         StringBuilder res = new StringBuilder();
         for (String str : strategies) {
@@ -88,6 +88,6 @@ public class NameGeneratorPreferences {
     public ObjectNameGenerator createNamingStrategy(Application application) 
throws Exception {
 
         return application.getClassLoader()
-                .loadClass(ObjectNameGenerator.class, 
getLastUsedStrategies(application).get(0)).getDeclaredConstructor().newInstance();
+                .loadClass(ObjectNameGenerator.class, 
getLastUsedStrategies(application).getFirst()).getDeclaredConstructor().newInstance();
     }
 }
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 7f0c42983..deaa71cb8 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
-                    .builder(attr, embeddable)
+                    .of(attr).parent(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.builder(attr, objEntity).name());
+            attr.setName(NameBuilder.of(attr).parent(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.builder(attr, dbEntity).name());
+            attr.setName(NameBuilder.of(attr).parent(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 13e670fd0..5597addec 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
@@ -56,7 +56,7 @@ public class CreateCallbackMethodAction extends AppAction {
         CallbackType callbackType = 
getProjectSession().getSelectedCallbackType();
 
         String methodName = NameBuilder
-                
.builderForCallbackMethod(getProjectSession().getSelectedObjEntity())
+                
.ofCallbackMethod().parent(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 5b90a21f0..691715069 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.builder(map, dataChannelDescriptor).name());
+        map.setName(NameBuilder.of(map).parent(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 52737f2f4..606cd1feb 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.builder(entity, map).name());
+        entity.setName(NameBuilder.of(entity).parent(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 3761c7603..26e4d1944 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.builder(embeddable, dataMap).name();
+        String baseName = NameBuilder.of(embeddable).parent(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 f7fb5127b..92c105ef9 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.builder(node, dataChannelDescriptor).name());
+        
node.setName(NameBuilder.of(node).parent(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 a42765085..f0ca27c81 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.builder(entity, dataMap).name());
+        entity.setName(NameBuilder.of(entity).parent(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
-                    .builder(entity, dbEntity.getDataMap())
+                    .of(entity).parent(dbEntity.getDataMap())
                     .baseName(baseName)
                     .name());
         }
@@ -101,7 +101,7 @@ public class CreateObjEntityAction extends AppAction {
         // TODO: Modeler-controlled defaults for all the hardcoded boolean 
flags here.
         EntityMergeSupport merger = new EntityMergeSupport(new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()),
                 NamePatternMatcher.EXCLUDE_ALL, true, false);
-        merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator());
+        merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator(NoStemStemmer.getInstance()));
         
merger.addEntityMergeListener(DeleteRuleUpdater.getEntityMergeListener());
         merger.synchronizeWithDbEntity(entity);
 
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 96e3e1a45..3507c76c3 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.builder(procedure, map).name());
+        procedure.setName(NameBuilder.of(procedure).parent(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 d6519ff0a..703c1c554 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.builder(parameter, 
procedure).name());
+            
parameter.setName(NameBuilder.of(parameter).parent(procedure).name());
 
             createProcedureParameter(procedure, parameter);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
index 64048e9be..d1c05ac39 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
@@ -21,7 +21,9 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
+import org.apache.cayenne.dbsync.naming.DbEntityNameStemmer;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
@@ -40,8 +42,7 @@ import java.awt.event.KeyEvent;
 import java.util.Collection;
 
 /**
- * Action that synchronizes all ObjEntities with the current state of the
- * selected DbEntity.
+ * Action that synchronizes all ObjEntities with the current state of the 
selected DbEntity.
  */
 public class DbEntitySyncAction extends AppAction {
 
@@ -54,18 +55,13 @@ public class DbEntitySyncAction extends AppAction {
         return KeyStroke.getKeyStroke(KeyEvent.VK_U, 
Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx());
     }
 
+    @Override
     public String getIconName() {
         return "icon-sync.png";
     }
 
-    /**
-     * @see AppAction#performAction(ActionEvent)
-     */
+    @Override
     public void performAction(ActionEvent e) {
-        syncDbEntity();
-    }
-
-    protected void syncDbEntity() {
         ProjectSession session = getProjectSession();
         DbEntity dbEntity = session.getSelectedDbEntity();
 
@@ -85,7 +81,7 @@ public class DbEntitySyncAction extends AppAction {
                 return;
             }
 
-            merger.setNameGenerator(new PreserveRelationshipNameGenerator());
+            merger.setNameGenerator(new 
PreserveRelationshipNameGenerator(NoStemStemmer.getInstance()));
 
             DbEntitySyncUndoableEdit undoableEdit = new 
DbEntitySyncUndoableEdit(session,
                     (DataChannelDescriptor) session.project().getRootNode(), 
session.getSelectedDataMap());
@@ -133,6 +129,10 @@ public class DbEntitySyncAction extends AppAction {
 
     static class PreserveRelationshipNameGenerator extends 
DefaultObjectNameGenerator {
 
+        public PreserveRelationshipNameGenerator(DbEntityNameStemmer 
dbEntityNameStemmer) {
+            super(dbEntityNameStemmer);
+        }
+
         @Override
         public String relationshipName(DbRelationship... relationshipChain) {
             if (relationshipChain.length == 0) {
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 4e6b27c49..e515145ff 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
-                    .builder(newMap, root)
+                    .of(newMap).parent(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 0e5501553..61bad0719 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
-                    .builder(map, root)
+                    .of(map).parent(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 1d9ee18de..397bca333 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,11 +61,10 @@ public class NewProjectAction extends AppAction {
         DataChannelDescriptor dataChannelDescriptor = new 
DataChannelDescriptor();
 
         dataChannelDescriptor.setName(NameBuilder
-                .builder(dataChannelDescriptor)
+                .of(dataChannelDescriptor)
                 .name());
 
-        Project project = new Project(
-                new 
ConfigurationTree<DataChannelDescriptor>(dataChannelDescriptor));
+        Project project = new Project(new 
ConfigurationTree<>(dataChannelDescriptor));
 
         controller.onProjectOpened(project, null);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
index 626f777fe..2c2c025fe 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.Application;
@@ -78,7 +79,7 @@ public class ObjEntitySyncAction extends AppAction {
                 return;
             }
 
-            merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator());
+            merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator(NoStemStemmer.getInstance()));
 
             if (merger.synchronizeWithDbEntity(entity)) {
                 session
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 26949af8c..dd09b1851 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
@@ -158,7 +158,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             // paste DataMap to DataDomain or DataNode
 
             dataMap.setName(NameBuilder
-                    .builder(dataMap, dataChannelDescriptor)
+                    .of(dataMap).parent(dataChannelDescriptor)
                     .baseName(dataMap.getName())
                     .dupesPattern(COPY_PATTERN)
                     .name());
@@ -173,7 +173,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             for (DbEntity dbEntity : dataMap.getDbEntities()) {
                 String oldName = dbEntity.getName();
                 dbEntity.setName(NameBuilder
-                        .builder(dbEntity, dataMap)
+                        .of(dbEntity).parent(dataMap)
                         .baseName(dbEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -186,7 +186,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             for (ObjEntity objEntity : dataMap.getObjEntities()) {
                 String oldName = objEntity.getName();
                 objEntity.setName(NameBuilder
-                        .builder(objEntity, dataMap)
+                        .of(objEntity).parent(dataMap)
                         .baseName(objEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -198,7 +198,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             for (Embeddable embeddable : dataMap.getEmbeddables()) {
                 embeddable.setClassName(NameBuilder
-                        .builder(embeddable, dataMap)
+                        .of(embeddable).parent(dataMap)
                         .baseName(embeddable.getClassName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -206,14 +206,14 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             for (Procedure procedure : dataMap.getProcedures()) {
                 procedure.setName(NameBuilder
-                        .builder(procedure, dataMap)
+                        .of(procedure).parent(dataMap)
                         .baseName(procedure.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
             }
 
             for (QueryDescriptor query : dataMap.getQueryDescriptors()) {
-                query.setName(NameBuilder.builder(query, dataMap)
+                query.setName(NameBuilder.of(query).parent(dataMap)
                         .baseName(query.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -256,7 +256,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof DbEntity dbEntity) {
                 dbEntity.setName(NameBuilder
-                        .builder(dbEntity, dataMap)
+                        .of(dbEntity).parent(dataMap)
                         .baseName(dbEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -265,7 +265,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.builder(objEntity, dataMap)
+                objEntity.setName(NameBuilder.of(objEntity).parent(dataMap)
                         .baseName(objEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -279,7 +279,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof Embeddable embeddable) {
                 // paste Embeddable to DataMap
                 embeddable.setClassName(NameBuilder
-                        .builder(embeddable, dataMap)
+                        .of(embeddable).parent(dataMap)
                         .baseName(embeddable.getClassName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -293,7 +293,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof QueryDescriptor query) {
 
                 query.setName(NameBuilder
-                        .builder(query, dataMap)
+                        .of(query).parent(dataMap)
                         .dupesPattern(COPY_PATTERN)
                         .baseName(query.getName())
                         .name());
@@ -304,7 +304,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof Procedure procedure) {
                 // paste Procedure to DataMap
                 procedure.setName(NameBuilder
-                        .builder(procedure, dataMap)
+                        .of(procedure).parent(dataMap)
                         .dupesPattern(COPY_PATTERN)
                         .baseName(procedure.getName())
                         .name());
@@ -320,7 +320,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof DbAttribute attr) {
                 attr.setName(NameBuilder
-                        .builder(attr, dbEntity)
+                        .of(attr).parent(dbEntity)
                         .dupesPattern(COPY_PATTERN)
                         .baseName(attr.getName())
                         .name());
@@ -330,7 +330,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
                         .getSelectedDataMap(), dbEntity, attr);
             } else if (content instanceof DbRelationship rel) {
                 rel.setName(NameBuilder
-                        .builder(rel, dbEntity)
+                        .of(rel).parent(dbEntity)
                         .baseName(rel.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -346,7 +346,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof ObjAttribute attr) {
                 attr.setName(NameBuilder
-                        .builder(attr, objEntity)
+                        .of(attr).parent(objEntity)
                         .baseName(attr.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -356,7 +356,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
                         .getSelectedDataMap(), objEntity, attr);
             } else if (content instanceof ObjRelationship rel) {
                 rel.setName(NameBuilder
-                        .builder(rel, objEntity)
+                        .of(rel).parent(objEntity)
                         .baseName(rel.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -370,7 +370,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof ObjCallbackMethod method) {
 
                 method.setName(NameBuilder
-                        .builderForCallbackMethod(objEntity)
+                        .ofCallbackMethod().parent(objEntity)
                         .baseName(method.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -387,7 +387,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof EmbeddableAttribute attr) {
                 attr.setName(NameBuilder
-                        .builder(attr, embeddable)
+                        .of(attr).parent(embeddable)
                         .baseName(attr.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -406,7 +406,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             if (content instanceof ProcedureParameter param) {
 
                 param.setName(NameBuilder
-                        .builder(param, procedure)
+                        .of(param).parent(procedure)
                         .baseName(param.getName())
                         .dupesPattern(COPY_PATTERN)
                         .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 9e5b29f94..bdecb3f23 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.builder(relationship, 
sourceEntity).name());
+        
relationship.setName(NameBuilder.of(relationship).parent(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
-                        .builder(reverse, relationship.getTargetEntity())
+                        .of(reverse).parent(relationship.getTargetEntity())
                         .baseName(reverseName.getText().trim())
                         .name());
 
@@ -455,7 +455,7 @@ public class DbRelationshipDialog extends ProjectDialog {
         }
 
         String newName = NameBuilder
-                .builder(rel, rel.getSourceEntity())
+                .of(rel).parent(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 9c318c6b1..5cfafbaed 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.builder(rel, objEntity).name());
+        rel.setName(NameBuilder.of(rel).parent(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 1054f7141..3ab4c555e 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.builder(query, dataMap).name());
+        query.setName(NameBuilder.of(query).parent(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 fc22630da..cc7b78fa8 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
@@ -39,7 +39,6 @@ import org.apache.cayenne.wocompat.parser.Parser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
 import java.io.InputStream;
 import java.net.URL;
 import java.sql.Types;
@@ -685,7 +684,7 @@ public class EOModelProcessor {
 
                        if (relationship.getReverseRelationship() == null) {
                                DbRelationship reverse = 
relationship.createReverseRelationship();
-                               reverse.setName(NameBuilder.builder(reverse, 
reverse.getSourceEntity())
+                               
reverse.setName(NameBuilder.of(reverse).parent(reverse.getSourceEntity())
                                                // TODO: we can do better with 
ObjectNameGenerator
                                                
.baseName(relationship.getName() + "Reverse")
                                                .name());

Reply via email to