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 0ef59bb2fefbe444e40c96ab3282c1af6b1418c6
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Jul 19 21:40:02 2026 +0200

    ObjectNameGenerator cleanup
    
    moving "stemmer" into a subclass hierarchy... While composition is usually
    cleaner, here we are dealing with constyructor based instantiation and 
pre-existing
    inhgeritance... So minimizing generator optionality
---
 .../tools/utils/CustomObjectNameGenerator.java     |  10 --
 .../dbsync/merge/context/MergerContext.java        |   5 +-
 ...Generator.java => BaseObjectNameGenerator.java} |  62 +++++-------
 .../cayenne/dbsync/naming/DbEntityNameStemmer.java |  29 ------
 .../dbsync/naming/DefaultObjectNameGenerator.java  | 104 +--------------------
 .../cayenne/dbsync/naming/NoStemStemmer.java       |  39 --------
 .../dbsync/naming/PatternObjectNameGenerator.java  |  26 ++++--
 .../cayenne/dbsync/naming/PatternStemmer.java      |  46 ---------
 .../reverse/dbimport/DbImportConfiguration.java    |  21 ++---
 .../cayenne/dbsync/merge/EntityMergeSupportIT.java |  11 +--
 .../org/apache/cayenne/dbsync/merge/MergeCase.java |   5 +-
 .../naming/DefaultObjectNameGeneratorTest.java     |  12 ++-
 .../naming/PatternObjectNameGeneratorTest.java     |  56 +++++++++++
 .../cayenne/dbsync/naming/PatternStemmerTest.java  |  61 ------------
 .../dbimport/DefaultDbImportActionTest.java        |  15 +--
 .../dbimport/ManyToManyCandidateEntityTest.java    |   3 +-
 .../cayenne/dbsync/reverse/dbload/DbLoaderIT.java  |   7 +-
 .../reverse/dbload/RelationshipsLoaderIT.java      |   7 +-
 .../cayenne/stubs/CustomObjectNameGenerator.java   |  24 +----
 .../modeler/ui/action/CreateObjEntityAction.java   |   9 +-
 .../modeler/ui/action/DbEntitySyncAction.java      |  10 +-
 .../modeler/ui/action/ObjEntitySyncAction.java     |   7 +-
 .../modeler/ui/dbmerge/MergerOptionsDialog.java    |  26 ++----
 .../modeler/ui/entitysync/EntitySyncDialog.java    |  17 +---
 24 files changed, 159 insertions(+), 453 deletions(-)

diff --git 
a/cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
 
b/cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
index cd9eafa22..2122f7d46 100644
--- 
a/cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
+++ 
b/cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
@@ -19,17 +19,7 @@
 
 package org.apache.cayenne.tools.utils;
 
-import org.apache.cayenne.dbsync.naming.DbEntityNameStemmer;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 
 public class CustomObjectNameGenerator extends DefaultObjectNameGenerator {
-
-    public CustomObjectNameGenerator() {
-        super(NoStemStemmer.getInstance());
-    }
-
-    public CustomObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) {
-        super(dbEntityNameStemmer);
-    }
 }
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/MergerContext.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/MergerContext.java
index 16472e58e..dcacbb921 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/MergerContext.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/MergerContext.java
@@ -24,9 +24,8 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.filter.NameFilter;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.dbload.DefaultModelMergeDelegate;
 import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate;
 import org.apache.cayenne.map.DataMap;
