You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/11/08 10:47:46 UTC

[1/2] cayenne git commit: CAY-2130 Stripping common name prefixes on reverse engineering

Repository: cayenne
Updated Branches:
  refs/heads/master 3c79d4ad8 -> 88613547f


CAY-2130 Stripping common name prefixes on reverse engineering


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/f3a4a582
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/f3a4a582
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/f3a4a582

Branch: refs/heads/master
Commit: f3a4a58256cf619e5aa4b5538a688f4c1c185215
Parents: 3c79d4a
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Tue Nov 8 11:37:00 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Nov 8 12:02:16 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/MergerContext.java     |  3 +-
 .../dbsync/naming/DbEntityNameStemmer.java      | 29 +++++++++++++++
 .../naming/DefaultObjectNameGenerator.java      | 26 +++++++++----
 .../cayenne/dbsync/naming/NoStemStemmer.java    | 39 ++++++++++++++++++++
 .../cayenne/dbsync/naming/PatternStemmer.java   | 38 +++++++++++++++++++
 .../dbsync/merge/EntityMergeSupportIT.java      |  4 +-
 .../apache/cayenne/dbsync/merge/MergeCase.java  |  3 +-
 .../naming/DefaultObjectNameGeneratorTest.java  |  3 +-
 .../cayenne/dbsync/reverse/db/DbLoaderIT.java   |  3 +-
 .../apache/cayenne/tools/DbImporterTask.java    |  7 ++++
 .../tools/dbimport/DbImportConfiguration.java   | 29 ++++++++++++---
 .../tools/dbimport/DefaultDbImportAction.java   | 22 ++++++++---
 .../dbimport/DefaultDbImportActionTest.java     | 11 ++++--
 .../dbimport/ManyToManyCandidateEntityTest.java |  4 +-
 .../modeler/action/CreateObjEntityAction.java   |  6 ++-
 .../modeler/dialog/db/DbLoaderHelper.java       |  2 +-
 .../modeler/dialog/db/MergerOptions.java        |  3 +-
 .../dialog/db/ModelerDbImportAction.java        | 11 ++++--
 .../modeler/util/NameGeneratorPreferences.java  |  3 +-
 .../apache/cayenne/tools/DbImporterMojo.java    |  8 ++++
 20 files changed, 217 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java
