You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/04/24 11:07:45 UTC
[cayenne] 02/03: CAY-2569 Custom 'Naming Strategy' in Cayenne
Modeler
This is an automated email from the ASF dual-hosted git repository.
abulatski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 9fa1eb94cb598459a69256cd61dddfd65d4b32b2
Author: Arseni Bulatski <an...@gmail.com>
AuthorDate: Wed Apr 24 13:57:15 2019 +0300
CAY-2569 Custom 'Naming Strategy' in Cayenne Modeler
---
.../tools/utils/CustomObjectNameGenerator.java | 3 -
.../cayenne/stubs/CustomObjectNameGenerator.java | 83 +---------------------
.../apache/cayenne/tools/DbImporterMojoTest.java | 35 +++++----
.../tools/dbimport/testDefaultPackage-pom.xml | 1 -
...tPackage-pom.xml => testNamingStrategy-pom.xml} | 40 +++++------
.../dbimport/testNamingStrategy.map.xml-result | 31 ++++++++
.../cayenne/tools/dbimport/testNamingStrategy.sql | 22 ++++++
7 files changed, 94 insertions(+), 121 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 8305c19..4b3336b 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
@@ -33,9 +33,6 @@ import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.util.Util;
import org.jvnet.inflector.Noun;
-/**
- * @since 4.2
- */
public class CustomObjectNameGenerator implements ObjectNameGenerator {
private DbEntityNameStemmer dbEntityNameStemmer;
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
index 55f51f6..375cf83 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/stubs/CustomObjectNameGenerator.java
@@ -19,8 +19,6 @@
package org.apache.cayenne.stubs;
-import java.util.List;
-import java.util.Locale;
import java.util.Objects;
import org.apache.cayenne.dbsync.naming.DbEntityNameStemmer;
@@ -28,14 +26,9 @@ 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;
-import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.util.Util;
-import org.jvnet.inflector.Noun;
-/**
- * @since 4.2
- */
public class CustomObjectNameGenerator implements ObjectNameGenerator {
private DbEntityNameStemmer dbEntityNameStemmer;
@@ -50,91 +43,21 @@ public class CustomObjectNameGenerator implements ObjectNameGenerator {
@Override
public String relationshipName(DbRelationship... relationshipChain) {
-
- if (relationshipChain == null || relationshipChain.length < 1) {
- throw new IllegalArgumentException("At least on relationship is expected: " + relationshipChain);
- }
-
- // ignore the name of DbRelationship itself (FWIW we may be generating a new name for it here)...
- // generate the name based on join semantics...
-
- String name = isToMany(relationshipChain)
- ? toManyRelationshipName(relationshipChain)
- : toOneRelationshipName(relationshipChain);
-
- return Util.underscoredToJava(name, false);
- }
-
- protected boolean isToMany(DbRelationship... relationshipChain) {
-
- for (DbRelationship r : relationshipChain) {
- if (r.isToMany()) {
- return true;
- }
- }
-
- return false;
+ return null;
}
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(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 baseName;
- }
- }
-
- protected String toOneRelationshipName(DbRelationship... relationshipChain) {
-
- DbRelationship first = relationshipChain[0];
- DbRelationship last = relationshipChain[relationshipChain.length - 1];
-
- List<DbJoin> joins = first.getJoins();
- if (joins.isEmpty()) {
- // In case, when uses EditRelationship button, relationship doesn't exist => it doesn't have joins
- // and just return targetName
- return stemmed(last.getTargetEntityName());
- }
-
- DbJoin join1 = joins.get(0);
-
- // TODO: multi-join relationships
-
- // return the name of the FK column sans ID
- String fkColName = join1.getSourceName();
- if (fkColName == null) {
- 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 stemmed(last.getTargetEntityName());
- }
- }
-
@Override
public String objEntityName(DbEntity dbEntity) {
String baseName = stemmed(dbEntity.getName());
- return Util.underscoredToJava(baseName, true);
+ return "Custom" + Util.underscoredToJava(baseName, true);
}
@Override
public String objAttributeName(DbAttribute attr) {
- return Util.underscoredToJava(attr.getName(), false);
+ return "custom_" + Util.underscoredToJava(attr.getName(), false);
}
}
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
index dd0e81a..a836910 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
@@ -18,6 +18,18 @@
****************************************************************/
package org.apache.cayenne.tools;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Iterator;
+import java.util.Objects;
+
import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
@@ -26,12 +38,11 @@ import org.apache.cayenne.test.jdbc.SQLReader;
import org.apache.cayenne.test.resource.ResourceUtil;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingRequest;
-import org.slf4j.Logger;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.codehaus.plexus.util.FileUtils;
import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Diff;
@@ -41,18 +52,7 @@ import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Iterator;
-import java.util.Objects;
+import org.slf4j.Logger;
import static org.apache.cayenne.util.Util.isBlank;
import static org.mockito.Mockito.mock;
@@ -178,6 +178,11 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
test("testExcludeRelationshipFirst");
}
+ @Test
+ public void testNamingStrategy() throws Exception {
+ test("testNamingStrategy");
+ }
+
/**
* Q: what happens if an attribute or relationship is unmapped in the object layer, but then the underlying table
* changes.
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
index f8bcebb..b4bc513 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
@@ -42,7 +42,6 @@
<dbimport>
<defaultPackage>com.example.test</defaultPackage>
<schema>SCHEMA_01</schema>
- <namingStrategy>org.apache.cayenne.stubs.CustomObjectNameGenerator</namingStrategy>
</dbimport>
<project implementation="org.apache.cayenne.stubs.CayenneProjectStub"/>
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy-pom.xml
similarity index 55%
copy from maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
copy to maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy-pom.xml
index f8bcebb..0cbf06b 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDefaultPackage-pom.xml
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy-pom.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- ~ 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.
- -->
+ 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.
+-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
@@ -32,16 +32,12 @@
<plugin>
<artifactId>cayenne-maven-plugin</artifactId>
<configuration>
- <map>target/test-classes/org/apache/cayenne/tools/dbimport/testDefaultPackage.map.xml</map>
-
+ <map>target/test-classes/org/apache/cayenne/tools/dbimport/testNamingStrategy.map.xml</map>
<dataSource>
<driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
<url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
</dataSource>
-
<dbimport>
- <defaultPackage>com.example.test</defaultPackage>
- <schema>SCHEMA_01</schema>
<namingStrategy>org.apache.cayenne.stubs.CustomObjectNameGenerator</namingStrategy>
</dbimport>
<project implementation="org.apache.cayenne.stubs.CayenneProjectStub"/>
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy.map.xml-result b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy.map.xml-result
new file mode 100644
index 0000000..e5f3c2a
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy.map.xml-result
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+ project-version="10">
+ <db-entity name="TEST_TABLE" schema="APP">
+ <db-attribute name="COL1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ <db-attribute name="COL2" type="CHAR" length="25"/>
+ </db-entity>
+ <obj-entity name="CustomTestTable" className="CustomTestTable" dbEntityName="TEST_TABLE">
+ <obj-attribute name="custom_col2" type="java.lang.String" db-attribute-path="COL2"/>
+ </obj-entity>
+</data-map>
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy.sql b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy.sql
new file mode 100644
index 0000000..11d3433
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testNamingStrategy.sql
@@ -0,0 +1,22 @@
+-- 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.
+
+CREATE TABLE TEST_TABLE (
+ COL1 INTEGER NOT NULL,
+ COL2 CHAR(25),
+ PRIMARY KEY (COL1)
+)
\ No newline at end of file