@@ -124,7 +123,7 @@ public class MergerContext {
             }
 
             if(context.nameGenerator == null) {
-                context.nameGenerator = new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance());
+                context.nameGenerator = new DefaultObjectNameGenerator();
             }
 
             if(meaningfulPKsFilter == null) {
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/BaseObjectNameGenerator.java
similarity index 67%
copy from 
cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGenerator.java
copy to 
cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/BaseObjectNameGenerator.java
index f1da0a527..004188b27 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/BaseObjectNameGenerator.java
@@ -25,19 +25,24 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.util.Util;
 
 import java.util.List;
-import java.util.Objects;
 
 /**
  * The default strategy for converting DB-layer to Object-layer names.
  *
- * @since 4.0
+ * @since 5.0
  */
-public class DefaultObjectNameGenerator implements ObjectNameGenerator {
+public abstract class BaseObjectNameGenerator implements ObjectNameGenerator {
 
-    private final DbEntityNameStemmer dbEntityNameStemmer;
+    protected abstract String dbEntityBaseName(String dbEntityName);
 
-    public DefaultObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) 
{
-        this.dbEntityNameStemmer = dbEntityNameStemmer;
+    @Override
+    public String objEntityName(DbEntity dbEntity) {
+        return Util.underscoredToJava(dbEntityBaseName(dbEntity.getName()), 
true);
+    }
+
+    @Override
+    public String objAttributeName(DbAttribute dbAttribute) {
+        return Util.underscoredToJava(dbAttribute.getName(), false);
     }
 
     @Override
@@ -47,12 +52,9 @@ public class DefaultObjectNameGenerator implements 
ObjectNameGenerator {
             throw new IllegalArgumentException("At least one relationship is 
expected");
         }
 
-        // ignore the name of DbRelationships themselves...
-        // generate the name based on join semantics...
-
         DbRelationship first = relationshipChain[0];
         DbRelationship last = relationshipChain[relationshipChain.length - 1];
-        return relationshipName(first.getJoins(), last.getTargetEntityName(), 
isToMany(relationshipChain));
+        return Util.underscoredToJava(relationshipBase(first.getJoins(), 
last.getTargetEntityName(), isToMany(relationshipChain)), false);
     }
 
     @Override
@@ -63,15 +65,7 @@ public class DefaultObjectNameGenerator implements 
ObjectNameGenerator {
         }
 
         String targetEntityName = 
joins.getFirst().getRelationship().getTargetEntityName();
-        return relationshipName(joins, targetEntityName, toMany);
-    }
-
-    protected String relationshipName(List<DbJoin> joins, String 
targetEntityName, boolean toMany) {
-        String name = toMany
-                ? toManyRelationshipName(targetEntityName)
-                : toOneRelationshipName(joins, targetEntityName);
-
-        return Util.underscoredToJava(name, false);
+        return Util.underscoredToJava(relationshipBase(joins, 
targetEntityName, toMany), false);
     }
 
     protected boolean isToMany(DbRelationship... relationshipChain) {
@@ -85,21 +79,24 @@ public class DefaultObjectNameGenerator implements 
ObjectNameGenerator {
         return false;
     }
 
-    protected String stemmed(String dbEntityName) {
-        return dbEntityNameStemmer.stem(Objects.requireNonNull(dbEntityName));
+    protected String relationshipBase(List<DbJoin> joins, String 
targetEntityName, boolean toMany) {
+        return toMany
+                ? toManyBase(targetEntityName)
+                : toOneBase(joins, targetEntityName);
     }
 
-    protected String toManyRelationshipName(String targetEntityName) {
-        String baseName = stemmed(targetEntityName);
+    protected String toManyBase(String targetEntityName) {
+        String baseName = dbEntityBaseName(targetEntityName);
         return EnglishInflector.pluralOf(baseName.toLowerCase());
     }
 
-    protected String toOneRelationshipName(List<DbJoin> joins, String 
targetEntityName) {
+
+    protected String toOneBase(List<DbJoin> joins, String targetEntityName) {
 
         if (joins.isEmpty()) {
             // In case, when uses EditRelationship button, relationship 
doesn't exist => it doesn't have joins
             // and just return targetName
-            return stemmed(targetEntityName);
+            return dbEntityBaseName(targetEntityName);
         }
 
         DbJoin join1 = joins.getFirst();
@@ -109,24 +106,13 @@ public class DefaultObjectNameGenerator implements 
ObjectNameGenerator {
         // return the name of the FK column sans ID
         String fkColName = join1.getSourceName();
         if (fkColName == null) {
-            return stemmed(targetEntityName);
+            return dbEntityBaseName(targetEntityName);
         } else if (fkColName.toUpperCase().endsWith("_ID") && 
fkColName.length() > 3) {
             return fkColName.substring(0, fkColName.length() - 3);
         } else if (fkColName.toUpperCase().endsWith("ID") && 
fkColName.length() > 2) {
             return fkColName.substring(0, fkColName.length() - 2);
         } else {
-            return stemmed(targetEntityName);
+            return dbEntityBaseName(targetEntityName);
         }
     }
-
-    @Override
-    public String objEntityName(DbEntity dbEntity) {
-        String baseName = stemmed(dbEntity.getName());
-        return Util.underscoredToJava(baseName, true);
-    }
-
-    @Override
-    public String objAttributeName(DbAttribute attr) {
-        return Util.underscoredToJava(attr.getName(), false);
-    }
 }
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DbEntityNameStemmer.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DbEntityNameStemmer.java
deleted file mode 100644
index b83b9845b..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DbEntityNameStemmer.java
+++ /dev/null
@@ -1,29 +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;
-
-/**
- * An algorithm for "stemming" DbEntity names before they can be used for 
object name generation.
- *
- * @since 4.0
- */
-public interface DbEntityNameStemmer {
-
-    String stem(String dbEntityName);
-}
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 f1da0a527..9f0b0b5e0 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
@@ -18,13 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.naming;
 
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbJoin;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.util.Util;
-
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -32,101 +25,10 @@ import java.util.Objects;
  *
  * @since 4.0
  */
-public class DefaultObjectNameGenerator implements ObjectNameGenerator {
-
-    private final DbEntityNameStemmer dbEntityNameStemmer;
-
-    public DefaultObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) 
{
-        this.dbEntityNameStemmer = dbEntityNameStemmer;
-    }
-
-    @Override
-    public String objRelationshipName(DbRelationship... relationshipChain) {
-
-        if (relationshipChain == null || relationshipChain.length < 1) {
-            throw new IllegalArgumentException("At least one relationship is 
expected");
-        }
-
-        // ignore the name of DbRelationships themselves...
-        // generate the name based on join semantics...
-
-        DbRelationship first = relationshipChain[0];
-        DbRelationship last = relationshipChain[relationshipChain.length - 1];
-        return relationshipName(first.getJoins(), last.getTargetEntityName(), 
isToMany(relationshipChain));
-    }
-
-    @Override
-    public String dbRelationshipName(List<DbJoin> joins, boolean toMany) {
-
-        if (joins == null || joins.isEmpty()) {
-            throw new IllegalArgumentException("At least one join is 
expected");
-        }
-
-        String targetEntityName = 
joins.getFirst().getRelationship().getTargetEntityName();
-        return relationshipName(joins, targetEntityName, toMany);
-    }
-
-    protected String relationshipName(List<DbJoin> joins, String 
targetEntityName, boolean toMany) {
-        String name = toMany
-                ? toManyRelationshipName(targetEntityName)
-                : toOneRelationshipName(joins, targetEntityName);
-
-        return Util.underscoredToJava(name, false);
-    }
-
-    protected boolean isToMany(DbRelationship... relationshipChain) {
-
-        for (DbRelationship r : relationshipChain) {
-            if (r.isToMany()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    protected String stemmed(String dbEntityName) {
-        return dbEntityNameStemmer.stem(Objects.requireNonNull(dbEntityName));
-    }
-
-    protected String toManyRelationshipName(String targetEntityName) {
-        String baseName = stemmed(targetEntityName);
-        return EnglishInflector.pluralOf(baseName.toLowerCase());
-    }
-
-    protected String toOneRelationshipName(List<DbJoin> joins, String 
targetEntityName) {
-
-        if (joins.isEmpty()) {
-            // In case, when uses EditRelationship button, relationship 
doesn't exist => it doesn't have joins
-            // and just return targetName
-            return stemmed(targetEntityName);
-        }
-
-        DbJoin join1 = joins.getFirst();
-
-        // TODO: multi-join relationships
-
-        // return the name of the FK column sans ID
-        String fkColName = join1.getSourceName();
-        if (fkColName == null) {
-            return stemmed(targetEntityName);
-        } else if (fkColName.toUpperCase().endsWith("_ID") && 
fkColName.length() > 3) {
-            return fkColName.substring(0, fkColName.length() - 3);
-        } else if (fkColName.toUpperCase().endsWith("ID") && 
fkColName.length() > 2) {
-            return fkColName.substring(0, fkColName.length() - 2);
-        } else {
-            return stemmed(targetEntityName);
-        }
-    }
-
-    @Override
-    public String objEntityName(DbEntity dbEntity) {
-        String baseName = stemmed(dbEntity.getName());
-        return Util.underscoredToJava(baseName, true);
-    }
+public class DefaultObjectNameGenerator extends BaseObjectNameGenerator {
 
     @Override
-    public String objAttributeName(DbAttribute attr) {
-        return Util.underscoredToJava(attr.getName(), false);
+    protected String dbEntityBaseName(String dbEntityName) {
+        return Objects.requireNonNull(dbEntityName);
     }
 }
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NoStemStemmer.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NoStemStemmer.java
deleted file mode 100644
index cd7da86b9..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NoStemStemmer.java
+++ /dev/null
@@ -1,39 +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;
-
-/**
- * @since 4.0
- */
-public class NoStemStemmer implements DbEntityNameStemmer {
-
-    private static final DbEntityNameStemmer INSTANCE = new NoStemStemmer();
-
-    public static DbEntityNameStemmer getInstance() {
-        return INSTANCE;
-    }
-
-    private NoStemStemmer() {
-    }
-
-    @Override
-    public String stem(String dbEntityName) {
-        return dbEntityName;
-    }
-}
diff --git 
a/cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternObjectNameGenerator.java
similarity index 59%
copy from 
cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
copy to 
cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternObjectNameGenerator.java
index cd9eafa22..ee666131d 100644
--- 
a/cayenne-ant/src/test/java/org/apache/cayenne/tools/utils/CustomObjectNameGenerator.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternObjectNameGenerator.java
@@ -16,20 +16,28 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+package org.apache.cayenne.dbsync.naming;
 
-package org.apache.cayenne.tools.utils;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
-import org.apache.cayenne.dbsync.naming.DbEntityNameStemmer;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
+/**
+ * Pattern-based generator that strips of certain DB name pieces.
+ *
+ * @since 5.0
+ */
+public class PatternObjectNameGenerator extends BaseObjectNameGenerator {
 
-public class CustomObjectNameGenerator extends DefaultObjectNameGenerator {
+    private final Pattern pattern;
 
-    public CustomObjectNameGenerator() {
-        super(NoStemStemmer.getInstance());
+    public PatternObjectNameGenerator(String stripPattern) {
+        this.pattern = Pattern.compile(stripPattern, Pattern.CASE_INSENSITIVE);
     }
 
-    public CustomObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) {
-        super(dbEntityNameStemmer);
+    @Override
+    protected String dbEntityBaseName(String dbEntityName) {
+        Matcher m = pattern.matcher(Objects.requireNonNull(dbEntityName));
+        return m.replaceAll("");
     }
 }
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
deleted file mode 100644
index 66edf28e6..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
+++ /dev/null
@@ -1,46 +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 java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @since 4.0
- */
-public class PatternStemmer implements DbEntityNameStemmer {
-
-    private final Pattern pattern;
-
-    public PatternStemmer(String stripPattern, boolean caseSensitive) {
-
-        int flags = 0;
-        if (!caseSensitive) {
-            flags = flags | Pattern.CASE_INSENSITIVE;
-        }
-
-        this.pattern = Pattern.compile(stripPattern, flags);
-    }
-
-    @Override
-    public String stem(String dbEntityName) {
-        Matcher m = pattern.matcher(dbEntityName);
-        return m.replaceAll("");
-    }
-}
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
index 0827d8441..617cc6225 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java
@@ -18,20 +18,15 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.reverse.dbimport;
 
-import java.io.File;
-import java.util.regex.Pattern;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.DataSourceDescriptor;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.filter.NameFilter;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
-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.dbsync.naming.ObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.PatternStemmer;
+import org.apache.cayenne.dbsync.naming.PatternObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.dbload.DefaultDbLoaderDelegate;
@@ -41,6 +36,9 @@ import 
org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.slf4j.Logger;
 
+import java.io.File;
+import java.util.regex.Pattern;
+
 /**
  * @since 4.0
  */
@@ -149,6 +147,7 @@ public class DbImportConfiguration {
 
     /**
      * does nothing
+     *
      * @param usePrimitives not used
      */
     @Deprecated(since = "5.0", forRemoval = true)
@@ -204,13 +203,9 @@ public class DbImportConfiguration {
             }
         }
 
-        return new DefaultObjectNameGenerator(createStemmer());
-    }
-
-    protected DbEntityNameStemmer createStemmer() {
-        return (stripFromTableNames == null || stripFromTableNames.length() == 
0)
-                ? NoStemStemmer.getInstance()
-                : new PatternStemmer(stripFromTableNames, false);
+        return stripFromTableNames == null || stripFromTableNames.isEmpty()
+                ? new DefaultObjectNameGenerator()
+                : new PatternObjectNameGenerator(stripFromTableNames);
     }
 
     public String getDriver() {
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java
index ddc8117bd..d88f2968c 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java
@@ -21,23 +21,18 @@ package org.apache.cayenne.dbsync.merge;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
 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.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.DeleteRule;
 import org.apache.cayenne.map.ObjEntity;
+import org.junit.jupiter.api.Test;
 
 import java.sql.Types;
 import java.util.Arrays;
 
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
 
 public class EntityMergeSupportIT extends MergeCase {
 
@@ -92,7 +87,7 @@ public class EntityMergeSupportIT extends MergeCase {
                map.addObjEntity(objEntity2);
 
                EntityMergeSupport entityMergeSupport = new EntityMergeSupport(
-                               new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()),
+                               new DefaultObjectNameGenerator(),
                                NamePatternMatcher.EXCLUDE_ALL,
                                true,
                                false);
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
index adcaf1037..cc06fa25b 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
@@ -30,7 +30,6 @@ import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.dbload.LoggingDbLoaderDelegate;
@@ -42,9 +41,9 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.runtime.CayenneRuntime;
+import org.apache.cayenne.unit.CayenneProjects;
 import org.apache.cayenne.unit.CayenneTestsEnv;
 import org.apache.cayenne.unit.dba.TestDbAdapter;
-import org.apache.cayenne.unit.CayenneProjects;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.slf4j.Logger;
@@ -120,7 +119,7 @@ public abstract class MergeCase {
             dbImport = new DbLoader(node.getAdapter(), conn,
                     loaderConfiguration,
                     new 
LoggingDbLoaderDelegate(LoggerFactory.getLogger(DbLoader.class)),
-                    new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
+                    new DefaultObjectNameGenerator())
                     .load();
 
         } catch (SQLException e) {
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGeneratorTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGeneratorTest.java
index ba680ab21..34877dc7a 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGeneratorTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGeneratorTest.java
@@ -28,10 +28,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class DefaultObjectNameGeneratorTest {
 
-    private DefaultObjectNameGenerator generator = new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance());
-
-    private DbRelationship makeRelationship(String srcEntity, String srcKey, 
String targetEntity, String targetKey,
-                                            boolean toMany) {
+    private final DefaultObjectNameGenerator generator = new 
DefaultObjectNameGenerator();
+
+    private DbRelationship makeRelationship(
+            String srcEntity,
+            String srcKey,
+            String targetEntity,
+            String targetKey,
+            boolean toMany) {
 
         DbRelationship relationship = new DbRelationship();
         relationship.addJoin(new DbJoin(relationship, srcKey, targetKey));
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternObjectNameGeneratorTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternObjectNameGeneratorTest.java
new file mode 100644
index 000000000..8139091f2
--- /dev/null
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternObjectNameGeneratorTest.java
@@ -0,0 +1,56 @@
+/*
+ *    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.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class PatternObjectNameGeneratorTest {
+
+
+    @Test
+    public void dbEntityBaseName_NoMatch() {
+        assertEquals("xyzabc", new 
PatternObjectNameGenerator("^pre").dbEntityBaseName("xyzabc"));
+    }
+
+    @Test
+    public void dbEntityBaseName() {
+        assertEquals("lowercase", new 
PatternObjectNameGenerator("^pre").dbEntityBaseName("prelowercase"));
+        assertEquals("UPPERCASE", new 
PatternObjectNameGenerator("^pre").dbEntityBaseName("PREUPPERCASE"));
+    }
+
+    @Test
+    public void stripHead() {
+        assertEquals("name", new 
PatternObjectNameGenerator("^strip_").dbEntityBaseName("strip_name"));
+        assertEquals("strip_name", new 
PatternObjectNameGenerator("^strip_").dbEntityBaseName("strip_strip_name"));
+    }
+
+    @Test
+    public void stripTail() {
+        assertEquals("name", new 
PatternObjectNameGenerator("_strip$").dbEntityBaseName("name_strip"));
+        assertEquals("name_strip", new 
PatternObjectNameGenerator("_strip$").dbEntityBaseName("name_strip_strip"));
+    }
+
+    @Test
+    public void stripiddle() {
+        assertEquals("start_end", new 
PatternObjectNameGenerator("_strip").dbEntityBaseName("start_strip_end"));
+        assertEquals("start_end", new 
PatternObjectNameGenerator("_strip").dbEntityBaseName("start_strip_strip_end"));
+    }
+}
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternStemmerTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternStemmerTest.java
deleted file mode 100644
index c61b11568..000000000
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternStemmerTest.java
+++ /dev/null
@@ -1,61 +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.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class PatternStemmerTest {
-
-    @Test
-    public void stemNoMatch() {
-        assertEquals("xyzabc", new PatternStemmer("^pre", 
false).stem("xyzabc"));
-    }
-
-    @Test
-    public void stemCaseSensitive() {
-        assertEquals("PREUPPERCASE", new PatternStemmer("^pre", 
true).stem("PREUPPERCASE"));
-        assertEquals("UPPERCASE", new PatternStemmer("^pre", 
true).stem("preUPPERCASE"));
-    }
-
-    @Test
-    public void stemCaseInsensitive() {
-        assertEquals("lowercase", new PatternStemmer("^pre", 
false).stem("prelowercase"));
-        assertEquals("UPPERCASE", new PatternStemmer("^pre", 
false).stem("PREUPPERCASE"));
-    }
-
-    @Test
-    public void stemHead() {
-        assertEquals("name", new PatternStemmer("^strip_", 
false).stem("strip_name"));
-        assertEquals("strip_name", new PatternStemmer("^strip_", 
false).stem("strip_strip_name"));
-    }
-
-    @Test
-    public void stemTail() {
-        assertEquals("name", new PatternStemmer("_strip$", 
false).stem("name_strip"));
-        assertEquals("name_strip", new PatternStemmer("_strip$", 
false).stem("name_strip_strip"));
-    }
-
-    @Test
-    public void stemMiddle() {
-        assertEquals("start_end", new PatternStemmer("_strip", 
false).stem("start_strip_end"));
-        assertEquals("start_end", new PatternStemmer("_strip", 
false).stem("start_strip_strip_end"));
-    }
-}
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
index c5bebb86f..3d940f3a1 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
@@ -34,9 +34,8 @@ import 
org.apache.cayenne.dbsync.merge.token.db.CreateTableToDb;
 import org.apache.cayenne.dbsync.merge.token.model.AddColumnToModel;
 import org.apache.cayenne.dbsync.merge.token.model.AddRelationshipToModel;
 import org.apache.cayenne.dbsync.merge.token.model.CreateTableToModel;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
@@ -51,9 +50,9 @@ import org.apache.cayenne.project.Project;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.util.Util;
-import org.slf4j.Logger;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
 
 import javax.sql.DataSource;
 import java.io.File;
@@ -67,12 +66,8 @@ import java.util.LinkedList;
 import java.util.List;
 
 import static java.util.Arrays.asList;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbAttr;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbEntity;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.objAttr;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.objEntity;
+import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.*;
 import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
 
@@ -110,7 +105,7 @@ public class DefaultDbImportActionTest {
         when(config.createMergeDelegate()).thenReturn(new 
DefaultModelMergeDelegate());
         when(config.getDbLoaderConfig()).thenReturn(new 
DbLoaderConfiguration());
         when(config.getTargetDataMap()).thenReturn(new File("xyz.map.xml"));
-        when(config.createNameGenerator()).thenReturn(new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+        when(config.createNameGenerator()).thenReturn(new 
DefaultObjectNameGenerator());
         
when(config.createMeaningfulPKFilter()).thenReturn(NamePatternMatcher.EXCLUDE_ALL);
 
         DbLoader dbLoader = new DbLoader(mockAdapter, mockConnection, 
config.getDbLoaderConfig(), mockDelegate, mockNameGenerator) {
@@ -146,7 +141,7 @@ public class DefaultDbImportActionTest {
         when(config.getTargetDataMap()).thenReturn(FILE_STUB);
         when(config.createMergeDelegate()).thenReturn(new 
DefaultModelMergeDelegate());
         when(config.getDbLoaderConfig()).thenReturn(new 
DbLoaderConfiguration());
-        when(config.createNameGenerator()).thenReturn(new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+        when(config.createNameGenerator()).thenReturn(new 
DefaultObjectNameGenerator());
         
when(config.createMeaningfulPKFilter()).thenReturn(NamePatternMatcher.EXCLUDE_ALL);
 
         DbLoader dbLoader = new DbLoader(mockAdapter, mockConnection, 
config.getDbLoaderConfig(), mockDelegate, mockNameGenerator) {
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
index eccc3a378..0d45ac0a6 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
@@ -32,7 +32,6 @@ import 
org.apache.cayenne.configuration.xml.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
 import org.apache.cayenne.configuration.xml.XMLReaderProvider;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
@@ -101,7 +100,7 @@ public class ManyToManyCandidateEntityTest {
         ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
 
         ManyToManyCandidateEntity.build(manyToManyEntity)
-                .optimizeRelationships(new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+                .optimizeRelationships(new DefaultObjectNameGenerator());
 
         ObjEntity table1Entity = map.getObjEntity("Table1");
         ObjEntity table2Entity = map.getObjEntity("Table2");
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
index 9e9cbe350..d73c0fb5b 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
@@ -21,7 +21,6 @@ package org.apache.cayenne.dbsync.reverse.dbload;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
@@ -31,8 +30,8 @@ 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.unit.CayenneTestsEnv;
 import org.apache.cayenne.unit.CayenneProjects;
+import org.apache.cayenne.unit.CayenneTestsEnv;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -142,11 +141,11 @@ public class DbLoaderIT {
     }
 
     private DbLoader createDbLoader() {
-        return new DbLoader(adapter, connection, CONFIG, null, new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+        return new DbLoader(adapter, connection, CONFIG, null, new 
DefaultObjectNameGenerator());
     }
 
     private DbLoader createDbLoader(DbLoaderConfiguration configuration) {
-        return new DbLoader(adapter, connection, configuration, null, new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+        return new DbLoader(adapter, connection, configuration, null, new 
DefaultObjectNameGenerator());
     }
 
     @AfterEach
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 a46c34964..445b525c0 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,7 +20,6 @@
 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;
@@ -56,7 +55,7 @@ public class RelationshipsLoaderIT extends BaseLoaderIT {
         exportedKeyLoader.load(metaData, store);
 
         // *** TESTING THIS ***
-        RelationshipLoader relationshipLoader = new 
RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+        RelationshipLoader relationshipLoader = new 
RelationshipLoader(EMPTY_CONFIG, delegate, new DefaultObjectNameGenerator());
         relationshipLoader.load(metaData, store);
 
         Collection<DbRelationship> rels = 
getDbEntity("ARTIST").getRelationships();
@@ -95,7 +94,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(NoStemStemmer.getInstance())).load(metaData, store);
+        new RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator()).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");
@@ -132,7 +131,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(NoStemStemmer.getInstance())).load(metaData, store);
+        new RelationshipLoader(EMPTY_CONFIG, delegate, new 
DefaultObjectNameGenerator()).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/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
 
b/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
index bea713b69..c22c2f3ac 100644
--- 
a/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
+++ 
b/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
@@ -19,11 +19,6 @@
 
 package org.apache.cayenne.stubs;
 
-import java.util.List;
-import java.util.Objects;
-
-import org.apache.cayenne.dbsync.naming.DbEntityNameStemmer;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -31,17 +26,9 @@ import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.util.Util;
 
-public class CustomObjectNameGenerator implements ObjectNameGenerator {
-
-    private DbEntityNameStemmer dbEntityNameStemmer;
-
-    public CustomObjectNameGenerator() {
-        this.dbEntityNameStemmer = NoStemStemmer.getInstance();
-    }
+import java.util.List;
 
-    public CustomObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) {
-        this.dbEntityNameStemmer = dbEntityNameStemmer;
-    }
+public class CustomObjectNameGenerator implements ObjectNameGenerator {
 
     @Override
     public String objRelationshipName(DbRelationship... relationshipChain) {
@@ -53,14 +40,9 @@ public class CustomObjectNameGenerator implements 
ObjectNameGenerator {
         return null;
     }
 
-    protected String stemmed(String dbEntityName) {
-        return dbEntityNameStemmer.stem(Objects.requireNonNull(dbEntityName));
-    }
-
     @Override
     public String objEntityName(DbEntity dbEntity) {
-        String baseName = stemmed(dbEntity.getName());
-        return "Custom" + Util.underscoredToJava(baseName, true);
+        return "Custom" + Util.underscoredToJava(dbEntity.getName(), true);
     }
 
     @Override
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 8c61b0b8b..0f0d10558 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
@@ -22,9 +22,8 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
@@ -87,7 +86,7 @@ public class CreateObjEntityAction extends AppAction {
             entity.setDbEntity(dbEntity);
 
             // TODO: use injectable name generator
-            String baseName = new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()).objEntityName(dbEntity);
+            String baseName = new 
DefaultObjectNameGenerator().objEntityName(dbEntity);
             entity.setName(NameBuilder
                     .of(entity, dbEntity.getDataMap())
                     .preferredName(baseName)
@@ -99,9 +98,9 @@ public class CreateObjEntityAction extends AppAction {
         dataMap.addObjEntity(entity);
 
         // TODO: Modeler-controlled defaults for all the hardcoded boolean 
flags here.
-        EntityMergeSupport merger = new EntityMergeSupport(new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()),
+        EntityMergeSupport merger = new EntityMergeSupport(new 
DefaultObjectNameGenerator(),
                 NamePatternMatcher.EXCLUDE_ALL, true, false);
-        merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator(NoStemStemmer.getInstance()));
+        merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator());
         
merger.addEntityMergeListener(DeleteRuleUpdater.getEntityMergeListener());
         merger.synchronizeWithDbEntity(entity);
 
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 fb8afcc91..30d81d15d 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,15 +21,13 @@ 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;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.entitysync.EntitySyncDialog;
@@ -81,7 +79,7 @@ public class DbEntitySyncAction extends AppAction {
                 return;
             }
 
-            merger.setNameGenerator(new 
PreserveRelationshipNameGenerator(NoStemStemmer.getInstance()));
+            merger.setNameGenerator(new PreserveRelationshipNameGenerator());
 
             DbEntitySyncUndoableEdit undoableEdit = new 
DbEntitySyncUndoableEdit(session,
                     (DataChannelDescriptor) session.project().getRootNode(), 
session.getSelectedDataMap());
@@ -129,10 +127,6 @@ public class DbEntitySyncAction extends AppAction {
 
     static class PreserveRelationshipNameGenerator extends 
DefaultObjectNameGenerator {
 
-        public PreserveRelationshipNameGenerator(DbEntityNameStemmer 
dbEntityNameStemmer) {
-            super(dbEntityNameStemmer);
-        }
-
         @Override
         public String objRelationshipName(DbRelationship... relationshipChain) 
{
             if (relationshipChain.length == 0) {
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 2c2c025fe..a96833b3e 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,14 +21,13 @@ 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;
+import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
+import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.entitysync.EntitySyncDialog;
-import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
 
 import javax.swing.*;
 import java.awt.*;
@@ -79,7 +78,7 @@ public class ObjEntitySyncAction extends AppAction {
                 return;
             }
 
-            merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator(NoStemStemmer.getInstance()));
+            merger.setNameGenerator(new 
DbEntitySyncAction.PreserveRelationshipNameGenerator());
 
             if (merger.synchronizeWithDbEntity(entity)) {
                 session
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
index 03ca46d78..440919837 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
@@ -33,7 +33,6 @@ import 
org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.dbimport.DefaultDbImportAction;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
@@ -46,33 +45,22 @@ import 
org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
-import org.apache.cayenne.modeler.pref.dbconnector.DBConnector;
 import org.apache.cayenne.modeler.dbconnector.DBConnectorFactory;
 import org.apache.cayenne.modeler.event.model.DataMapEvent;
+import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
+import org.apache.cayenne.modeler.pref.dbconnector.DBConnector;
+import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.toolkit.border.TopBorder;
 import org.apache.cayenne.modeler.toolkit.text.CMTextArea;
-import org.apache.cayenne.modeler.toolkit.ProjectDialog;
-import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.validation.ValidationDialog;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.validation.ValidationResult;
 import org.slf4j.LoggerFactory;
 
 import javax.sql.DataSource;
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingConstants;
-import java.awt.BorderLayout;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Window;
+import javax.swing.*;
+import java.awt.*;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -215,7 +203,7 @@ public class MergerOptionsDialog extends ProjectDialog {
                 dbImport = new DbLoader(adapter, conn,
                         config,
                         new 
LoggingDbLoaderDelegate(LoggerFactory.getLogger(DbLoader.class)),
-                        new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
+                        new DefaultObjectNameGenerator())
                         .load();
             } catch (SQLException e) {
                 throw new CayenneRuntimeException("Can't doLoad dataMap from 
db.", e);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
index 7df14e555..c0f4eb942 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
@@ -24,23 +24,16 @@ import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.toolkit.AppDialog;
 import org.apache.cayenne.modeler.NameGeneratorPreferences;
+import org.apache.cayenne.modeler.toolkit.AppDialog;
 
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import java.awt.BorderLayout;
-import java.awt.Container;
-import java.awt.FlowLayout;
-import java.awt.Window;
+import javax.swing.*;
+import java.awt.*;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -97,7 +90,7 @@ public class EntitySyncDialog extends AppDialog {
         try {
             namingStrategy = 
NameGeneratorPreferences.getInstance().createNamingStrategy(app);
         } catch (Throwable e) {
-            namingStrategy = new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance());
+            namingStrategy = new DefaultObjectNameGenerator();
         }
 
         // TODO: Modeler-controlled defaults for all the hardcoded boolean 
flags here.

Reply via email to