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 <[email protected]> Authored: Tue Nov 8 11:37:00 2016 +0300 Committer: Andrus Adamchik <[email protected]> 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);