index b5b6a2a..c69252a 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerContext.java
@@ -23,6 +23,7 @@ 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.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.validation.ValidationResult;
@@ -119,7 +120,7 @@ public class MergerContext {
             }
 
             if(context.nameGenerator == null) {
-                context.nameGenerator = new DefaultObjectNameGenerator();
+                context.nameGenerator = new DefaultObjectNameGenerator(NoStemStemmer.getInstance());
             }
 
             if(meaningfulPKsFilter == null) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DbEntityNameStemmer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..8c1c4e7
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DbEntityNameStemmer.java
@@ -0,0 +1,29 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ */
+package org.apache.cayenne.dbsync.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);
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGenerator.java
----------------------------------------------------------------------
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 5f98252..ecfebc3 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,6 +36,11 @@ import java.util.Objects;
  */
 public class DefaultObjectNameGenerator implements ObjectNameGenerator {
 
+    private DbEntityNameStemmer dbEntityNameStemmer;
+
+    public DefaultObjectNameGenerator(DbEntityNameStemmer dbEntityNameStemmer) {
+        this.dbEntityNameStemmer = dbEntityNameStemmer;
+    }
 
     @Override
     public String relationshipName(DbRelationship... relationshipChain) {
@@ -56,8 +61,8 @@ public class DefaultObjectNameGenerator implements ObjectNameGenerator {
 
     protected boolean isToMany(DbRelationship... relationshipChain) {
 
-        for(DbRelationship r : relationshipChain) {
-            if(r.isToMany()) {
+        for (DbRelationship r : relationshipChain) {
+            if (r.isToMany()) {
                 return true;
             }
         }
@@ -65,19 +70,25 @@ public class DefaultObjectNameGenerator implements ObjectNameGenerator {
         return false;
     }
 
+    protected String stemmed(String dbEntityName) {
+        return dbEntityNameStemmer.stem(Objects.requireNonNull(dbEntityName));
+    }
+
     protected String toManyRelationshipName(DbRelationship... relationshipChain) {
 
         DbRelationship last = relationshipChain[relationshipChain.length - 1];
 
+        String baseName = stemmed(last.getTargetEntityName());
+
         try {
             // by default we use English rules here...
-            return Noun.pluralOf(last.getTargetEntityName().toLowerCase(), Locale.ENGLISH);
+            return Noun.pluralOf(baseName.toLowerCase(), Locale.ENGLISH);
         } catch (Exception inflectorError) {
             //  seems that Inflector cannot be trusted. For instance, it
             // throws an exception when invoked for word "ADDRESS" (although
             // lower case works fine). To feel safe, we use superclass'
             // behavior if something's gone wrong
-            return last.getTargetEntityName();
+            return baseName;
         }
     }
 
@@ -98,19 +109,20 @@ public class DefaultObjectNameGenerator implements ObjectNameGenerator {
         // return the name of the FK column sans ID
         String fkColName = join1.getSourceName();
         if (fkColName == null) {
-            return Objects.requireNonNull(last.getTargetEntityName());
+            return stemmed(last.getTargetEntityName());
         } 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 Objects.requireNonNull(last.getTargetEntityName());
+            return stemmed(last.getTargetEntityName());
         }
     }
 
     @Override
     public String objEntityName(DbEntity dbEntity) {
-        return Util.underscoredToJava(dbEntity.getName(), true);
+        String baseName = stemmed(dbEntity.getName());
+        return Util.underscoredToJava(baseName, true);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NoStemStemmer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..eab087a
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NoStemStemmer.java
@@ -0,0 +1,39 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ */
+package org.apache.cayenne.dbsync.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;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..547d4db
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
@@ -0,0 +1,38 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ */
+package org.apache.cayenne.dbsync.naming;
+
+/**
+ * @since 4.0
+ */
+public class PatternStemmer implements DbEntityNameStemmer {
+
+    private String stripPattern;
+
+    public PatternStemmer(String stripPattern) {
+        this.stripPattern = stripPattern;
+    }
+
+    @Override
+    public String stem(String dbEntityName) {
+        throw new UnsupportedOperationException("TODO");
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/EntityMergeSupportIT.java
index 6f25e31..30e1a4b 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
@@ -20,6 +20,7 @@ package org.apache.cayenne.dbsync.merge;
 
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 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;
@@ -88,7 +89,8 @@ public class EntityMergeSupportIT extends MergeCase {
 		objEntity2.setDbEntity(dbEntity2);
 		map.addObjEntity(objEntity2);
 
-		EntityMergeSupport entityMergeSupport = new EntityMergeSupport(new DefaultObjectNameGenerator(),
+		EntityMergeSupport entityMergeSupport = new EntityMergeSupport(
+				new DefaultObjectNameGenerator(NoStemStemmer.getInstance()),
 				NamePatternMatcher.EXCLUDE_ALL,
 				true,
 				true);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
----------------------------------------------------------------------
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 0f4f1b1..ab1e97e 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
@@ -25,6 +25,7 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
@@ -112,7 +113,7 @@ public abstract class MergeCase extends DbSyncCase {
             new DbLoader(conn,
                     node.getAdapter(),
                     new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
-                    new DefaultObjectNameGenerator())
+                    new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
                     .load(dbImport, loaderConfiguration);
 
         } catch (SQLException e) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/DefaultObjectNameGeneratorTest.java
----------------------------------------------------------------------
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 9bf5fee..7a7cc3c 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,8 +28,7 @@ import static org.junit.Assert.assertEquals;
 
 public class DefaultObjectNameGeneratorTest {
 
-    private DefaultObjectNameGenerator generator = new DefaultObjectNameGenerator();
-
+    private DefaultObjectNameGenerator generator = new DefaultObjectNameGenerator(NoStemStemmer.getInstance());
 
     private DbRelationship makeRelationship(String srcEntity, String srcKey, String targetEntity, String targetKey,
                                             boolean toMany) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
index e9feeff..cf154b8 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/db/DbLoaderIT.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
@@ -92,7 +93,7 @@ public class DbLoaderIT extends ServerCase {
     }
 
     private DbLoader createDbLoader(boolean meaningfulPK, boolean meaningfulFK) {
-        return new DbLoader(connection, adapter, null, new DefaultObjectNameGenerator());
+        return new DbLoader(connection, adapter, null, new DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index d7e04ec..d9bdd5e 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -197,6 +197,13 @@ public class DbImporterTask extends Task {
         config.setNamingStrategy(namingStrategy);
     }
 
+    /**
+     * @since 4.0
+     */
+    public void setStripFromTableNames(String pattern) {
+        config.setStripFromTableNames(pattern);
+    }
+
     public void setAdapter(String adapter) {
         config.setAdapter(adapter);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index ebc01e0..63dad3a 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -26,8 +26,11 @@ import org.apache.cayenne.dbsync.filter.NameFilter;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
+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.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
@@ -54,12 +57,21 @@ public class DbImportConfiguration {
     private boolean usePrimitives;
     private Log logger;
     private String namingStrategy;
+    private String stripFromTableNames;
 
     public DbImportConfiguration() {
         this.dataSourceInfo = new DataSourceInfo();
         this.dbLoaderConfiguration = new DbLoaderConfiguration();
     }
 
+    public String getStripFromTableNames() {
+        return stripFromTableNames;
+    }
+
+    public void setStripFromTableNames(String stripFromTableNames) {
+        this.stripFromTableNames = stripFromTableNames;
+    }
+
     public Log getLogger() {
         return logger;
     }
@@ -148,13 +160,14 @@ public class DbImportConfiguration {
     }
 
     public ObjectNameGenerator createNameGenerator() {
-
-        // TODO: load via DI AdhocObjectFactory
-
+        
         // TODO: not a singleton; called from different places...
 
+        // custom name generator
+        // TODO: support stemmer in non-standard generators...
+        // TODO: load via DI AdhocObjectFactory
         String namingStrategy = getNamingStrategy();
-        if (namingStrategy != null) {
+        if (namingStrategy != null && !namingStrategy.equals(DefaultObjectNameGenerator.class.getName())) {
             try {
                 return (ObjectNameGenerator) Class.forName(namingStrategy).newInstance();
             } catch (Exception e) {
@@ -162,7 +175,13 @@ public class DbImportConfiguration {
             }
         }
 
-        return new DefaultObjectNameGenerator();
+        return new DefaultObjectNameGenerator(createStemmer());
+    }
+
+    protected DbEntityNameStemmer createStemmer() {
+        return (stripFromTableNames == null || stripFromTableNames.length() == 0)
+                ? NoStemStemmer.getInstance()
+                : new PatternStemmer(stripFromTableNames);
     }
 
     public String getDriver() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
index e7307de..1ae9533 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DefaultDbImportAction.java
@@ -36,6 +36,7 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
@@ -152,10 +153,11 @@ public class DefaultDbImportAction implements DbImportAction {
         DataNodeDescriptor dataNodeDescriptor = config.createDataNodeDescriptor();
         DataSource dataSource = dataSourceFactory.getDataSource(dataNodeDescriptor);
         DbAdapter adapter = adapterFactory.createAdapter(dataNodeDescriptor, dataSource);
+        ObjectNameGenerator objectNameGenerator = config.createNameGenerator();
 
         DataMap sourceDataMap;
         try (Connection connection = dataSource.getConnection()) {
-            sourceDataMap = load(config, adapter, connection);
+            sourceDataMap = load(config, adapter, connection, objectNameGenerator);
         }
 
         DataMap targetDataMap = existingTargetMap(config);
@@ -184,7 +186,7 @@ public class DefaultDbImportAction implements DbImportAction {
         hasChanges |= applyTokens(config.createMergeDelegate(),
                 targetDataMap,
                 log(sort(reverse(mergerTokenFactory, tokens))),
-                config.createNameGenerator(),
+                objectNameGenerator,
                 config.createMeaningfulPKFilter(),
                 config.isUsePrimitives());
         hasChanges |= syncProcedures(targetDataMap, sourceDataMap, loaderConfig.getFiltersConfig());
@@ -395,13 +397,21 @@ public class DefaultDbImportAction implements DbImportAction {
         projectSaver.save(project);
     }
 
-    protected DataMap load(DbImportConfiguration config, DbAdapter adapter, Connection connection) throws Exception {
+    protected DataMap load(DbImportConfiguration config,
+                           DbAdapter adapter,
+                           Connection connection,
+                           ObjectNameGenerator objectNameGenerator) throws Exception {
+
         DataMap dataMap = new DataMap("_import_source_");
-        createDbLoader(config, adapter, connection).load(dataMap, config.getDbLoaderConfig());
+        createDbLoader(adapter, connection, config.createLoaderDelegate(), objectNameGenerator)
+                .load(dataMap, config.getDbLoaderConfig());
         return dataMap;
     }
 
-    protected DbLoader createDbLoader(DbImportConfiguration config, DbAdapter adapter, Connection connection) {
-        return new DbLoader(connection, adapter, config.createLoaderDelegate(), config.createNameGenerator());
+    protected DbLoader createDbLoader(DbAdapter adapter,
+                                      Connection connection,
+                                      DbLoaderDelegate dbLoaderDelegate,
+                                      ObjectNameGenerator objectNameGenerator) {
+        return new DbLoader(connection, adapter, dbLoaderDelegate, objectNameGenerator);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
index 20ccc1d..34365fc 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DefaultDbImportActionTest.java
@@ -35,6 +35,7 @@ import org.apache.cayenne.dbsync.merge.builders.DataMapBuilder;
 import org.apache.cayenne.dbsync.merge.factory.DefaultMergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 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.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
@@ -124,7 +125,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());
+        when(config.createNameGenerator()).thenReturn(new DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
         when(config.createMeaningfulPKFilter()).thenReturn(NamePatternMatcher.EXCLUDE_ALL);
 
         final boolean[] haveWeTriedToSave = {false};
@@ -166,7 +167,7 @@ public class DefaultDbImportActionTest {
         when(params.getTargetDataMap()).thenReturn(FILE_STUB);
         when(params.createMergeDelegate()).thenReturn(new DefaultModelMergeDelegate());
         when(params.getDbLoaderConfig()).thenReturn(new DbLoaderConfiguration());
-        when(params.createNameGenerator()).thenReturn(new DefaultObjectNameGenerator());
+        when(params.createNameGenerator()).thenReturn(new DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
         when(params.createMeaningfulPKFilter()).thenReturn(NamePatternMatcher.EXCLUDE_ALL);
 
         final boolean[] haveWeTriedToSave = {false};
@@ -288,8 +289,12 @@ public class DefaultDbImportActionTest {
         when(mergerTokenFactoryProvider.get(any(DbAdapter.class))).thenReturn(new DefaultMergerTokenFactory());
 
         return new DefaultDbImportAction(log, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider) {
+
             @Override
-            protected DbLoader createDbLoader(DbImportConfiguration config, DbAdapter adapter, Connection connection) {
+            protected DbLoader createDbLoader(DbAdapter adapter,
+                                              Connection connection,
+                                              DbLoaderDelegate dbLoaderDelegate,
+                                              ObjectNameGenerator objectNameGenerator) {
                 return dbLoader;
             }
         };

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/ManyToManyCandidateEntityTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/ManyToManyCandidateEntityTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/ManyToManyCandidateEntityTest.java
index b9632f8..297dd14 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/ManyToManyCandidateEntityTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/ManyToManyCandidateEntityTest.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
 import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.XMLDataMapLoader;
 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.Binder;
 import org.apache.cayenne.di.ClassLoaderManager;
@@ -96,7 +97,8 @@ public class ManyToManyCandidateEntityTest {
     public void testOptimisationForManyToManyEntity() {
         ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
 
-        ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(new DefaultObjectNameGenerator());
+        ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(
+                new DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
 
         ObjEntity table1Entity = map.getObjEntity("Table1");
         ObjEntity table2Entity = map.getObjEntity("Table2");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
index eb084fc..49940df 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.merge.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.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
@@ -94,7 +95,7 @@ public class CreateObjEntityAction extends CayenneAction {
             entity.setDbEntity(dbEntity);
 
             // TODO: use injectable name generator
-            String baseName = new DefaultObjectNameGenerator().objEntityName(dbEntity);
+            String baseName = new DefaultObjectNameGenerator(NoStemStemmer.getInstance()).objEntityName(dbEntity);
             entity.setName(NameBuilder
                     .builder(entity, dbEntity.getDataMap())
                     .baseName(baseName)
@@ -111,7 +112,8 @@ public class CreateObjEntityAction extends CayenneAction {
         dataMap.addObjEntity(entity);
 
         // TODO: Modeler-controlled defaults for all the hardcoded boolean flags here.
-        EntityMergeSupport merger = new EntityMergeSupport(new DefaultObjectNameGenerator(), NamePatternMatcher.EXCLUDE_ALL, true, true);
+        EntityMergeSupport merger = new EntityMergeSupport(new DefaultObjectNameGenerator(NoStemStemmer.getInstance()),
+                NamePatternMatcher.EXCLUDE_ALL, true, true);
         merger.addEntityMergeListener(DeleteRuleUpdater.getEntityMergeListener());
         merger.synchronizeWithDbEntity(entity);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
index 4b63ccb..b736eac 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
@@ -189,7 +189,7 @@ public class DbLoaderHelper {
 
         config.setMeaningfulPkTables(dialog.getMeaningfulPk());
         config.setNamingStrategy(dialog.getNamingStrategy());
-        
+
         new LoadDataMapTask(Application.getFrame(), "Reengineering DB", reverseEngineering).startAndWait();
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
index 4ee133c..2608aba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
@@ -32,6 +32,7 @@ import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
 import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
@@ -183,7 +184,7 @@ public class MergerOptions extends CayenneController {
                 new DbLoader(conn,
                         adapter,
                         new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
-                        new DefaultObjectNameGenerator())
+                        new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
                         .load(dbImport, config);
 
             } catch (SQLException e) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
index 24cc4b2..1b271bb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
@@ -22,7 +22,9 @@ import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.MapLoader;
 import org.apache.cayenne.project.ProjectSaver;
@@ -55,10 +57,11 @@ public class ModelerDbImportAction extends DefaultDbImportAction {
     }
 
     @Override
-    protected DataMap load(DbImportConfiguration config, DbAdapter adapter, Connection connection) throws Exception {
-        DataMap dataMap = new DataMap();
-        dbLoader.load(dataMap, config.getDbLoaderConfig());
-        return dataMap;
+    protected DbLoader createDbLoader(DbAdapter adapter,
+                                      Connection connection,
+                                      DbLoaderDelegate dbLoaderDelegate,
+                                      ObjectNameGenerator objectNameGenerator) {
+        return dbLoader;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
index 92ed76c..65b2f74 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
@@ -19,6 +19,7 @@
 package org.apache.cayenne.modeler.util;
 
 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.modeler.Application;
 
@@ -98,6 +99,6 @@ public class NameGeneratorPreferences {
     }
 
     public static ObjectNameGenerator defaultNameGenerator() {
-        return new DefaultObjectNameGenerator();
+        return new DefaultObjectNameGenerator(NoStemStemmer.getInstance());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f3a4a582/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index 94bd170..3ba39f3 100644
--- a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -118,6 +118,13 @@ public class DbImporterMojo extends AbstractMojo {
      */
     private ReverseEngineering reverseEngineering = new ReverseEngineering();
 
+    /**
+     * A regular expression that should match the part of the table name to strip before generating DB names.
+     *
+     * @parameter stripFromTableNames="stripFromTableNames"
+     * default-value=""
+     */
+    private String stripFromTableNames;
 
     /**
      * JDBC connection URL of a target database.
@@ -196,6 +203,7 @@ public class DbImporterMojo extends AbstractMojo {
         config.setTargetDataMap(map);
         config.setMeaningfulPkTables(meaningfulPkTables);
         config.setNamingStrategy(namingStrategy);
+        config.setStripFromTableNames(stripFromTableNames);
         config.setPassword(password);
         config.setUrl(url);
         config.setUsername(username);


[2/2] cayenne git commit: CAY-2130 Stripping common name prefixes on reverse engineering

Posted by aa...@apache.org.
CAY-2130 Stripping common name prefixes on reverse engineering

* unit tests


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/88613547
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/88613547
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/88613547

Branch: refs/heads/master
Commit: 88613547fc7bdabfc24f77632ca44f6bd68b4274
Parents: f3a4a58
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Tue Nov 8 11:37:00 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Nov 8 13:46:50 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/naming/PatternStemmer.java   | 20 +++++--
 .../dbsync/naming/PatternStemmerTest.java       | 61 ++++++++++++++++++++
 .../tools/dbimport/DbImportConfiguration.java   |  4 +-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  1 +
 .../testCustomObjectLayerSettings-pom.xml       |  1 +
 ...testCustomObjectLayerSettings.map.xml-result |  6 ++
 .../dbimport/testCustomObjectLayerSettings.sql  |  5 ++
 7 files changed, 90 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/PatternStemmer.java
----------------------------------------------------------------------
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 547d4db..0db0e3d 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
@@ -18,21 +18,29 @@
  */
 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 String stripPattern;
+    private Pattern pattern;
+
+    public PatternStemmer(String stripPattern, boolean caseSensitive) {
+
+        int flags = 0;
+        if (!caseSensitive) {
+            flags = flags | Pattern.CASE_INSENSITIVE;
+        }
 
-    public PatternStemmer(String stripPattern) {
-        this.stripPattern = stripPattern;
+        this.pattern = Pattern.compile(stripPattern, flags);
     }
 
     @Override
     public String stem(String dbEntityName) {
-        throw new UnsupportedOperationException("TODO");
+        Matcher m = pattern.matcher(dbEntityName);
+        return m.replaceAll("");
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternStemmerTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f605745
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/PatternStemmerTest.java
@@ -0,0 +1,61 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ */
+package org.apache.cayenne.dbsync.naming;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class PatternStemmerTest {
+
+    @Test
+    public void testStemNoMatch() {
+        assertEquals("xyzabc", new PatternStemmer("^pre", false).stem("xyzabc"));
+    }
+
+    @Test
+    public void testStemCaseSensitive() {
+        assertEquals("PREUPPERCASE", new PatternStemmer("^pre", true).stem("PREUPPERCASE"));
+        assertEquals("UPPERCASE", new PatternStemmer("^pre", true).stem("preUPPERCASE"));
+    }
+
+    @Test
+    public void testStemCaseInsensitive() {
+        assertEquals("lowercase", new PatternStemmer("^pre", false).stem("prelowercase"));
+        assertEquals("UPPERCASE", new PatternStemmer("^pre", false).stem("PREUPPERCASE"));
+    }
+
+    @Test
+    public void testStemHead() {
+        assertEquals("name", new PatternStemmer("^strip_", false).stem("strip_name"));
+        assertEquals("strip_name", new PatternStemmer("^strip_", false).stem("strip_strip_name"));
+    }
+
+    @Test
+    public void testStemTail() {
+        assertEquals("name", new PatternStemmer("_strip$", false).stem("name_strip"));
+        assertEquals("name_strip", new PatternStemmer("_strip$", false).stem("name_strip_strip"));
+    }
+
+    @Test
+    public void testStemMiddle() {
+        assertEquals("start_end", new PatternStemmer("_strip", false).stem("start_strip_end"));
+        assertEquals("start_end", new PatternStemmer("_strip", false).stem("start_strip_strip_end"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index 63dad3a..9bf4ed1 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -160,7 +160,7 @@ public class DbImportConfiguration {
     }
 
     public ObjectNameGenerator createNameGenerator() {
-        
+
         // TODO: not a singleton; called from different places...
 
         // custom name generator
@@ -181,7 +181,7 @@ public class DbImportConfiguration {
     protected DbEntityNameStemmer createStemmer() {
         return (stripFromTableNames == null || stripFromTableNames.length() == 0)
                 ? NoStemStemmer.getInstance()
-                : new PatternStemmer(stripFromTableNames);
+                : new PatternStemmer(stripFromTableNames, false);
     }
 
     public String getDriver() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index bc626be..bb9c6f3 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -37,6 +37,7 @@ CAY-2115 DbLoader - allow loading DataMap without Obj layer
 CAY-2116 Split schema synchronization code in a separate module
 CAY-2118 cdbimport: drop support for the old style of table filtering
 CAY-2129 Modeler: reengineer dialog improvements
+CAY-2130 Stripping common name prefixes on reverse engineering
 CAY-2132 Adding SybaseSelectTranslator to support TOP/DISTINCT TOP in limited queries
 CAY-2133 ObjectNameGenerator refactoring - unifying relationship name generation
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings-pom.xml
index b57d42e..47ca90d 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings-pom.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings-pom.xml
@@ -34,6 +34,7 @@
                     <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
                     <meaningfulPkTables>^*$</meaningfulPkTables>
                     <usePrimitives>true</usePrimitives>
+                    <stripFromTableNames>^xyz_</stripFromTableNames>
 
                     <reverseEngineering>
                         <schema>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.map.xml-result
index aa301db..9f36c0f 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.map.xml-result
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.map.xml-result
@@ -30,6 +30,9 @@
     	<db-attribute name="COL2" type="INTEGER" length="10"/>
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
     </db-entity>
+    <db-entity name="XYZ_PREFIXED_NEW_TABLE" schema="SCHEMA_01">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
     <obj-entity name="ExistingTable" className="ExistingTable" dbEntityName="EXISTING_TABLE">
     	 <obj-attribute name="col2" type="int" db-attribute-path="COL2"/>
     </obj-entity>
@@ -37,4 +40,7 @@
     	 <obj-attribute name="col2" type="int" db-attribute-path="COL2"/>
     	 <obj-attribute name="id" type="int" db-attribute-path="ID"/>
     </obj-entity>
+    <obj-entity name="PrefixedNewTable" className="PrefixedNewTable" dbEntityName="XYZ_PREFIXED_NEW_TABLE">
+        <obj-attribute name="id" type="int" db-attribute-path="ID"/>
+    </obj-entity>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/88613547/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.sql
index f8f4192..fe9ccd5 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.sql
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testCustomObjectLayerSettings.sql
@@ -28,4 +28,9 @@ CREATE TABLE schema_01.existing_table (
   id INTEGER NOT NULL,
   COL2 INTEGER,
   PRIMARY KEY (id)
+ );
+
+CREATE TABLE schema_01.xyz_prefixed_new_table (
+  id INTEGER NOT NULL,
+  PRIMARY KEY (id)
  );
\ No newline at end of file