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/09/30 18:04:57 UTC

[1/5] cayenne git commit: CAY-2116 Split schema synchronization code in a separate module

Repository: cayenne
Updated Branches:
  refs/heads/master fc27ef7ae -> ad9447556


CAY-2116 Split schema synchronization code in a separate module


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

Branch: refs/heads/master
Commit: 3e03bc1155555a364b3acec06442442d760c1048
Parents: fc27ef7
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 17:34:49 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 17:53:47 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/reverse/db/DbLoader.java     |   1 -
 .../cayenne/dbsync/reverse/db/ExportedKey.java  | 270 +++++++++++++++++++
 .../reverse/db/ManyToManyCandidateEntity.java   |   1 -
 .../naming/DefaultObjectNameGenerator.java      |   2 +-
 .../naming/LegacyObjectNameGenerator.java       |   2 +-
 .../reverse/naming/ObjectNameGenerator.java     |   2 +-
 .../naming/DefaultObjectNameGeneratorTest.java  |   2 +-
 .../naming/LegacyObjectNameGeneratorTest.java   |   3 +-
 .../apache/cayenne/map/naming/ExportedKey.java  | 270 -------------------
 .../InferRelationshipsControllerBase.java       |   2 +-
 .../dialog/objentity/ObjRelationshipInfo.java   |   2 +-
 11 files changed, 277 insertions(+), 280 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
index a522ab2..2811981 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
-import org.apache.cayenne.map.naming.ExportedKey;
 import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ExportedKey.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ExportedKey.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ExportedKey.java
new file mode 100644
index 0000000..080d6c4
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ExportedKey.java
@@ -0,0 +1,270 @@
+/*****************************************************************
+ *   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.reverse.db;
+
+import org.apache.cayenne.util.EqualsBuilder;
+import org.apache.cayenne.util.HashCodeBuilder;
+import org.apache.commons.lang.builder.CompareToBuilder;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * ExportedKey is an representation of relationship between two tables 
+ * in database. It can be used for creating names for relationships
+ *
+ * Example:
+ *  Table A with primary key ID
+ *  Table B with primary key ID and foreign key A_ID
+ *
+ *  In that case ExportedKey will be:
+ *      pkTable:  A
+ *      pkColumn: A.ID
+ *      fkTable:  B
+ *      fkColumn: B.A_ID
+ *      fkName:   name of foreign key
+ *      pkName:
+ *      keySeq: TODO
+ * 
+ */
+public class ExportedKey implements Comparable {
+
+    public final String pkCatalog;
+    public final String pkSchema;
+    /**
+     * Name of source table
+     */
+    public final String pkTable;
+
+    /**
+     * Name of source column
+     */
+    public final String pkColumn;
+
+    public final String fkCatalog;
+    public final String fkSchema;
+    /**
+     * Name of destination table
+     */
+    public final String fkTable;
+    
+    /**
+     * Name of destination column
+     */
+    public final String fkColumn;
+    
+    /**
+     * Name of foreign key (might be null)
+     */
+    public final String fkName;
+
+    /**
+     * Name of primary key (might be null)
+     */
+    public final String pkName;
+
+
+    public final short keySeq;
+
+    public ExportedKey(String pkTable, String pkColumn, String pkName,
+                       String fkTable, String fkColumn, String fkName, short keySeq) {
+        this(null, null, pkTable, pkColumn, pkName, null, null, fkTable, fkColumn, fkName, keySeq);
+    }
+
+    public ExportedKey(String pkCatalog, String pkSchema, String pkTable, String pkColumn, String pkName,
+                       String fkCatalog, String fkSchema, String fkTable, String fkColumn, String fkName, short keySeq) {
+       this.pkCatalog  = pkCatalog;
+       this.pkSchema  = pkSchema;
+       this.pkTable  = pkTable;
+       this.pkColumn = pkColumn;
+       this.pkName   = pkName;
+       this.fkCatalog  = fkCatalog;
+       this.fkSchema  = fkSchema;
+       this.fkTable  = fkTable;
+       this.fkColumn = fkColumn;
+       this.fkName   = fkName;
+       this.keySeq = keySeq;
+    }
+    
+    /**
+     * Extracts data from a resultset pointing to a exported key to
+     * ExportedKey class instance
+     * 
+     * @param rs ResultSet pointing to a exported key, fetched using
+     * DataBaseMetaData.getExportedKeys(...) 
+     */
+    public static ExportedKey extractData(ResultSet rs) throws SQLException {
+        return new ExportedKey(
+                rs.getString("PKTABLE_CAT"),
+                rs.getString("PKTABLE_SCHEM"),
+                rs.getString("PKTABLE_NAME"),
+                rs.getString("PKCOLUMN_NAME"),
+                rs.getString("PK_NAME"),
+                rs.getString("FKTABLE_CAT"),
+                rs.getString("FKTABLE_SCHEM"),
+                rs.getString("FKTABLE_NAME"),
+                rs.getString("FKCOLUMN_NAME"),
+                rs.getString("FK_NAME"),
+                rs.getShort("KEY_SEQ")
+        );
+    }
+
+
+    public String getPkCatalog() {
+        return pkCatalog;
+    }
+
+    public String getPkSchema() {
+        return pkSchema;
+    }
+
+    public String getFkCatalog() {
+        return fkCatalog;
+    }
+
+    public String getFkSchema() {
+        return fkSchema;
+    }
+
+    /**
+     * @return source table name
+     */
+    public String getPKTableName() {
+        return pkTable;
+    }
+    
+    /**
+     * @return destination table name
+     */
+    public String getFKTableName() {
+        return fkTable;
+    }
+    
+    /**
+     * @return source column name
+     */
+    public String getPKColumnName() {
+        return pkColumn;
+    }
+    
+    /**
+     * @return destination column name
+     */
+    public String getFKColumnName() {
+        return fkColumn;
+    }
+    
+    /**
+     * @return PK name
+     */
+    public String getPKName() {
+        return pkName;
+    }
+    
+    /**
+     * @return FK name
+     */
+    public String getFKName() {
+        return fkName;
+    }
+
+    public short getKeySeq() {
+        return keySeq;
+    }
+
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (obj.getClass() != getClass()) {
+            return false;
+        }
+        ExportedKey rhs = (ExportedKey) obj;
+        return new EqualsBuilder()
+                .append(this.pkCatalog, rhs.pkCatalog)
+                .append(this.pkSchema, rhs.pkSchema)
+                .append(this.pkTable, rhs.pkTable)
+                .append(this.pkColumn, rhs.pkColumn)
+                .append(this.fkCatalog, rhs.fkCatalog)
+                .append(this.fkSchema, rhs.fkSchema)
+                .append(this.fkTable, rhs.fkTable)
+                .append(this.fkColumn, rhs.fkColumn)
+                .append(this.fkName, rhs.fkName)
+                .append(this.pkName, rhs.pkName)
+                .append(this.keySeq, rhs.keySeq)
+                .isEquals();
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(pkCatalog)
+                .append(pkSchema)
+                .append(pkTable)
+                .append(pkColumn)
+                .append(fkCatalog)
+                .append(fkSchema)
+                .append(fkTable)
+                .append(fkColumn)
+                .append(fkName)
+                .append(pkName)
+                .append(keySeq)
+                .toHashCode();
+    }
+
+    @Override
+    public int compareTo(Object obj) {
+        if (obj == null || !obj.getClass().equals(getClass())) {
+            throw new IllegalArgumentException();
+        }
+        if (obj == this) {
+            return 0;
+        }
+
+        ExportedKey rhs = (ExportedKey) obj;
+        return new CompareToBuilder()
+                .append(pkCatalog, rhs.pkCatalog)
+                .append(pkSchema, rhs.pkSchema)
+                .append(pkTable, rhs.pkTable)
+                .append(pkName, rhs.pkName)
+                .append(fkCatalog, rhs.fkCatalog)
+                .append(fkSchema, rhs.fkSchema)
+                .append(fkTable, rhs.fkTable)
+                .append(fkName, rhs.fkName)
+                .append(keySeq, rhs.keySeq)
+                .append(pkColumn, rhs.pkColumn)
+                .append(fkColumn, rhs.fkColumn)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return getStrKey() + " # " + keySeq;
+    }
+
+    public String getStrKey() {
+        return pkCatalog + "." + pkSchema + "." + pkTable + "." + pkColumn
+                + " <- " + fkCatalog + "." + fkSchema + "." + fkTable + "." + fkColumn;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
index e912ab1..718015b 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
@@ -22,7 +22,6 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
-import org.apache.cayenne.map.naming.ExportedKey;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.commons.logging.Log;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
index a2ec096..8cb59db 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.reverse.naming;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.apache.cayenne.map.naming.NameConverter;
 import org.jvnet.inflector.Noun;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
index 11ac007..47e7ea5 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.reverse.naming;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.apache.cayenne.map.naming.NameConverter;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/ObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/ObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/ObjectNameGenerator.java
index 8922190..da45ab3 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/ObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/ObjectNameGenerator.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.reverse.naming;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 
 /**
  * ObjectNameGenerator is a strategy for creating names for entities,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGeneratorTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGeneratorTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGeneratorTest.java
index 0a70fdb..a29c786 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGeneratorTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGeneratorTest.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.reverse.naming;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGeneratorTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGeneratorTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGeneratorTest.java
index 750dcd2..ea4902d 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGeneratorTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGeneratorTest.java
@@ -18,11 +18,10 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.reverse.naming;
 
-import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/cayenne-server/src/main/java/org/apache/cayenne/map/naming/ExportedKey.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/ExportedKey.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/ExportedKey.java
deleted file mode 100644
index 9a415d8..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/ExportedKey.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-import org.apache.cayenne.util.EqualsBuilder;
-import org.apache.cayenne.util.HashCodeBuilder;
-import org.apache.commons.lang.builder.CompareToBuilder;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * ExportedKey is an representation of relationship between two tables 
- * in database. It can be used for creating names for relationships
- *
- * Example:
- *  Table A with primary key ID
- *  Table B with primary key ID and foreign key A_ID
- *
- *  In that case ExportedKey will be:
- *      pkTable:  A
- *      pkColumn: A.ID
- *      fkTable:  B
- *      fkColumn: B.A_ID
- *      fkName:   name of foreign key
- *      pkName:
- *      keySeq: TODO
- * 
- */
-public class ExportedKey implements Comparable {
-
-    public final String pkCatalog;
-    public final String pkSchema;
-    /**
-     * Name of source table
-     */
-    public final String pkTable;
-
-    /**
-     * Name of source column
-     */
-    public final String pkColumn;
-
-    public final String fkCatalog;
-    public final String fkSchema;
-    /**
-     * Name of destination table
-     */
-    public final String fkTable;
-    
-    /**
-     * Name of destination column
-     */
-    public final String fkColumn;
-    
-    /**
-     * Name of foreign key (might be null)
-     */
-    public final String fkName;
-
-    /**
-     * Name of primary key (might be null)
-     */
-    public final String pkName;
-
-
-    public final short keySeq;
-
-    public ExportedKey(String pkTable, String pkColumn, String pkName,
-                       String fkTable, String fkColumn, String fkName, short keySeq) {
-        this(null, null, pkTable, pkColumn, pkName, null, null, fkTable, fkColumn, fkName, keySeq);
-    }
-
-    public ExportedKey(String pkCatalog, String pkSchema, String pkTable, String pkColumn, String pkName,
-                       String fkCatalog, String fkSchema, String fkTable, String fkColumn, String fkName, short keySeq) {
-       this.pkCatalog  = pkCatalog;
-       this.pkSchema  = pkSchema;
-       this.pkTable  = pkTable;
-       this.pkColumn = pkColumn;
-       this.pkName   = pkName;
-       this.fkCatalog  = fkCatalog;
-       this.fkSchema  = fkSchema;
-       this.fkTable  = fkTable;
-       this.fkColumn = fkColumn;
-       this.fkName   = fkName;
-       this.keySeq = keySeq;
-    }
-    
-    /**
-     * Extracts data from a resultset pointing to a exported key to
-     * ExportedKey class instance
-     * 
-     * @param rs ResultSet pointing to a exported key, fetched using
-     * DataBaseMetaData.getExportedKeys(...) 
-     */
-    public static ExportedKey extractData(ResultSet rs) throws SQLException {
-        return new ExportedKey(
-                rs.getString("PKTABLE_CAT"),
-                rs.getString("PKTABLE_SCHEM"),
-                rs.getString("PKTABLE_NAME"),
-                rs.getString("PKCOLUMN_NAME"),
-                rs.getString("PK_NAME"),
-                rs.getString("FKTABLE_CAT"),
-                rs.getString("FKTABLE_SCHEM"),
-                rs.getString("FKTABLE_NAME"),
-                rs.getString("FKCOLUMN_NAME"),
-                rs.getString("FK_NAME"),
-                rs.getShort("KEY_SEQ")
-        );
-    }
-
-
-    public String getPkCatalog() {
-        return pkCatalog;
-    }
-
-    public String getPkSchema() {
-        return pkSchema;
-    }
-
-    public String getFkCatalog() {
-        return fkCatalog;
-    }
-
-    public String getFkSchema() {
-        return fkSchema;
-    }
-
-    /**
-     * @return source table name
-     */
-    public String getPKTableName() {
-        return pkTable;
-    }
-    
-    /**
-     * @return destination table name
-     */
-    public String getFKTableName() {
-        return fkTable;
-    }
-    
-    /**
-     * @return source column name
-     */
-    public String getPKColumnName() {
-        return pkColumn;
-    }
-    
-    /**
-     * @return destination column name
-     */
-    public String getFKColumnName() {
-        return fkColumn;
-    }
-    
-    /**
-     * @return PK name
-     */
-    public String getPKName() {
-        return pkName;
-    }
-    
-    /**
-     * @return FK name
-     */
-    public String getFKName() {
-        return fkName;
-    }
-
-    public short getKeySeq() {
-        return keySeq;
-    }
-
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (obj == this) {
-            return true;
-        }
-        if (obj.getClass() != getClass()) {
-            return false;
-        }
-        ExportedKey rhs = (ExportedKey) obj;
-        return new EqualsBuilder()
-                .append(this.pkCatalog, rhs.pkCatalog)
-                .append(this.pkSchema, rhs.pkSchema)
-                .append(this.pkTable, rhs.pkTable)
-                .append(this.pkColumn, rhs.pkColumn)
-                .append(this.fkCatalog, rhs.fkCatalog)
-                .append(this.fkSchema, rhs.fkSchema)
-                .append(this.fkTable, rhs.fkTable)
-                .append(this.fkColumn, rhs.fkColumn)
-                .append(this.fkName, rhs.fkName)
-                .append(this.pkName, rhs.pkName)
-                .append(this.keySeq, rhs.keySeq)
-                .isEquals();
-    }
-
-    @Override
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(pkCatalog)
-                .append(pkSchema)
-                .append(pkTable)
-                .append(pkColumn)
-                .append(fkCatalog)
-                .append(fkSchema)
-                .append(fkTable)
-                .append(fkColumn)
-                .append(fkName)
-                .append(pkName)
-                .append(keySeq)
-                .toHashCode();
-    }
-
-    @Override
-    public int compareTo(Object obj) {
-        if (obj == null || !obj.getClass().equals(getClass())) {
-            throw new IllegalArgumentException();
-        }
-        if (obj == this) {
-            return 0;
-        }
-
-        ExportedKey rhs = (ExportedKey) obj;
-        return new CompareToBuilder()
-                .append(pkCatalog, rhs.pkCatalog)
-                .append(pkSchema, rhs.pkSchema)
-                .append(pkTable, rhs.pkTable)
-                .append(pkName, rhs.pkName)
-                .append(fkCatalog, rhs.fkCatalog)
-                .append(fkSchema, rhs.fkSchema)
-                .append(fkTable, rhs.fkTable)
-                .append(fkName, rhs.fkName)
-                .append(keySeq, rhs.keySeq)
-                .append(pkColumn, rhs.pkColumn)
-                .append(fkColumn, rhs.fkColumn)
-                .toComparison();
-    }
-
-    @Override
-    public String toString() {
-        return getStrKey() + " # " + keySeq;
-    }
-
-    public String getStrKey() {
-        return pkCatalog + "." + pkSchema + "." + pkTable + "." + pkColumn
-                + " <- " + fkCatalog + "." + fkSchema + "." + fkTable + "." + fkColumn;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
index badde44..3d3ab37 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.commons.collections.Predicate;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3e03bc11/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
index 2b01ce3..11172fb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.map.naming.ExportedKey;
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ClassLoadingService;


[5/5] cayenne git commit: CAY-2116 Split schema synchronization code in a separate module

Posted by aa...@apache.org.
CAY-2116 Split schema synchronization code in a separate module

* more refactoring


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

Branch: refs/heads/master
Commit: ad9447556dd5e12b5e7f94a517bab1df7f50a5d3
Parents: 2df9f66
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 20:45:47 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 20:58:07 2016 +0300

----------------------------------------------------------------------
 .../dbsync/merge/CreateTableToModel.java        |  24 +-
 .../dbsync/merge/EntityMergeSupport.java        |   8 +-
 .../dbsync/naming/DuplicateNameResolver.java    |  68 ++++++
 .../cayenne/dbsync/naming/NameChecker.java      |  36 +++
 .../cayenne/dbsync/naming/NameCheckers.java     | 223 +++++++++++++++++++
 .../cayenne/dbsync/reverse/db/DbLoader.java     |   8 +-
 .../reverse/db/ManyToManyCandidateEntity.java   |   6 +-
 .../naming/DefaultObjectNameGenerator.java      |  11 +-
 .../naming/LegacyObjectNameGenerator.java       |  16 +-
 .../dbsync/reverse/naming/NameConverter.java    | 154 -------------
 .../cayenne/dbsync/naming/NameCheckersTest.java | 204 +++++++++++++++++
 .../reverse/naming/NameConverterTest.java       | 115 ----------
 .../java/org/apache/cayenne/map/ObjEntity.java  |   2 +-
 .../apache/cayenne/map/naming/NameChecker.java  |  36 ---
 .../apache/cayenne/map/naming/NameCheckers.java | 221 ------------------
 .../cayenne/map/naming/UniqueNameGenerator.java |  91 --------
 .../main/java/org/apache/cayenne/util/Util.java | 126 +++++++++--
 .../cayenne/map/naming/NameCheckersTest.java    | 204 -----------------
 .../java/org/apache/cayenne/util/UtilTest.java  |  38 ++++
 .../cayenne/gen/ClientDataMapArtifact.java      |   3 +-
 .../org/apache/cayenne/gen/DataMapArtifact.java |   4 +-
 .../org/apache/cayenne/gen/DataMapUtils.java    |  30 +--
 .../org/apache/cayenne/gen/StringUtils.java     |  23 +-
 .../org/apache/cayenne/gen/StringUtilsTest.java |  49 ++++
 .../modeler/action/CreateAttributeAction.java   |  10 +-
 .../action/CreateCallbackMethodAction.java      |  15 +-
 .../modeler/action/CreateDataMapAction.java     |   6 +-
 .../modeler/action/CreateDbEntityAction.java    |   6 +-
 .../modeler/action/CreateEmbeddableAction.java  |   6 +-
 .../modeler/action/CreateNodeAction.java        |   6 +-
 .../modeler/action/CreateObjEntityAction.java   |  12 +-
 .../modeler/action/CreateProcedureAction.java   |   6 +-
 .../action/CreateProcedureParameterAction.java  |   6 +-
 .../action/CreateRelationshipAction.java        |   8 +-
 .../modeler/action/ImportDataMapAction.java     |   8 +-
 .../modeler/action/ImportEOModelAction.java     |   6 +-
 .../modeler/action/NewProjectAction.java        |   6 +-
 .../cayenne/modeler/action/PasteAction.java     |  40 ++--
 .../action/ReverseEngineeringAction.java        |   8 +-
 .../dialog/ResolveDbRelationshipDialog.java     |   8 +-
 .../modeler/dialog/db/DbLoaderHelper.java       |  10 +-
 .../cayenne/modeler/dialog/query/QueryType.java |   6 +-
 .../cayenne/modeler/editor/CallbackType.java    |  32 +--
 modeler/cayenne-wocompat/pom.xml                |   6 +
 .../cayenne/wocompat/EOModelProcessor.java      |  39 ++--
 45 files changed, 933 insertions(+), 1017 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
index 0997e9b..436a1f5 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
@@ -19,21 +19,22 @@
 package org.apache.cayenne.dbsync.merge;
 
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
+import org.apache.cayenne.dbsync.reverse.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 
 /**
  * A {@link MergerToken} to add a {@link DbEntity} to a {@link DataMap}
- * 
  */
 public class CreateTableToModel extends AbstractToModelToken.Entity {
 
     /**
      * className if {@link ObjEntity} should be generated with a
-     *  special class name.
-     * Setting this to <code>null</code>, because by default class name should be generated 
+     * special class name.
+     * Setting this to <code>null</code>, because by default class name should be generated
      */
     private String objEntityClassName = null; //CayenneDataObject.class.getName();
 
@@ -53,11 +54,18 @@ public class CreateTableToModel extends AbstractToModelToken.Entity {
     }
 
     public void execute(MergerContext mergerContext) {
+        DbEntity dbEntity = getEntity();
+
         DataMap map = mergerContext.getDataMap();
-        map.addDbEntity(getEntity());
+        map.addDbEntity(dbEntity);
 
         // create a ObjEntity
-        String objEntityName = NameConverter.underscoredToJava(getEntity().getName(), true);
+
+        // TODO: proper name generator must be injected
+
+        String objEntityName = new DefaultObjectNameGenerator().createObjEntityName(dbEntity);
+        objEntityName = DuplicateNameResolver.resolve(NameCheckers.objEntity, dbEntity.getDataMap(), objEntityName);
+
         // this loop will terminate even if no valid name is found
         // to prevent loader from looping forever (though such case is very unlikely)
         String baseName = objEntityName;
@@ -77,12 +85,12 @@ public class CreateTableToModel extends AbstractToModelToken.Entity {
 
         objEntity.setClassName(className);
         objEntity.setSuperClassName(map.getDefaultSuperclass());
-        
+
         if (map.isClientSupported()) {
             objEntity.setClientClassName(map.getNameWithDefaultClientPackage(objEntity.getName()));
             objEntity.setClientSuperClassName(map.getDefaultClientSuperclass());
         }
-        
+
         map.addObjEntity(objEntity);
 
         // presumably there are no other ObjEntities pointing to this DbEntity, so syncing just this one...

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
index 7db68af..e055883 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
@@ -29,9 +29,9 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
 import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 import org.apache.cayenne.util.EntityMergeListener;
@@ -205,7 +205,7 @@ public class EntityMergeSupport {
 
     private boolean createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) {
         String relationshipName = nameGenerator.createObjRelationshipName(dr);
-        relationshipName = UniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName);
+        relationshipName = DuplicateNameResolver.resolve(NameCheckers.objRelationship, entity, relationshipName);
 
         ObjRelationship or = new ObjRelationship(relationshipName);
         or.addDbRelationship(dr);
@@ -279,7 +279,7 @@ public class EntityMergeSupport {
     }
 
     private void addMissingAttribute(ObjEntity entity, DbAttribute da) {
-        String attrName = UniqueNameGenerator.generate(NameCheckers.objAttribute, entity,
+        String attrName = DuplicateNameResolver.resolve(NameCheckers.objAttribute, entity,
                 nameGenerator.createObjAttributeName(da));
 
         String type = TypesMapping.getJavaBySqlType(da.getType());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DuplicateNameResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DuplicateNameResolver.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DuplicateNameResolver.java
new file mode 100644
index 0000000..3f55d8f
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DuplicateNameResolver.java
@@ -0,0 +1,68 @@
+/*****************************************************************
+ *   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.apache.cayenne.map.DataMap;
+
+/**
+ * A generator of unique names for the various model objects.
+ *
+ * @since 4.0
+ */
+public class DuplicateNameResolver {
+
+    private static final String DEFAULT_PATTERN = "%s%d";
+
+    public static String resolve(NameChecker checker) {
+        return resolve(checker, DEFAULT_PATTERN, null, null);
+    }
+
+    public static String resolve(NameChecker checker, Object context) {
+        return resolve(checker, DEFAULT_PATTERN, context, null);
+    }
+
+    public static String resolve(NameChecker checker, Object context, String baseName) {
+        return resolve(checker, DEFAULT_PATTERN, context, baseName);
+    }
+
+    public static String resolve(NameChecker nameChecker, String pattern, Object context, String baseName) {
+
+        if (baseName == null) {
+            baseName = nameChecker.baseName();
+        }
+
+        String resolved = doResolve(nameChecker, pattern, context, baseName);
+
+        // TODO ugly hack with cast... something more OO is in order
+        return (nameChecker == NameCheckers.embeddable)
+                ? ((DataMap) context).getNameWithDefaultPackage(resolved) : resolved;
+    }
+
+
+    private static String doResolve(NameChecker nameChecker, String pattern, Object namingContext, String baseName) {
+        int c = 1;
+        String name = baseName;
+        while (nameChecker.isNameInUse(namingContext, name)) {
+            name = String.format(pattern, baseName, c++);
+        }
+
+        return name;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameChecker.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameChecker.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameChecker.java
new file mode 100644
index 0000000..ade1ec5
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameChecker.java
@@ -0,0 +1,36 @@
+/*****************************************************************
+ *   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 interface NameChecker {
+
+	/**
+	 * Returns a base default name, like "UntitledEntity", etc.
+	 */
+	String baseName();
+
+	/**
+	 * Checks if the name is already taken by another sibling in the same
+	 * context.
+	 */
+	boolean isNameInUse(Object namingContext, String name);
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameCheckers.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameCheckers.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameCheckers.java
new file mode 100644
index 0000000..fca1734
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameCheckers.java
@@ -0,0 +1,223 @@
+/*****************************************************************
+ *   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.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * A set of default {@link NameChecker} objects for the known model objects.
+ *
+ * @since 4.0
+ */
+public enum NameCheckers implements NameChecker {
+
+    dataChannelDescriptor("project") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            return false;
+        }
+    },
+
+    dataMap("datamap") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            // null context is a situation when DataMap is a
+            // top level object of the project
+            if (namingContext == null) {
+                return false;
+            }
+
+            if (namingContext instanceof DataDomain) {
+                DataDomain domain = (DataDomain) namingContext;
+                return domain.getDataMap(name) != null;
+            }
+
+            if (namingContext instanceof DataChannelDescriptor) {
+                DataChannelDescriptor domain = (DataChannelDescriptor) namingContext;
+                return domain.getDataMap(name) != null;
+            }
+            return false;
+        }
+    },
+
+    reverseEngineering("reverseEngineering") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            if (namingContext == null) {
+                return false;
+            }
+
+            for (DataMap dataMap : ((DataChannelDescriptor) namingContext).getDataMaps()) {
+                if (dataMap != null && dataMap.getReverseEngineering() != null &&
+                        dataMap.getReverseEngineering().getName() != null && dataMap.getReverseEngineering().getName().equals(name)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    },
+
+    objEntity("ObjEntity") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            DataMap map = (DataMap) namingContext;
+            return map.getObjEntity(name) != null;
+        }
+    },
+
+    embeddable("Embeddable") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            DataMap map = (DataMap) namingContext;
+            return map.getEmbeddable(map.getNameWithDefaultPackage(name)) != null;
+        }
+    },
+
+    embeddableAttribute("untitledAttr") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            Embeddable emb = (Embeddable) namingContext;
+            return emb.getAttribute(name) != null;
+        }
+    },
+
+    dbEntity("db_entity") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            DataMap map = (DataMap) namingContext;
+            return map.getDbEntity(name) != null;
+        }
+    },
+
+    procedureParameter("UntitledProcedureParameter") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+
+            // it doesn't matter if we create a parameter with
+            // a duplicate name.. parameters are positional anyway..
+            // still try to use unique names for visual consistency
+            Procedure procedure = (Procedure) namingContext;
+            for (final ProcedureParameter parameter : procedure
+                    .getCallParameters()) {
+                if (name.equals(parameter.getName())) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+    },
+
+    procedure("procedure") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            DataMap map = (DataMap) namingContext;
+            return map.getProcedure(name) != null;
+        }
+    },
+
+    query("query") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            DataMap map = (DataMap) namingContext;
+            return map.getQueryDescriptor(name) != null;
+        }
+    },
+
+    objAttribute("untitledAttr") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            return objRelationship.isNameInUse(namingContext, name);
+        }
+    },
+
+    dbAttribute("untitledAttr") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            Entity ent = (Entity) namingContext;
+            return ent.getAttribute(name) != null
+                    || ent.getRelationship(name) != null;
+        }
+    },
+
+    dataNodeDescriptor("datanode") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            DataChannelDescriptor domain = (DataChannelDescriptor) namingContext;
+            for (DataNodeDescriptor dataNodeDescriptor : domain
+                    .getNodeDescriptors()) {
+                if (dataNodeDescriptor.getName().equals(name)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    },
+
+    objRelationship("untitledRel") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            ObjEntity ent = (ObjEntity) namingContext;
+            return dbAttribute.isNameInUse(namingContext, name)
+                    || ent.getCallbackMethods().contains(
+                    "get" + StringUtils.capitalize(name));
+        }
+    },
+
+    dbRelationship("untitledRel") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            return dbAttribute.isNameInUse(namingContext, name);
+        }
+    },
+
+    objCallbackMethod("ObjCallbackMethod") {
+        @Override
+        public boolean isNameInUse(Object namingContext, String name) {
+            ObjEntity ent = (ObjEntity) namingContext;
+
+            return name.startsWith("get")
+                    && dbAttribute.isNameInUse(namingContext,
+                    StringUtils.uncapitalize(name.substring(3)))
+                    || ent.getCallbackMethods().contains(name);
+        }
+    };
+
+    private final String baseName;
+
+    NameCheckers(String baseName) {
+        this.baseName = baseName;
+    }
+
+    @Override
+    public String baseName() {
+        return baseName;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
index 5f233cd..44b9fb3 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
@@ -34,9 +34,9 @@ import org.apache.cayenne.map.DbRelationshipDetected;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
 import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.cayenne.util.EqualsBuilder;
 import org.apache.commons.logging.Log;
@@ -133,7 +133,7 @@ public class DbLoader {
                 continue;
             }
 
-            String objEntityName = UniqueNameGenerator.generate(NameCheckers.objEntity, map,
+            String objEntityName = DuplicateNameResolver.resolve(NameCheckers.objEntity, map,
                     nameGenerator.createObjEntityName(dbEntity));
 
             ObjEntity objEntity = new ObjEntity(objEntityName);
@@ -439,7 +439,7 @@ public class DbLoader {
 
     private String generateName(DbEntity entity, ExportedKey key, boolean toMany) {
         String forwardPreferredName = nameGenerator.createDbRelationshipName(key, toMany);
-        return UniqueNameGenerator.generate(NameCheckers.dbRelationship, entity, forwardPreferredName);
+        return DuplicateNameResolver.resolve(NameCheckers.dbRelationship, entity, forwardPreferredName);
     }
 
     private void fireObjEntitiesAddedEvents(Collection<ObjEntity> loadedObjEntities) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
index 06c7d82..85af6a4 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
@@ -21,8 +21,8 @@ package org.apache.cayenne.dbsync.reverse.db;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -113,7 +113,7 @@ class ManyToManyCandidateEntity {
                 (short) 1);
 
         ObjRelationship newRelationship = new ObjRelationship();
-        newRelationship.setName(UniqueNameGenerator.generate(NameCheckers.objRelationship, srcEntity,
+        newRelationship.setName(DuplicateNameResolver.resolve(NameCheckers.objRelationship, srcEntity,
                 nameGenerator.createDbRelationshipName(key, true)));
 
         newRelationship.setSourceEntity(srcEntity);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
index d299338..a2d2264 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
@@ -18,10 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.reverse.naming;
 
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
+import org.apache.cayenne.util.Util;
 import org.jvnet.inflector.Noun;
 
 import java.util.Locale;
@@ -73,21 +74,21 @@ public class DefaultObjectNameGenerator implements ObjectNameGenerator {
 			}
 		}
 
-		return NameConverter.underscoredToJava(name, false);
+		return Util.underscoredToJava(name, false);
 	}
 
 	@Override
 	public String createObjEntityName(DbEntity dbEntity) {
-		return NameConverter.underscoredToJava(dbEntity.getName(), true);
+		return Util.underscoredToJava(dbEntity.getName(), true);
 	}
 
 	@Override
 	public String createObjAttributeName(DbAttribute attr) {
-		return NameConverter.underscoredToJava(attr.getName(), false);
+		return Util.underscoredToJava(attr.getName(), false);
 	}
 
 	@Override
 	public String createObjRelationshipName(DbRelationship dbRel) {
-		return NameConverter.underscoredToJava(dbRel.getName(), false);
+		return Util.underscoredToJava(dbRel.getName(), false);
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
index 16f7f7a..1c52a6e 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
@@ -18,35 +18,37 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.reverse.naming;
 
+import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
+import org.apache.cayenne.util.Util;
 
 /**
  * BasicNamingStrategy is an naming strategy that creates names in Cayenne's
  * old-fashioned manner, i.e. the same way Cayenne did before 3.0
- * 
+ *
  * @since 4.0
  */
 public class LegacyObjectNameGenerator implements ObjectNameGenerator {
+
     public String createDbRelationshipName(
             ExportedKey key,
             boolean toMany) {
-        
+
         String uglyName = (toMany) ? key.getFKTableName() + "_ARRAY" : "to_" + key.getPKTableName();
-        return NameConverter.underscoredToJava(uglyName, false);
+        return Util.underscoredToJava(uglyName, false);
     }
 
     public String createObjEntityName(DbEntity dbEntity) {
-        return NameConverter.underscoredToJava(dbEntity.getName(), true);
+        return Util.underscoredToJava(dbEntity.getName(), true);
     }
 
     public String createObjAttributeName(DbAttribute attr) {
-        return NameConverter.underscoredToJava(attr.getName(), false);
+        return Util.underscoredToJava(attr.getName(), false);
     }
 
     public String createObjRelationshipName(DbRelationship dbRel) {
-        return NameConverter.underscoredToJava(dbRel.getName(), false);
+        return Util.underscoredToJava(dbRel.getName(), false);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java
deleted file mode 100644
index 63c4dcb..0000000
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.reverse.naming;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-/**
- * Utility class to convert from different naming styles to Java convention. For example
- * names like "ABCD_EFG" can be converted to "abcdEfg".
- */
-// TODO: deprecate
-public class NameConverter {
-
-    private static final Map<String, String> SPECIAL_CHAR_TO_JAVA_MAPPING = new HashMap<>();
-
-    static {
-        SPECIAL_CHAR_TO_JAVA_MAPPING.put("#", "pound");
-    }
-
-    /**
-     * Converts a String name to a String following java convention for the static final
-     * variables. E.g. "abcXyz" will be converted to "ABC_XYZ".
-     */
-    // TODO: move to the only user....
-    public static String javaToUnderscored(String name) {
-        if (name == null) {
-            return null;
-        }
-
-        // clear of non-java chars. While the method name implies that a passed identifier
-        // is pure Java, it is used to build pk columns names and such, so extra safety
-        // check is a good idea
-        name = specialCharsToJava(name);
-
-        char charArray[] = name.toCharArray();
-        StringBuilder buffer = new StringBuilder();
-
-        for (int i = 0; i < charArray.length; i++) {
-            if ((Character.isUpperCase(charArray[i])) && (i != 0)) {
-
-                char prevChar = charArray[i - 1];
-                if ((Character.isLowerCase(prevChar))) {
-                    buffer.append("_");
-                }
-            }
-
-            buffer.append(Character.toUpperCase(charArray[i]));
-        }
-
-        return buffer.toString();
-    }
-
-    /**
-     * Converts names like "ABCD_EFG_123" to Java-style names like "abcdEfg123". If
-     * <code>capitalize</code> is true, returned name is capitalized (for instance if
-     * this is a class name).
-     *
-     * @since 1.2
-     */
-    // TODO: migrate users to ObjectNameGenerator
-    public static String underscoredToJava(String name, boolean capitalize) {
-        StringTokenizer st = new StringTokenizer(name, "_");
-        StringBuilder buf = new StringBuilder();
-
-        boolean first = true;
-        while (st.hasMoreTokens()) {
-            String token = st.nextToken();
-
-            // clear of non-java chars
-            token = specialCharsToJava(token);
-
-            int len = token.length();
-            if (len == 0) {
-                continue;
-            }
-
-            // sniff mixed case vs. single case styles
-            boolean hasLowerCase = false;
-            boolean hasUpperCase = false;
-            for (int i = 0; i < len && !(hasUpperCase && hasLowerCase); i++) {
-                if (Character.isUpperCase(token.charAt(i))) {
-                    hasUpperCase = true;
-                } else if (Character.isLowerCase(token.charAt(i))) {
-                    hasLowerCase = true;
-                }
-            }
-
-            // if mixed case, preserve it, if all upper, convert to lower
-            if (hasUpperCase && !hasLowerCase) {
-                token = token.toLowerCase();
-            }
-
-            if (first) {
-                // apply explicit capitalization rules, if this is the first token
-                first = false;
-                if (capitalize) {
-                    buf.append(Character.toUpperCase(token.charAt(0)));
-                } else {
-                    buf.append(Character.toLowerCase(token.charAt(0)));
-                }
-            } else {
-                buf.append(Character.toUpperCase(token.charAt(0)));
-            }
-
-            if (len > 1) {
-                buf.append(token.substring(1, len));
-            }
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Replaces special chars with human-readable and Java-id-compatible symbols.
-     */
-    static String specialCharsToJava(String string) {
-        int len = string.length();
-        if (len == 0) {
-            return string;
-        }
-
-        StringBuilder buffer = new StringBuilder(len);
-        for (int i = 0; i < len; i++) {
-
-            char c = string.charAt(i);
-            if (Character.isJavaIdentifierPart(c)) {
-                buffer.append(c);
-            } else {
-                Object word = SPECIAL_CHAR_TO_JAVA_MAPPING.get(String.valueOf(c));
-                buffer.append(word != null ? word : "_");
-            }
-        }
-
-        return buffer.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameCheckersTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameCheckersTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameCheckersTest.java
new file mode 100644
index 0000000..8131160
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameCheckersTest.java
@@ -0,0 +1,204 @@
+/*****************************************************************
+ *   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.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.QueryDescriptor;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class NameCheckersTest {
+
+    @Test
+    public void testObjEntityAttributes() throws Exception {
+        NameCheckers maker = NameCheckers.objAttribute;
+        ObjEntity namingContainer = new ObjEntity();
+
+        String baseName = maker.baseName();
+        String name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName, name);
+        namingContainer.addAttribute(new ObjAttribute(name));
+
+        name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName + "1", name);
+        namingContainer.addAttribute(new ObjAttribute(name));
+
+        name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName + "2", name);
+        namingContainer.addAttribute(new ObjAttribute(name));
+
+        name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName + "3", name);
+        namingContainer.addAttribute(new ObjAttribute(name));
+
+        maker = NameCheckers.objRelationship;
+        baseName = maker.baseName();
+        name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName, name);
+        namingContainer.addRelationship(new ObjRelationship(name));
+
+        name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName + "1", name);
+        namingContainer.addRelationship(new ObjRelationship(name));
+
+        maker = NameCheckers.objCallbackMethod;
+        baseName = maker.baseName();
+        name = DuplicateNameResolver.resolve(maker, namingContainer);
+        assertEquals(baseName, name);
+        namingContainer.addRelationship(new ObjRelationship(name));
+    }
+
+    @Test
+    public void testEntity () {
+        DataMap map = new DataMap();
+
+        map.addDbEntity(new DbEntity("name"));
+        checkNameAndOther(map, NameCheckers.dbEntity, "name");
+
+        map.addObjEntity(new ObjEntity("name"));
+        checkNameAndOther(map, NameCheckers.objEntity, "name");
+
+        map.addProcedure(new Procedure("name"));
+        checkNameAndOther(map, NameCheckers.procedure, "name");
+
+        QueryDescriptor query = QueryDescriptor.selectQueryDescriptor();
+        query.setName("name");
+        map.addQueryDescriptor(query);
+        checkNameAndOther(map, NameCheckers.query, "name");
+    }
+
+    @Test
+    public void testProject() throws Exception {
+        assertFalse(NameCheckers.dataChannelDescriptor.isNameInUse(null, null));
+    }
+
+    @Test
+    public void testDbEntity() throws Exception {
+        DbEntity dbEntity = new DbEntity();
+
+        dbEntity.addRelationship(new DbRelationship("name"));
+        checkNameAndOther(dbEntity, NameCheckers.dbRelationship, "name");
+    }
+
+    @Test
+    public void testProcedureAttr() throws Exception {
+        Procedure procedure = new Procedure();
+
+        procedure.addCallParameter(new ProcedureParameter("name"));
+        checkNameAndOther(procedure, NameCheckers.procedureParameter, "name");
+    }
+
+    @Test
+    public void testEmbeddableAttr() throws Exception {
+        Embeddable embeddable = new Embeddable();
+
+        embeddable.addAttribute(new EmbeddableAttribute("name"));
+        checkNameAndOther(embeddable, NameCheckers.embeddableAttribute, "name");
+    }
+
+    @Test
+    public void testDatanode() throws Exception {
+        DataChannelDescriptor descriptor = new DataChannelDescriptor();
+
+        descriptor.getDataMaps().add(new DataMap("name"));
+        checkNameAndOther(descriptor, NameCheckers.dataMap, "name");
+
+        descriptor.getNodeDescriptors().add(new DataNodeDescriptor("name"));
+        checkNameAndOther(descriptor, NameCheckers.dataNodeDescriptor, "name");
+    }
+
+    @Test
+    public void testDataMap() throws Exception {
+        DataDomain dataDomain = new DataDomain("name");
+
+        dataDomain.addDataMap(new DataMap("name"));
+        checkNameAndOther(dataDomain, NameCheckers.dataMap, "name");
+
+        assertFalse(NameCheckers.dataMap.isNameInUse(null, "name"));
+        assertFalse(NameCheckers.dataMap.isNameInUse(1, "name"));
+    }
+
+    private void checkNameAndOther(Object namingContainer, NameCheckers maker, String newName) {
+        assertTrue(maker.isNameInUse(namingContainer, newName));
+        assertEquals(newName + "1", DuplicateNameResolver.resolve(maker,namingContainer, newName));
+        assertEquals("other" + newName, DuplicateNameResolver.resolve(maker,namingContainer, "other" + newName));
+    }
+
+    @Test
+    public void testOverlappingAttributeAndCallbackNames() throws Exception {
+        ObjEntity namingContainer = new ObjEntity();
+
+        namingContainer.addAttribute(new ObjAttribute("myName"));
+        assertEquals("getMyName1", DuplicateNameResolver.resolve(NameCheckers.objCallbackMethod, namingContainer, "getMyName"));
+
+        namingContainer.getCallbackMap().getPostAdd().addCallbackMethod("getSecondName");
+        assertEquals("SecondName1", DuplicateNameResolver.resolve(NameCheckers.objAttribute, namingContainer, "SecondName"));
+        assertEquals("secondName1", DuplicateNameResolver.resolve(NameCheckers.objAttribute, namingContainer, "secondName"));
+        assertEquals("SecondName1", DuplicateNameResolver.resolve(NameCheckers.objRelationship, namingContainer, "SecondName"));
+        assertEquals("secondName1", DuplicateNameResolver.resolve(NameCheckers.objRelationship, namingContainer, "secondName"));
+    }
+
+    @Test
+    public void testAttributeDifferentInFirstLetterCases() throws Exception {
+        ObjEntity namingContainer = new ObjEntity();
+
+        namingContainer.addAttribute(new ObjAttribute("myName"));
+        Assert.assertTrue(NameCheckers.objAttribute.isNameInUse(namingContainer, "myName"));
+        Assert.assertFalse(NameCheckers.objAttribute.isNameInUse(namingContainer, "MyName"));
+
+        namingContainer.getCallbackMap().getPostAdd().addCallbackMethod("getSecondName");
+        assertEquals("SecondName1", DuplicateNameResolver.resolve(NameCheckers.objAttribute, namingContainer, "SecondName"));
+        assertEquals("secondName1", DuplicateNameResolver.resolve(NameCheckers.objAttribute, namingContainer, "secondName"));
+    }
+
+    @Test
+    public void testEmbeddable() {
+        DataMap map = new DataMap();
+
+        map.addEmbeddable(new Embeddable("name"));
+        Assert.assertTrue(NameCheckers.embeddable.isNameInUse(map, "name"));
+        assertEquals("name1", DuplicateNameResolver.resolve(NameCheckers.embeddable, map, "name"));
+        Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "other-name"));
+
+        map.setDefaultPackage("package");
+        Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "name"));
+        assertEquals("package.name", DuplicateNameResolver.resolve(NameCheckers.embeddable, map, "name"));
+        map.addEmbeddable(new Embeddable("package.name"));
+
+        Assert.assertTrue(NameCheckers.embeddable.isNameInUse(map, "name"));
+        assertEquals("package.name1", DuplicateNameResolver.resolve(NameCheckers.embeddable, map, "name"));
+        Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "other-name"));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java
deleted file mode 100644
index 1c52f6e..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.reverse.naming;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class NameConverterTest {
-
-    @Test
-    public void testUnderscoredToJava1() throws Exception {
-        String expected = "ClassNameIdentifier";
-        assertEquals(expected, NameConverter.underscoredToJava(
-                "_CLASS_NAME_IDENTIFIER_",
-                true));
-    }
-
-    @Test
-    public void testUnderscoredToJava2() throws Exception {
-        String expected = "propNameIdentifier123";
-        assertEquals(expected, NameConverter.underscoredToJava(
-                "_prop_name_Identifier_123",
-                false));
-    }
-
-    @Test
-    public void testUnderscoredToJava3() throws Exception {
-        String expected = "lastName";
-        assertEquals(expected, NameConverter.underscoredToJava("lastName", false));
-    }
-
-    @Test
-    public void testUnderscoredToJava4() throws Exception {
-        String expected = "lastName";
-        assertEquals(expected, NameConverter.underscoredToJava("LastName", false));
-    }
-
-    @Test
-    public void testUnderscoredToJava5() throws Exception {
-        String expected = "LastName";
-        assertEquals(expected, NameConverter.underscoredToJava("LastName", true));
-    }
-
-    @Test
-    public void testUnderscoredToJavaSpecialChars() throws Exception {
-        assertEquals("ABCpoundXyz", NameConverter.underscoredToJava("ABC#_XYZ", true));
-    }
-
-    @Test
-    public void testJavaToUnderscored1() throws Exception {
-        String expected = "LAST_NAME";
-        assertEquals(expected, NameConverter.javaToUnderscored("LastName"));
-    }
-
-    @Test
-    public void testJavaToUnderscored2() throws Exception {
-        String expected = "A_CLASS";
-        assertEquals(expected, NameConverter.javaToUnderscored("aClass"));
-    }
-
-    @Test
-    public void testJavaToUnderscored3() throws Exception {
-        String expected = "VAR_A";
-        assertEquals(expected, NameConverter.javaToUnderscored("varA"));
-    }
-
-    @Test
-    public void testJavaToUnderscored4() throws Exception {
-        String expected = "LAST_NAME";
-        assertEquals(expected, NameConverter.javaToUnderscored("LAST_NAME"));
-    }
-
-    @Test
-    public void testJavaToUnderscored5() throws Exception {
-        String expected = "ABC_A";
-        assertEquals(expected, NameConverter.javaToUnderscored("abc_A"));
-    }
-
-    @Test
-    public void testJavaToUnderscored6() throws Exception {
-        String expected = "A123";
-        assertEquals(expected, NameConverter.javaToUnderscored("a123"));
-    }
-
-    @Test
-    public void testJavaToUnderscored7() throws Exception {
-        String expected = "AB_CDEF";
-        assertEquals(expected, NameConverter.javaToUnderscored("abCDEF"));
-    }
-
-    @Test
-    public void testJavaToUnderscored8() throws Exception {
-        String expected = "AB_CE";
-        assertEquals(expected, NameConverter.javaToUnderscored("abCe"));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
index de79a6a..81a66ee 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
@@ -677,7 +677,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
 
             // create synthetic attribute
             if (attribute == null) {
-                attribute = new SyntheticPKObjAttribute(pk.getName());
+                attribute = new SyntheticPKObjAttribute(Util.underscoredToJava(pk.getName(), false));
                 attribute.setDbAttributePath(pk.getName());
                 attribute.setType(TypesMapping.getJavaBySqlType(pk.getType()));
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
deleted file mode 100644
index 68fdfd3..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-/**
- * @since 4.0
- */
-public interface NameChecker {
-
-	/**
-	 * Returns a base default name, like "UntitledEntity", etc.
-	 */
-	String baseName();
-
-	/**
-	 * Checks if the name is already taken by another sibling in the same
-	 * context.
-	 */
-	boolean isNameInUse(Object namingContext, String name);
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameCheckers.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameCheckers.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameCheckers.java
deleted file mode 100644
index 67639d6..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameCheckers.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-import org.apache.cayenne.access.DataDomain;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.Entity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @since 4.0
- */
-public enum NameCheckers implements NameChecker {
-
-	dataChannelDescriptor("project") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			return false;
-		}
-	},
-
-	dataMap("datamap") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			// null context is a situation when DataMap is a
-			// top level object of the project
-			if (namingContext == null) {
-				return false;
-			}
-
-			if (namingContext instanceof DataDomain) {
-				DataDomain domain = (DataDomain) namingContext;
-				return domain.getDataMap(name) != null;
-			}
-
-			if (namingContext instanceof DataChannelDescriptor) {
-				DataChannelDescriptor domain = (DataChannelDescriptor) namingContext;
-				return domain.getDataMap(name) != null;
-			}
-			return false;
-		}
-	},
-
-	reverseEngineering("reverseEngineering") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			if (namingContext == null) {
-				return false;
-			}
-
-			for (DataMap dataMap : ((DataChannelDescriptor) namingContext).getDataMaps()) {
-                if (dataMap!= null && dataMap.getReverseEngineering() != null &&
-                        dataMap.getReverseEngineering().getName()!=null && dataMap.getReverseEngineering().getName().equals(name)) {
-                    return true;
-                }
-			}
-			return false;
-		}
-	},
-
-	objEntity("ObjEntity") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			DataMap map = (DataMap) namingContext;
-			return map.getObjEntity(name) != null;
-		}
-	},
-
-	embeddable("Embeddable") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			DataMap map = (DataMap) namingContext;
-			return map.getEmbeddable(map.getNameWithDefaultPackage(name)) != null;
-		}
-	},
-
-	embeddableAttribute("untitledAttr") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			Embeddable emb = (Embeddable) namingContext;
-			return emb.getAttribute(name) != null;
-		}
-	},
-
-	dbEntity("db_entity") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			DataMap map = (DataMap) namingContext;
-			return map.getDbEntity(name) != null;
-		}
-	},
-
-	procedureParameter("UntitledProcedureParameter") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-
-			// it doesn't matter if we create a parameter with
-			// a duplicate name.. parameters are positional anyway..
-			// still try to use unique names for visual consistency
-			Procedure procedure = (Procedure) namingContext;
-			for (final ProcedureParameter parameter : procedure
-					.getCallParameters()) {
-				if (name.equals(parameter.getName())) {
-					return true;
-				}
-			}
-
-			return false;
-		}
-	},
-
-	procedure("procedure") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			DataMap map = (DataMap) namingContext;
-			return map.getProcedure(name) != null;
-		}
-	},
-
-	query("query") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			DataMap map = (DataMap) namingContext;
-			return map.getQueryDescriptor(name) != null;
-		}
-	},
-
-	objAttribute("untitledAttr") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			return objRelationship.isNameInUse(namingContext, name);
-		}
-	},
-
-	dbAttribute("untitledAttr") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			Entity ent = (Entity) namingContext;
-			return ent.getAttribute(name) != null
-					|| ent.getRelationship(name) != null;
-		}
-	},
-
-	dataNodeDescriptor("datanode") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			DataChannelDescriptor domain = (DataChannelDescriptor) namingContext;
-			for (DataNodeDescriptor dataNodeDescriptor : domain
-					.getNodeDescriptors()) {
-				if (dataNodeDescriptor.getName().equals(name)) {
-					return true;
-				}
-			}
-			return false;
-		}
-	},
-
-	objRelationship("untitledRel") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			ObjEntity ent = (ObjEntity) namingContext;
-			return dbAttribute.isNameInUse(namingContext, name)
-					|| ent.getCallbackMethods().contains(
-					"get" + StringUtils.capitalize(name));
-		}
-	},
-
-	dbRelationship("untitledRel") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			return dbAttribute.isNameInUse(namingContext, name);
-		}
-	},
-
-	objCallbackMethod("ObjCallbackMethod") {
-		@Override
-		public boolean isNameInUse(Object namingContext, String name) {
-			ObjEntity ent = (ObjEntity) namingContext;
-
-			return name.startsWith("get")
-					&& dbAttribute.isNameInUse(namingContext,
-					StringUtils.uncapitalize(name.substring(3)))
-					|| ent.getCallbackMethods().contains(name);
-		}
-	};
-
-	public final String baseName;
-
-	NameCheckers(String baseName) {
-		this.baseName = baseName;
-	}
-
-	@Override
-	public String baseName() {
-		return baseName;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
deleted file mode 100644
index 2fe6801..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-import org.apache.cayenne.map.DataMap;
-
-/**
- * @since 4.0
- */
-public class UniqueNameGenerator {
-
-    public static final String DEFAULT_PATTERN = "%s%d";
-
-    private final NameChecker nameChecker;
-
-    private final String pattern;
-
-    public UniqueNameGenerator(NameChecker nameChecker, String pattern) {
-        this.nameChecker = nameChecker;
-        this.pattern = pattern;
-    }
-
-    public static String generate(NameChecker checker) {
-        return generate(checker, DEFAULT_PATTERN, null, null);
-    }
-
-    public static String generate(NameChecker checker, Object context) {
-        return generate(checker, DEFAULT_PATTERN, context, null);
-    }
-
-    public static String generate(NameChecker checker, Object context, String baseName) {
-        return generate(checker, DEFAULT_PATTERN, context, baseName);
-    }
-
-    public static String generate(NameChecker checker, String pattern, Object context, String baseName) {
-        UniqueNameGenerator generator;
-        if (checker == NameCheckers.embeddable) {
-            generator = new UniqueNameGenerator(NameCheckers.embeddable, pattern) {
-                @Override
-                public String generate(Object namingContext, String nameBase) {
-                    return ((DataMap) namingContext).getNameWithDefaultPackage(super.generate(namingContext, nameBase));
-                }
-            };
-        } else {
-            generator = new UniqueNameGenerator(checker, pattern);
-        }
-
-        return generator.generate(context, baseName);
-    }
-
-    /**
-     * Creates a unique name for the new object and constructs this object.
-     */
-    String generate(Object namingContext) {
-        return generate(namingContext, nameChecker.baseName());
-    }
-
-    String generate(Object namingContext, String nameBase) {
-        return generate(pattern, namingContext, nameBase != null ? nameBase : nameChecker.baseName());
-    }
-
-    /**
-     * @since 1.0.5
-     */
-    private String generate(String pattern, Object namingContext, String nameBase) {
-        int c = 1;
-        String name = nameBase;
-        while (nameChecker.isNameInUse(namingContext, name)) {
-            name = String.format(pattern, nameBase, c++);
-        }
-
-        return name;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java b/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
index e0f5571..14e5eab 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
@@ -19,6 +19,23 @@
 
 package org.apache.cayenne.util;
 
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
+import org.apache.cayenne.reflect.ArcProperty;
+import org.apache.cayenne.reflect.AttributeProperty;
+import org.apache.cayenne.reflect.PropertyVisitor;
+import org.apache.cayenne.reflect.ToManyProperty;
+import org.apache.cayenne.reflect.ToOneProperty;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -42,31 +59,19 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.di.AdhocObjectFactory;
-import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
-import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.reflect.ArcProperty;
-import org.apache.cayenne.reflect.AttributeProperty;
-import org.apache.cayenne.reflect.PropertyVisitor;
-import org.apache.cayenne.reflect.ToManyProperty;
-import org.apache.cayenne.reflect.ToOneProperty;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
 /**
  * Contains various unorganized static utility methods used across Cayenne.
  */
 public class Util {
 
+	private static final Map<String, String> SPECIAL_CHAR_TO_JAVA_MAPPING = new HashMap<>();
+	static {
+		SPECIAL_CHAR_TO_JAVA_MAPPING.put("#", "pound");
+	}
+
 	@Deprecated
 	private static DefaultAdhocObjectFactory objectFactory;
 
@@ -508,6 +513,91 @@ public class Util {
 		return objectFactory.getJavaClass(className);
 	}
 
+	/**
+	 * Converts names like "ABCD_EFG_123" to Java-style names like "abcdEfg123". If
+	 * <code>capitalize</code> is true, returned name is capitalized (for instance if
+	 * this is a class name).
+	 *
+	 * @since 4.0
+	 */
+	// TODO: trace direct users and switch over to ObjectNameGenerator
+	public static String underscoredToJava(String name, boolean capitalize) {
+		StringTokenizer st = new StringTokenizer(name, "_");
+		StringBuilder buf = new StringBuilder();
+
+		boolean first = true;
+		while (st.hasMoreTokens()) {
+			String token = st.nextToken();
+
+			// clear of non-java chars
+			token = specialCharsToJava(token);
+
+			int len = token.length();
+			if (len == 0) {
+				continue;
+			}
+
+			// sniff mixed case vs. single case styles
+			boolean hasLowerCase = false;
+			boolean hasUpperCase = false;
+			for (int i = 0; i < len && !(hasUpperCase && hasLowerCase); i++) {
+				if (Character.isUpperCase(token.charAt(i))) {
+					hasUpperCase = true;
+				} else if (Character.isLowerCase(token.charAt(i))) {
+					hasLowerCase = true;
+				}
+			}
+
+			// if mixed case, preserve it, if all upper, convert to lower
+			if (hasUpperCase && !hasLowerCase) {
+				token = token.toLowerCase();
+			}
+
+			if (first) {
+				// apply explicit capitalization rules, if this is the first token
+				first = false;
+				if (capitalize) {
+					buf.append(Character.toUpperCase(token.charAt(0)));
+				} else {
+					buf.append(Character.toLowerCase(token.charAt(0)));
+				}
+			} else {
+				buf.append(Character.toUpperCase(token.charAt(0)));
+			}
+
+			if (len > 1) {
+				buf.append(token.substring(1, len));
+			}
+		}
+		return buf.toString();
+	}
+
+	/**
+	 * Replaces special chars with human-readable and Java-id-compatible symbols.
+	 *
+	 * @since 4.0
+	 */
+	public static String specialCharsToJava(String string) {
+		int len = string.length();
+		if (len == 0) {
+			return string;
+		}
+
+		StringBuilder buffer = new StringBuilder(len);
+		for (int i = 0; i < len; i++) {
+
+			char c = string.charAt(i);
+			if (Character.isJavaIdentifierPart(c)) {
+				buffer.append(c);
+			} else {
+				Object word = SPECIAL_CHAR_TO_JAVA_MAPPING.get(String.valueOf(c));
+				buffer.append(word != null ? word : "_");
+			}
+		}
+
+		return buffer.toString();
+	}
+
 	static void setReverse(final Persistent sourceObject, String propertyName, final Persistent targetObject) {
 
 		ArcProperty property = (ArcProperty) Cayenne.getClassDescriptor(sourceObject).getProperty(propertyName);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
deleted file mode 100644
index e3e6628..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.cayenne.access.DataDomain;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.QueryDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class NameCheckersTest {
-
-    @Test
-    public void testObjEntityAttributes() throws Exception {
-        NameCheckers maker = NameCheckers.objAttribute;
-        ObjEntity namingContainer = new ObjEntity();
-
-        String baseName = maker.baseName();
-        String name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName, name);
-        namingContainer.addAttribute(new ObjAttribute(name));
-
-        name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName + "1", name);
-        namingContainer.addAttribute(new ObjAttribute(name));
-
-        name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName + "2", name);
-        namingContainer.addAttribute(new ObjAttribute(name));
-
-        name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName + "3", name);
-        namingContainer.addAttribute(new ObjAttribute(name));
-
-        maker = NameCheckers.objRelationship;
-        baseName = maker.baseName();
-        name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName, name);
-        namingContainer.addRelationship(new ObjRelationship(name));
-
-        name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName + "1", name);
-        namingContainer.addRelationship(new ObjRelationship(name));
-
-        maker = NameCheckers.objCallbackMethod;
-        baseName = maker.baseName();
-        name = UniqueNameGenerator.generate(maker, namingContainer);
-        assertEquals(baseName, name);
-        namingContainer.addRelationship(new ObjRelationship(name));
-    }
-
-    @Test
-    public void testEntity () {
-        DataMap map = new DataMap();
-
-        map.addDbEntity(new DbEntity("name"));
-        checkNameAndOther(map, NameCheckers.dbEntity, "name");
-
-        map.addObjEntity(new ObjEntity("name"));
-        checkNameAndOther(map, NameCheckers.objEntity, "name");
-
-        map.addProcedure(new Procedure("name"));
-        checkNameAndOther(map, NameCheckers.procedure, "name");
-
-        QueryDescriptor query = QueryDescriptor.selectQueryDescriptor();
-        query.setName("name");
-        map.addQueryDescriptor(query);
-        checkNameAndOther(map, NameCheckers.query, "name");
-    }
-
-    @Test
-    public void testProject() throws Exception {
-        assertFalse(NameCheckers.dataChannelDescriptor.isNameInUse(null, null));
-    }
-
-    @Test
-    public void testDbEntity() throws Exception {
-        DbEntity dbEntity = new DbEntity();
-
-        dbEntity.addRelationship(new DbRelationship("name"));
-        checkNameAndOther(dbEntity, NameCheckers.dbRelationship, "name");
-    }
-
-    @Test
-    public void testProcedureAttr() throws Exception {
-        Procedure procedure = new Procedure();
-
-        procedure.addCallParameter(new ProcedureParameter("name"));
-        checkNameAndOther(procedure, NameCheckers.procedureParameter, "name");
-    }
-
-    @Test
-    public void testEmbeddableAttr() throws Exception {
-        Embeddable embeddable = new Embeddable();
-
-        embeddable.addAttribute(new EmbeddableAttribute("name"));
-        checkNameAndOther(embeddable, NameCheckers.embeddableAttribute, "name");
-    }
-
-    @Test
-    public void testDatanode() throws Exception {
-        DataChannelDescriptor descriptor = new DataChannelDescriptor();
-
-        descriptor.getDataMaps().add(new DataMap("name"));
-        checkNameAndOther(descriptor, NameCheckers.dataMap, "name");
-
-        descriptor.getNodeDescriptors().add(new DataNodeDescriptor("name"));
-        checkNameAndOther(descriptor, NameCheckers.dataNodeDescriptor, "name");
-    }
-
-    @Test
-    public void testDataMap() throws Exception {
-        DataDomain dataDomain = new DataDomain("name");
-
-        dataDomain.addDataMap(new DataMap("name"));
-        checkNameAndOther(dataDomain, NameCheckers.dataMap, "name");
-
-        assertFalse(NameCheckers.dataMap.isNameInUse(null, "name"));
-        assertFalse(NameCheckers.dataMap.isNameInUse(1, "name"));
-    }
-
-    private void checkNameAndOther(Object namingContainer, NameCheckers maker, String newName) {
-        assertTrue(maker.isNameInUse(namingContainer, newName));
-        assertEquals(newName + "1", UniqueNameGenerator.generate(maker,namingContainer, newName));
-        assertEquals("other" + newName, UniqueNameGenerator.generate(maker,namingContainer, "other" + newName));
-    }
-
-    @Test
-    public void testOverlappingAttributeAndCallbackNames() throws Exception {
-        ObjEntity namingContainer = new ObjEntity();
-
-        namingContainer.addAttribute(new ObjAttribute("myName"));
-        Assert.assertEquals("getMyName1", UniqueNameGenerator.generate(NameCheckers.objCallbackMethod, namingContainer, "getMyName"));
-
-        namingContainer.getCallbackMap().getPostAdd().addCallbackMethod("getSecondName");
-        Assert.assertEquals("SecondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "SecondName"));
-        Assert.assertEquals("secondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "secondName"));
-        Assert.assertEquals("SecondName1", UniqueNameGenerator.generate(NameCheckers.objRelationship, namingContainer, "SecondName"));
-        Assert.assertEquals("secondName1", UniqueNameGenerator.generate(NameCheckers.objRelationship, namingContainer, "secondName"));
-    }
-
-    @Test
-    public void testAttributeDifferentInFirstLetterCases() throws Exception {
-        ObjEntity namingContainer = new ObjEntity();
-
-        namingContainer.addAttribute(new ObjAttribute("myName"));
-        Assert.assertTrue(NameCheckers.objAttribute.isNameInUse(namingContainer, "myName"));
-        Assert.assertFalse(NameCheckers.objAttribute.isNameInUse(namingContainer, "MyName"));
-
-        namingContainer.getCallbackMap().getPostAdd().addCallbackMethod("getSecondName");
-        Assert.assertEquals("SecondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "SecondName"));
-        Assert.assertEquals("secondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "secondName"));
-    }
-
-    @Test
-    public void testEmbeddable() {
-        DataMap map = new DataMap();
-
-        map.addEmbeddable(new Embeddable("name"));
-        Assert.assertTrue(NameCheckers.embeddable.isNameInUse(map, "name"));
-        Assert.assertEquals("name1", UniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
-        Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "other-name"));
-
-        map.setDefaultPackage("package");
-        Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "name"));
-        Assert.assertEquals("package.name", UniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
-        map.addEmbeddable(new Embeddable("package.name"));
-
-        Assert.assertTrue(NameCheckers.embeddable.isNameInUse(map, "name"));
-        Assert.assertEquals("package.name1", UniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
-        Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "other-name"));
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-server/src/test/java/org/apache/cayenne/util/UtilTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/util/UtilTest.java b/cayenne-server/src/test/java/org/apache/cayenne/util/UtilTest.java
index 2db6987..eab7371 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/util/UtilTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/util/UtilTest.java
@@ -295,4 +295,42 @@ public class UtilTest {
 		assertEquals("1...78", Util.prettyTrim("12345678", 6));
 	}
 
+	@Test
+	public void testUnderscoredToJava1() throws Exception {
+		String expected = "ClassNameIdentifier";
+		assertEquals(expected, Util.underscoredToJava(
+				"_CLASS_NAME_IDENTIFIER_",
+				true));
+	}
+
+	@Test
+	public void testUnderscoredToJava2() throws Exception {
+		String expected = "propNameIdentifier123";
+		assertEquals(expected, Util.underscoredToJava(
+				"_prop_name_Identifier_123",
+				false));
+	}
+
+	@Test
+	public void testUnderscoredToJava3() throws Exception {
+		String expected = "lastName";
+		assertEquals(expected, Util.underscoredToJava("lastName", false));
+	}
+
+	@Test
+	public void testUnderscoredToJava4() throws Exception {
+		String expected = "lastName";
+		assertEquals(expected, Util.underscoredToJava("LastName", false));
+	}
+
+	@Test
+	public void testUnderscoredToJava5() throws Exception {
+		String expected = "LastName";
+		assertEquals(expected, Util.underscoredToJava("LastName", true));
+	}
+
+	@Test
+	public void testUnderscoredToJavaSpecialChars() throws Exception {
+		assertEquals("ABCpoundXyz", Util.underscoredToJava("ABC#_XYZ", true));
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
index d99a577..a9d1dfe 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
@@ -19,7 +19,6 @@
 
 package org.apache.cayenne.gen;
 
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.util.Util;
@@ -46,6 +45,6 @@ public class ClientDataMapArtifact extends DataMapArtifact {
             clientPrefix = "Client_";
         }
 
-        return dataMap.getNameWithDefaultClientPackage(NameConverter.underscoredToJava(clientPrefix + dataMap.getName(), true));
+        return dataMap.getNameWithDefaultClientPackage(Util.underscoredToJava(clientPrefix + dataMap.getName(), true));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
index e01d002..8e60495 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
@@ -19,9 +19,9 @@
 
 package org.apache.cayenne.gen;
 
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.util.Util;
 import org.apache.velocity.VelocityContext;
 
 import java.util.Collection;
@@ -58,7 +58,7 @@ public class DataMapArtifact implements Artifact {
     }
 
     public String getQualifiedClassName() {
-        return dataMap.getNameWithDefaultPackage(NameConverter.underscoredToJava(dataMap.getName(), true));
+        return dataMap.getNameWithDefaultPackage(Util.underscoredToJava(dataMap.getName(), true));
     }
 
     public Object getObject() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
index 9d5c75a..a0013cc 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
@@ -19,17 +19,6 @@
 
 package org.apache.cayenne.gen;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.ExpressionParameter;
@@ -42,11 +31,22 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.PathComponent;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.util.CayenneMapEntry;
+import org.apache.cayenne.util.Util;
 import org.apache.commons.collections.set.ListOrderedSet;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * Attributes and Methods for working with Queries.
  *
@@ -64,7 +64,7 @@ public class DataMapUtils {
 	 * @return Method name that perform query.
 	 */
 	public String getQueryMethodName(QueryDescriptor query) {
-		return NameConverter.underscoredToJava(query.getName(), true);
+		return Util.underscoredToJava(query.getName(), true);
 	}
 
 	/**
@@ -136,7 +136,7 @@ public class DataMapUtils {
 		Matcher matcher = pattern.matcher(qualifierString);
 		while (matcher.find()) {
 			String name = matcher.group();
-			result.add(NameConverter.underscoredToJava(name.substring(1), false));
+			result.add(Util.underscoredToJava(name.substring(1), false));
 		}
 
 		return result;
@@ -209,7 +209,7 @@ public class DataMapUtils {
 			}
 
 			for (String name : names) {
-				types.put(NameConverter.underscoredToJava(name, false), typeName);
+				types.put(Util.underscoredToJava(name, false), typeName);
 			}
 
 			return types;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
index 34ccfb3..5473142 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
@@ -20,7 +20,6 @@
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.project.validation.NameValidationHelper;
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.util.Util;
 
 /**
@@ -112,7 +111,27 @@ public class StringUtils {
         if (name == null || name.length() == 0)
             return name;
 
-        return NameConverter.javaToUnderscored(name);
+        // clear of non-java chars. While the method name implies that a passed identifier
+        // is pure Java, it is used to build pk columns names and such, so extra safety
+        // check is a good idea
+        name = Util.specialCharsToJava(name);
+
+        char charArray[] = name.toCharArray();
+        StringBuilder buffer = new StringBuilder();
+
+        for (int i = 0; i < charArray.length; i++) {
+            if ((Character.isUpperCase(charArray[i])) && (i != 0)) {
+
+                char prevChar = charArray[i - 1];
+                if ((Character.isLowerCase(prevChar))) {
+                    buffer.append("_");
+                }
+            }
+
+            buffer.append(Character.toUpperCase(charArray[i]));
+        }
+
+        return buffer.toString();
     }
 
     /**


[3/5] cayenne git commit: CAY-2116 Split schema synchronization code in a separate module

Posted by aa...@apache.org.
CAY-2116 Split schema synchronization code in a separate module


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

Branch: refs/heads/master
Commit: 2df9f66d8d56b201120cd984614a0e00b0aef4f5
Parents: 633303c
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 17:34:49 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 18:24:56 2016 +0300

----------------------------------------------------------------------
 .../dbsync/merge/CreateTableToModel.java        |   2 +-
 .../naming/DefaultObjectNameGenerator.java      |   1 -
 .../naming/LegacyObjectNameGenerator.java       |   1 -
 .../dbsync/reverse/naming/NameConverter.java    | 154 ++++++++++++++++++
 .../reverse/naming/NameConverterTest.java       | 115 ++++++++++++++
 .../cayenne/map/naming/NameConverter.java       | 157 -------------------
 .../apache/cayenne/util/NameConverterTest.java  | 116 --------------
 .../cayenne/gen/ClientDataMapArtifact.java      |   9 +-
 .../org/apache/cayenne/gen/DataMapArtifact.java |  11 +-
 .../org/apache/cayenne/gen/DataMapUtils.java    |   2 +-
 .../org/apache/cayenne/gen/StringUtils.java     |   2 +-
 .../action/CreateCallbackMethodAction.java      |   2 +-
 .../modeler/action/CreateObjEntityAction.java   |   2 +-
 .../cayenne/modeler/editor/CallbackType.java    |   2 +-
 14 files changed, 284 insertions(+), 292 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
index 69e18b3..0997e9b 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/CreateTableToModel.java
@@ -22,7 +22,7 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.naming.NameConverter;
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 
 /**
  * A {@link MergerToken} to add a {@link DbEntity} to a {@link DataMap}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
index 8cb59db..d299338 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/DefaultObjectNameGenerator.java
@@ -22,7 +22,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
-import org.apache.cayenne.map.naming.NameConverter;
 import org.jvnet.inflector.Noun;
 
 import java.util.Locale;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
index 47e7ea5..16f7f7a 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/LegacyObjectNameGenerator.java
@@ -22,7 +22,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.dbsync.reverse.db.ExportedKey;
-import org.apache.cayenne.map.naming.NameConverter;
 
 /**
  * BasicNamingStrategy is an naming strategy that creates names in Cayenne's

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java
new file mode 100644
index 0000000..63c4dcb
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/naming/NameConverter.java
@@ -0,0 +1,154 @@
+/*****************************************************************
+ *   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.reverse.naming;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+/**
+ * Utility class to convert from different naming styles to Java convention. For example
+ * names like "ABCD_EFG" can be converted to "abcdEfg".
+ */
+// TODO: deprecate
+public class NameConverter {
+
+    private static final Map<String, String> SPECIAL_CHAR_TO_JAVA_MAPPING = new HashMap<>();
+
+    static {
+        SPECIAL_CHAR_TO_JAVA_MAPPING.put("#", "pound");
+    }
+
+    /**
+     * Converts a String name to a String following java convention for the static final
+     * variables. E.g. "abcXyz" will be converted to "ABC_XYZ".
+     */
+    // TODO: move to the only user....
+    public static String javaToUnderscored(String name) {
+        if (name == null) {
+            return null;
+        }
+
+        // clear of non-java chars. While the method name implies that a passed identifier
+        // is pure Java, it is used to build pk columns names and such, so extra safety
+        // check is a good idea
+        name = specialCharsToJava(name);
+
+        char charArray[] = name.toCharArray();
+        StringBuilder buffer = new StringBuilder();
+
+        for (int i = 0; i < charArray.length; i++) {
+            if ((Character.isUpperCase(charArray[i])) && (i != 0)) {
+
+                char prevChar = charArray[i - 1];
+                if ((Character.isLowerCase(prevChar))) {
+                    buffer.append("_");
+                }
+            }
+
+            buffer.append(Character.toUpperCase(charArray[i]));
+        }
+
+        return buffer.toString();
+    }
+
+    /**
+     * Converts names like "ABCD_EFG_123" to Java-style names like "abcdEfg123". If
+     * <code>capitalize</code> is true, returned name is capitalized (for instance if
+     * this is a class name).
+     *
+     * @since 1.2
+     */
+    // TODO: migrate users to ObjectNameGenerator
+    public static String underscoredToJava(String name, boolean capitalize) {
+        StringTokenizer st = new StringTokenizer(name, "_");
+        StringBuilder buf = new StringBuilder();
+
+        boolean first = true;
+        while (st.hasMoreTokens()) {
+            String token = st.nextToken();
+
+            // clear of non-java chars
+            token = specialCharsToJava(token);
+
+            int len = token.length();
+            if (len == 0) {
+                continue;
+            }
+
+            // sniff mixed case vs. single case styles
+            boolean hasLowerCase = false;
+            boolean hasUpperCase = false;
+            for (int i = 0; i < len && !(hasUpperCase && hasLowerCase); i++) {
+                if (Character.isUpperCase(token.charAt(i))) {
+                    hasUpperCase = true;
+                } else if (Character.isLowerCase(token.charAt(i))) {
+                    hasLowerCase = true;
+                }
+            }
+
+            // if mixed case, preserve it, if all upper, convert to lower
+            if (hasUpperCase && !hasLowerCase) {
+                token = token.toLowerCase();
+            }
+
+            if (first) {
+                // apply explicit capitalization rules, if this is the first token
+                first = false;
+                if (capitalize) {
+                    buf.append(Character.toUpperCase(token.charAt(0)));
+                } else {
+                    buf.append(Character.toLowerCase(token.charAt(0)));
+                }
+            } else {
+                buf.append(Character.toUpperCase(token.charAt(0)));
+            }
+
+            if (len > 1) {
+                buf.append(token.substring(1, len));
+            }
+        }
+        return buf.toString();
+    }
+
+    /**
+     * Replaces special chars with human-readable and Java-id-compatible symbols.
+     */
+    static String specialCharsToJava(String string) {
+        int len = string.length();
+        if (len == 0) {
+            return string;
+        }
+
+        StringBuilder buffer = new StringBuilder(len);
+        for (int i = 0; i < len; i++) {
+
+            char c = string.charAt(i);
+            if (Character.isJavaIdentifierPart(c)) {
+                buffer.append(c);
+            } else {
+                Object word = SPECIAL_CHAR_TO_JAVA_MAPPING.get(String.valueOf(c));
+                buffer.append(word != null ? word : "_");
+            }
+        }
+
+        return buffer.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java
new file mode 100644
index 0000000..1c52f6e
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/naming/NameConverterTest.java
@@ -0,0 +1,115 @@
+/*****************************************************************
+ *   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.reverse.naming;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class NameConverterTest {
+
+    @Test
+    public void testUnderscoredToJava1() throws Exception {
+        String expected = "ClassNameIdentifier";
+        assertEquals(expected, NameConverter.underscoredToJava(
+                "_CLASS_NAME_IDENTIFIER_",
+                true));
+    }
+
+    @Test
+    public void testUnderscoredToJava2() throws Exception {
+        String expected = "propNameIdentifier123";
+        assertEquals(expected, NameConverter.underscoredToJava(
+                "_prop_name_Identifier_123",
+                false));
+    }
+
+    @Test
+    public void testUnderscoredToJava3() throws Exception {
+        String expected = "lastName";
+        assertEquals(expected, NameConverter.underscoredToJava("lastName", false));
+    }
+
+    @Test
+    public void testUnderscoredToJava4() throws Exception {
+        String expected = "lastName";
+        assertEquals(expected, NameConverter.underscoredToJava("LastName", false));
+    }
+
+    @Test
+    public void testUnderscoredToJava5() throws Exception {
+        String expected = "LastName";
+        assertEquals(expected, NameConverter.underscoredToJava("LastName", true));
+    }
+
+    @Test
+    public void testUnderscoredToJavaSpecialChars() throws Exception {
+        assertEquals("ABCpoundXyz", NameConverter.underscoredToJava("ABC#_XYZ", true));
+    }
+
+    @Test
+    public void testJavaToUnderscored1() throws Exception {
+        String expected = "LAST_NAME";
+        assertEquals(expected, NameConverter.javaToUnderscored("LastName"));
+    }
+
+    @Test
+    public void testJavaToUnderscored2() throws Exception {
+        String expected = "A_CLASS";
+        assertEquals(expected, NameConverter.javaToUnderscored("aClass"));
+    }
+
+    @Test
+    public void testJavaToUnderscored3() throws Exception {
+        String expected = "VAR_A";
+        assertEquals(expected, NameConverter.javaToUnderscored("varA"));
+    }
+
+    @Test
+    public void testJavaToUnderscored4() throws Exception {
+        String expected = "LAST_NAME";
+        assertEquals(expected, NameConverter.javaToUnderscored("LAST_NAME"));
+    }
+
+    @Test
+    public void testJavaToUnderscored5() throws Exception {
+        String expected = "ABC_A";
+        assertEquals(expected, NameConverter.javaToUnderscored("abc_A"));
+    }
+
+    @Test
+    public void testJavaToUnderscored6() throws Exception {
+        String expected = "A123";
+        assertEquals(expected, NameConverter.javaToUnderscored("a123"));
+    }
+
+    @Test
+    public void testJavaToUnderscored7() throws Exception {
+        String expected = "AB_CDEF";
+        assertEquals(expected, NameConverter.javaToUnderscored("abCDEF"));
+    }
+
+    @Test
+    public void testJavaToUnderscored8() throws Exception {
+        String expected = "AB_CE";
+        assertEquals(expected, NameConverter.javaToUnderscored("abCe"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameConverter.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameConverter.java
deleted file mode 100644
index 7e4ceed..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameConverter.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-/**
- * Utility class to convert from different naming styles to Java convention. For example
- * names like "ABCD_EFG" can be converted to "abcdEfg".
- */
-public class NameConverter {
-
-    private static final Map<String, String> SPECIAL_CHAR_TO_JAVA_MAPPING = new HashMap<>();
-
-    static {
-        SPECIAL_CHAR_TO_JAVA_MAPPING.put("#", "pound");
-    }
-
-    /**
-     * Converts a String name to a String forllowing java convention for the static final
-     * variables. E.g. "abcXyz" will be converted to "ABC_XYZ".
-     * 
-     * @since 1.0.3
-     */
-    public static String javaToUnderscored(String name) {
-        if (name == null) {
-            return null;
-        }
-
-        // clear of non-java chars. While the method name implies that a passed identifier
-        // is pure Java, it is used to build pk columns names and such, so extra safety
-        // check is a good idea
-        name = specialCharsToJava(name);
-
-        char charArray[] = name.toCharArray();
-        StringBuilder buffer = new StringBuilder();
-
-        for (int i = 0; i < charArray.length; i++) {
-            if ((Character.isUpperCase(charArray[i])) && (i != 0)) {
-
-                char prevChar = charArray[i - 1];
-                if ((Character.isLowerCase(prevChar))) {
-                    buffer.append("_");
-                }
-            }
-
-            buffer.append(Character.toUpperCase(charArray[i]));
-        }
-
-        return buffer.toString();
-    }
-
-    /**
-     * Converts names like "ABCD_EFG_123" to Java-style names like "abcdEfg123". If
-     * <code>capitalize</code> is true, returned name is capitalized (for instance if
-     * this is a class name).
-     * 
-     * @since 1.2
-     */
-    public static String underscoredToJava(String name, boolean capitalize) {
-        StringTokenizer st = new StringTokenizer(name, "_");
-        StringBuilder buf = new StringBuilder();
-
-        boolean first = true;
-        while (st.hasMoreTokens()) {
-            String token = st.nextToken();
-
-            // clear of non-java chars
-            token = specialCharsToJava(token);
-
-            int len = token.length();
-            if (len == 0) {
-                continue;
-            }
-
-            // sniff mixed case vs. single case styles
-            boolean hasLowerCase = false;
-            boolean hasUpperCase = false;
-            for (int i = 0; i < len && !(hasUpperCase && hasLowerCase); i++) {
-                if (Character.isUpperCase(token.charAt(i))) {
-                    hasUpperCase = true;
-                }
-                else if (Character.isLowerCase(token.charAt(i))) {
-                    hasLowerCase = true;
-                }
-            }
-
-            // if mixed case, preserve it, if all upper, convert to lower
-            if (hasUpperCase && !hasLowerCase) {
-                token = token.toLowerCase();
-            }
-
-            if (first) {
-                // apply explicit capitalization rules, if this is the first token
-                first = false;
-                if (capitalize) {
-                    buf.append(Character.toUpperCase(token.charAt(0)));
-                }
-                else {
-                    buf.append(Character.toLowerCase(token.charAt(0)));
-                }
-            }
-            else {
-                buf.append(Character.toUpperCase(token.charAt(0)));
-            }
-
-            if (len > 1) {
-                buf.append(token.substring(1, len));
-            }
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Replaces special chars with human-readable and Java-id-compatible symbols.
-     */
-    public static String specialCharsToJava(String string) {
-        int len = string.length();
-        if (len == 0) {
-            return string;
-        }
-
-        StringBuilder buffer = new StringBuilder(len);
-        for (int i = 0; i < len; i++) {
-
-            char c = string.charAt(i);
-            if (Character.isJavaIdentifierPart(c)) {
-                buffer.append(c);
-            }
-            else {
-                Object word = SPECIAL_CHAR_TO_JAVA_MAPPING.get(String.valueOf(c));
-                buffer.append(word != null ? word : "_");
-            }
-        }
-
-        return buffer.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-server/src/test/java/org/apache/cayenne/util/NameConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/util/NameConverterTest.java b/cayenne-server/src/test/java/org/apache/cayenne/util/NameConverterTest.java
deleted file mode 100644
index 61b7e5f..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/util/NameConverterTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.util;
-
-import org.apache.cayenne.map.naming.NameConverter;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class NameConverterTest {
-
-    @Test
-    public void testUnderscoredToJava1() throws Exception {
-        String expected = "ClassNameIdentifier";
-        assertEquals(expected, NameConverter.underscoredToJava(
-                "_CLASS_NAME_IDENTIFIER_",
-                true));
-    }
-
-    @Test
-    public void testUnderscoredToJava2() throws Exception {
-        String expected = "propNameIdentifier123";
-        assertEquals(expected, NameConverter.underscoredToJava(
-                "_prop_name_Identifier_123",
-                false));
-    }
-
-    @Test
-    public void testUnderscoredToJava3() throws Exception {
-        String expected = "lastName";
-        assertEquals(expected, NameConverter.underscoredToJava("lastName", false));
-    }
-
-    @Test
-    public void testUnderscoredToJava4() throws Exception {
-        String expected = "lastName";
-        assertEquals(expected, NameConverter.underscoredToJava("LastName", false));
-    }
-
-    @Test
-    public void testUnderscoredToJava5() throws Exception {
-        String expected = "LastName";
-        assertEquals(expected, NameConverter.underscoredToJava("LastName", true));
-    }
-
-    @Test
-    public void testUnderscoredToJavaSpecialChars() throws Exception {
-        assertEquals("ABCpoundXyz", NameConverter.underscoredToJava("ABC#_XYZ", true));
-    }
-
-    @Test
-    public void testJavaToUnderscored1() throws Exception {
-        String expected = "LAST_NAME";
-        assertEquals(expected, NameConverter.javaToUnderscored("LastName"));
-    }
-
-    @Test
-    public void testJavaToUnderscored2() throws Exception {
-        String expected = "A_CLASS";
-        assertEquals(expected, NameConverter.javaToUnderscored("aClass"));
-    }
-
-    @Test
-    public void testJavaToUnderscored3() throws Exception {
-        String expected = "VAR_A";
-        assertEquals(expected, NameConverter.javaToUnderscored("varA"));
-    }
-
-    @Test
-    public void testJavaToUnderscored4() throws Exception {
-        String expected = "LAST_NAME";
-        assertEquals(expected, NameConverter.javaToUnderscored("LAST_NAME"));
-    }
-
-    @Test
-    public void testJavaToUnderscored5() throws Exception {
-        String expected = "ABC_A";
-        assertEquals(expected, NameConverter.javaToUnderscored("abc_A"));
-    }
-
-    @Test
-    public void testJavaToUnderscored6() throws Exception {
-        String expected = "A123";
-        assertEquals(expected, NameConverter.javaToUnderscored("a123"));
-    }
-
-    @Test
-    public void testJavaToUnderscored7() throws Exception {
-        String expected = "AB_CDEF";
-        assertEquals(expected, NameConverter.javaToUnderscored("abCDEF"));
-    }
-
-    @Test
-    public void testJavaToUnderscored8() throws Exception {
-        String expected = "AB_CE";
-        assertEquals(expected, NameConverter.javaToUnderscored("abCe"));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
index 0e6da3e..d99a577 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
@@ -19,13 +19,13 @@
 
 package org.apache.cayenne.gen;
 
-import java.util.Collection;
-
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.naming.NameConverter;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.util.Util;
 
+import java.util.Collection;
+
 public class ClientDataMapArtifact extends DataMapArtifact {
 
     public ClientDataMapArtifact(DataMap dataMap, Collection<QueryDescriptor> queries) {
@@ -46,7 +46,6 @@ public class ClientDataMapArtifact extends DataMapArtifact {
             clientPrefix = "Client_";
         }
 
-        return dataMap.getNameWithDefaultClientPackage(NameConverter
-                .underscoredToJava(clientPrefix + NameConverter.specialCharsToJava(dataMap.getName()), true));
+        return dataMap.getNameWithDefaultClientPackage(NameConverter.underscoredToJava(clientPrefix + dataMap.getName(), true));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
index 838f1c6..e01d002 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
@@ -19,14 +19,14 @@
 
 package org.apache.cayenne.gen;
 
-import java.util.Collection;
-import java.util.LinkedList;
-
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.map.naming.NameConverter;
 import org.apache.velocity.VelocityContext;
 
+import java.util.Collection;
+import java.util.LinkedList;
+
 /**
  * {@link Artifact} facade for a DataMap.
  * 
@@ -58,8 +58,7 @@ public class DataMapArtifact implements Artifact {
     }
 
     public String getQualifiedClassName() {
-        return dataMap.getNameWithDefaultPackage(NameConverter
-                .underscoredToJava(NameConverter.specialCharsToJava(dataMap.getName()), true));
+        return dataMap.getNameWithDefaultPackage(NameConverter.underscoredToJava(dataMap.getName(), true));
     }
 
     public Object getObject() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
index 64a3a38..9d5c75a 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
@@ -42,7 +42,7 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.PathComponent;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
-import org.apache.cayenne.map.naming.NameConverter;
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.commons.collections.set.ListOrderedSet;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java b/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
index bd5c453..34ccfb3 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/gen/StringUtils.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.project.validation.NameValidationHelper;
-import org.apache.cayenne.map.naming.NameConverter;
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.util.Util;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
index 5835ac9..df6a43a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.modeler.editor.CallbackType;
 import org.apache.cayenne.modeler.event.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.CreateCallbackMethodUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
-import org.apache.cayenne.map.naming.NameConverter;
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 
 /**
  * Action class for creating callback methods on ObjEntity

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/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 cb656d9..8b4406b 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
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
-import org.apache.cayenne.map.naming.NameConverter;
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2df9f66d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
index f0de775..932e345 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.modeler.editor;
 import java.io.Serializable;
 
 import org.apache.cayenne.map.LifecycleEvent;
-import org.apache.cayenne.map.naming.NameConverter;
+import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 
 /**
  * Entity for callback type. Contains type and type name


[4/5] cayenne git commit: CAY-2116 Split schema synchronization code in a separate module

Posted by aa...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/cayenne-tools/src/test/java/org/apache/cayenne/gen/StringUtilsTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/gen/StringUtilsTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/gen/StringUtilsTest.java
index 1ec6bd3..1fe187e 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/gen/StringUtilsTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/gen/StringUtilsTest.java
@@ -49,4 +49,53 @@ public class StringUtilsTest {
         assertEquals(null, stringUtils.pluralize(null));
     }
 
+
+    @Test
+    public void testCapitalizedAsConstant1() throws Exception {
+        String expected = "LAST_NAME";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("LastName"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant2() throws Exception {
+        String expected = "A_CLASS";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("aClass"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant3() throws Exception {
+        String expected = "VAR_A";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("varA"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant4() throws Exception {
+        String expected = "LAST_NAME";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("LAST_NAME"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant5() throws Exception {
+        String expected = "ABC_A";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("abc_A"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant6() throws Exception {
+        String expected = "A123";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("a123"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant7() throws Exception {
+        String expected = "AB_CDEF";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("abCDEF"));
+    }
+
+    @Test
+    public void testCapitalizedAsConstant8() throws Exception {
+        String expected = "AB_CE";
+        assertEquals(expected, stringUtils.capitalizedAsConstant("abCe"));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
index 970aafb..5ee3c0e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
@@ -36,8 +36,8 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EmbeddableAttributeEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
@@ -77,7 +77,7 @@ public class CreateAttributeAction extends CayenneAction {
             Embeddable embeddable = mediator.getCurrentEmbeddable();
 
             EmbeddableAttribute attr = new EmbeddableAttribute();
-            attr.setName(UniqueNameGenerator.generate(NameCheckers.embeddableAttribute, embeddable));
+            attr.setName(DuplicateNameResolver.resolve(NameCheckers.embeddableAttribute, embeddable));
 
             createEmbAttribute(embeddable, attr);
 
@@ -89,7 +89,7 @@ public class CreateAttributeAction extends CayenneAction {
 
             ObjEntity objEntity = mediator.getCurrentObjEntity();
 
-            ObjAttribute attr = new ObjAttribute(UniqueNameGenerator.generate(NameCheckers.objAttribute, objEntity), null, objEntity);
+            ObjAttribute attr = new ObjAttribute(DuplicateNameResolver.resolve(NameCheckers.objAttribute, objEntity), null, objEntity);
 
             createObjAttribute(mediator.getCurrentDataMap(), objEntity, attr);
 
@@ -99,7 +99,7 @@ public class CreateAttributeAction extends CayenneAction {
         } else if (getProjectController().getCurrentDbEntity() != null) {
             DbEntity dbEntity = getProjectController().getCurrentDbEntity();
 
-            DbAttribute attr = new DbAttribute(UniqueNameGenerator.generate(NameCheckers.dbAttribute, dbEntity),
+            DbAttribute attr = new DbAttribute(DuplicateNameResolver.resolve(NameCheckers.dbAttribute, dbEntity),
                     TypesMapping.NOT_DEFINED, dbEntity);
 
             createDbAttribute(mediator.getCurrentDataMap(), dbEntity, attr);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
index df6a43a..cc37948 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
@@ -18,19 +18,19 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.editor.CallbackType;
 import org.apache.cayenne.modeler.event.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.CreateCallbackMethodUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
+import org.apache.cayenne.util.Util;
+
+import java.awt.event.ActionEvent;
 
 /**
  * Action class for creating callback methods on ObjEntity
@@ -76,9 +76,8 @@ public class CreateCallbackMethodAction extends CayenneAction {
     public final void performAction(ActionEvent e) {
         CallbackType callbackType = getProjectController().getCurrentCallbackType();
 
-        // generate methodName
         String methodNamePrefix = toMethodName(callbackType.getType());
-        String methodName = UniqueNameGenerator.generate(NameCheckers.objCallbackMethod, getProjectController().getCurrentObjEntity(), methodNamePrefix);
+        String methodName = DuplicateNameResolver.resolve(NameCheckers.objCallbackMethod, getProjectController().getCurrentObjEntity(), methodNamePrefix);
 
         createCallbackMethod(callbackType, methodName);
         application.getUndoManager().addEdit(
@@ -102,7 +101,7 @@ public class CreateCallbackMethodAction extends CayenneAction {
     }
 
     private String toMethodName(LifecycleEvent event) {
-        return "on" + NameConverter.underscoredToJava(event.name(), true);
+        return "on" + Util.underscoredToJava(event.name(), true);
     }
     
     public static String getActionName() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
index aecc843..8403cb7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
@@ -23,8 +23,8 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.undo.CreateDataMapUndoableEdit;
@@ -63,7 +63,7 @@ public class CreateDataMapAction extends CayenneAction {
                 .getProject()
                 .getRootNode();
 
-        DataMap map = new DataMap(UniqueNameGenerator.generate(NameCheckers.dataMap, currentDomain));
+        DataMap map = new DataMap(DuplicateNameResolver.resolve(NameCheckers.dataMap, currentDomain));
 
         createDataMap(map);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
index ec2520b..abeaee3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
@@ -28,8 +28,8 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
@@ -63,7 +63,7 @@ public class CreateDbEntityAction extends CayenneAction {
 		ProjectController mediator = getProjectController();
 
 		DataMap map = mediator.getCurrentDataMap();
-		DbEntity entity = new DbEntity(UniqueNameGenerator.generate(NameCheckers.dbEntity, map));
+		DbEntity entity = new DbEntity(DuplicateNameResolver.resolve(NameCheckers.dbEntity, map));
 
 		createEntity(map, entity);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
index 05a00a4..7fea640 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
@@ -56,7 +56,7 @@ public class CreateEmbeddableAction extends CayenneAction {
 
         DataMap dataMap = mediator.getCurrentDataMap();
 
-        Embeddable embeddable = new Embeddable(UniqueNameGenerator.generate(NameCheckers.embeddable, mediator.getCurrentDataMap()));
+        Embeddable embeddable = new Embeddable(DuplicateNameResolver.resolve(NameCheckers.embeddable, mediator.getCurrentDataMap()));
         createEmbeddable(dataMap, embeddable);
 
         application.getUndoManager().addEdit(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
index 4dfc3f3..eb0fbf9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
@@ -29,8 +29,8 @@ import org.apache.cayenne.configuration.event.DataNodeEvent;
 import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
@@ -104,7 +104,7 @@ public class CreateNodeAction extends CayenneAction {
 	 * A factory method that makes a new DataNode.
 	 */
 	DataNodeDescriptor buildDataNode(DataChannelDescriptor domain) {
-		DataNodeDescriptor node = new DataNodeDescriptor(UniqueNameGenerator.generate(
+		DataNodeDescriptor node = new DataNodeDescriptor(DuplicateNameResolver.resolve(
 				NameCheckers.dataNodeDescriptor, domain));
 		node.setDataChannelDescriptor(domain);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/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 8b4406b..254f18e 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
@@ -22,20 +22,20 @@ package org.apache.cayenne.modeler.action;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.merge.EntityMergeSupport;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
 import org.apache.cayenne.modeler.undo.CreateObjEntityUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.util.DeleteRuleUpdater;
+import org.apache.cayenne.util.Util;
 
 import java.awt.event.ActionEvent;
 
@@ -69,7 +69,7 @@ public class CreateObjEntityAction extends CayenneAction {
         ProjectController mediator = getProjectController();
 
         DataMap dataMap = mediator.getCurrentDataMap();
-        ObjEntity entity = new ObjEntity(UniqueNameGenerator.generate(NameCheckers.objEntity, dataMap));
+        ObjEntity entity = new ObjEntity(DuplicateNameResolver.resolve(NameCheckers.objEntity, dataMap));
 
         // init defaults
         entity.setSuperClassName(dataMap.getDefaultSuperclass());
@@ -78,8 +78,8 @@ public class CreateObjEntityAction extends CayenneAction {
         DbEntity dbEntity = mediator.getCurrentDbEntity();
         if (dbEntity != null) {
             entity.setDbEntity(dbEntity);
-            String baseName = NameConverter.underscoredToJava(dbEntity.getName(), true);
-            entity.setName(UniqueNameGenerator.generate(NameCheckers.objEntity, dbEntity.getDataMap(), baseName));
+            String baseName = Util.underscoredToJava(dbEntity.getName(), true);
+            entity.setName(DuplicateNameResolver.resolve(NameCheckers.objEntity, dbEntity.getDataMap(), baseName));
         }
 
         entity.setClassName(dataMap.getNameWithDefaultPackage(entity.getName()));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
index ba060b8..7787abc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.configuration.event.ProcedureEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
@@ -52,7 +52,7 @@ public class CreateProcedureAction extends CayenneAction {
 		ProjectController mediator = getProjectController();
 		DataMap map = mediator.getCurrentDataMap();
 
-		Procedure procedure = new Procedure(UniqueNameGenerator.generate(NameCheckers.procedure, map));
+		Procedure procedure = new Procedure(DuplicateNameResolver.resolve(NameCheckers.procedure, map));
 
 		createProcedure(map, procedure);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
index 70aaa5c..e939f86 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.configuration.event.ProcedureParameterEvent;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.ProcedureParameterDisplayEvent;
@@ -64,7 +64,7 @@ public class CreateProcedureParameterAction extends CayenneAction {
 	public void createProcedureParameter() {
 		Procedure procedure = getProjectController().getCurrentProcedure();
 
-		ProcedureParameter parameter = new ProcedureParameter(UniqueNameGenerator.generate(
+		ProcedureParameter parameter = new ProcedureParameter(DuplicateNameResolver.resolve(
 				NameCheckers.procedureParameter, procedure));
 		procedure.addCallParameter(parameter);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
index 1f62b77..8abec0c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
@@ -31,8 +31,8 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
@@ -66,7 +66,7 @@ public class CreateRelationshipAction extends CayenneAction {
 		ObjEntity objEnt = getProjectController().getCurrentObjEntity();
 		if (objEnt != null) {
 
-			ObjRelationship rel = new ObjRelationship(UniqueNameGenerator.generate(NameCheckers.objRelationship,
+			ObjRelationship rel = new ObjRelationship(DuplicateNameResolver.resolve(NameCheckers.objRelationship,
 					objEnt));
 			createObjRelationship(objEnt, rel);
 
@@ -76,7 +76,7 @@ public class CreateRelationshipAction extends CayenneAction {
 			DbEntity dbEnt = getProjectController().getCurrentDbEntity();
 			if (dbEnt != null) {
 
-				DbRelationship rel = new DbRelationship(UniqueNameGenerator.generate(
+				DbRelationship rel = new DbRelationship(DuplicateNameResolver.resolve(
 						NameCheckers.dbRelationship, dbEnt));
 				createDbRelationship(dbEnt, rel);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
index f662b64..3158e90 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
@@ -31,8 +31,8 @@ import javax.swing.JOptionPane;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneAction;
@@ -85,9 +85,9 @@ public class ImportDataMapAction extends CayenneAction {
 			DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController().getProject().getRootNode();
 
 			if (newMap.getName() != null) {
-				newMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, domain, newMap.getName()));
+				newMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, domain, newMap.getName()));
 			} else {
-				newMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, domain));
+				newMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, domain));
 			}
 
 			Resource baseResource = domain.getConfigurationSource();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
index 8672759..8c5f1c6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
@@ -45,8 +45,8 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
@@ -302,7 +302,7 @@ public class ImportEOModelAction extends CayenneAction {
         else {
             // fix DataMap name, as there maybe a map with the same name already
             DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
-            map.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, domain, map.getName()));
+            map.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, domain, map.getName()));
 
             // side effect of this operation is that if a node was created, this DataMap
             // will be linked with it...

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
index b088fd1..468ff1d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
@@ -27,8 +27,8 @@ import javax.swing.KeyStroke;
 
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.CayenneModelerController;
 import org.apache.cayenne.modeler.event.DomainDisplayEvent;
@@ -68,7 +68,7 @@ public class NewProjectAction extends ProjectAction {
 
         DataChannelDescriptor domain = new DataChannelDescriptor();
 
-        domain.setName(UniqueNameGenerator.generate(NameCheckers.dataChannelDescriptor, domain));
+        domain.setName(DuplicateNameResolver.resolve(NameCheckers.dataChannelDescriptor, domain));
 
         Project project = new Project(
                 new ConfigurationTree<DataChannelDescriptor>(domain));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
index 2291544..a146307 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
@@ -35,8 +35,8 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
@@ -171,7 +171,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             // paste DataMap to DataDomain or DataNode
             DataMap dataMap = ((DataMap) content);
 
-            dataMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, COPY_PATTERN, domain, dataMap.getName()));
+            dataMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, COPY_PATTERN, domain, dataMap.getName()));
 
             /**
              * Update all names in the new DataMap, so that they would not conflict with
@@ -187,7 +187,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             for (DbEntity dbEntity : dataMap.getDbEntities()) {
                 String oldName = dbEntity.getName();
-                dbEntity.setName(UniqueNameGenerator.generate(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
+                dbEntity.setName(DuplicateNameResolver.resolve(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
 
                 if (!oldName.equals(dbEntity.getName())) {
                     renamedDbEntities.put(oldName, dbEntity.getName());
@@ -195,7 +195,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
             for (ObjEntity objEntity : dataMap.getObjEntities()) {
                 String oldName = objEntity.getName();
-                objEntity.setName(UniqueNameGenerator.generate(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
+                objEntity.setName(DuplicateNameResolver.resolve(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
 
                 if (!oldName.equals(objEntity.getName())) {
                     renamedObjEntities.put(oldName, objEntity.getName());
@@ -204,7 +204,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             for (Embeddable embeddable : dataMap.getEmbeddables()) {
                 String oldName = embeddable.getClassName();
-                embeddable.setClassName(UniqueNameGenerator.generate(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
+                embeddable.setClassName(DuplicateNameResolver.resolve(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
 
                 if (!oldName.equals(embeddable.getClassName())) {
                     renamedEmbeddables.put(oldName, embeddable.getClassName());
@@ -212,10 +212,10 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
 
             for (Procedure procedure : dataMap.getProcedures()) {
-                procedure.setName(UniqueNameGenerator.generate(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
+                procedure.setName(DuplicateNameResolver.resolve(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
             }
             for (QueryDescriptor query : dataMap.getQueryDescriptors()) {
-                query.setName(UniqueNameGenerator.generate(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
+                query.setName(DuplicateNameResolver.resolve(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
             }
 
             // if an entity was renamed, we rename all links to it too
@@ -257,7 +257,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof DbEntity) {
                 DbEntity dbEntity = (DbEntity) content;
-                dbEntity.setName(UniqueNameGenerator.generate(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
+                dbEntity.setName(DuplicateNameResolver.resolve(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
 
                 dataMap.addDbEntity(dbEntity);
                 CreateDbEntityAction.fireDbEntityEvent(this, mediator, dbEntity);
@@ -265,7 +265,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof ObjEntity) {
                 // paste ObjEntity to DataMap
                 ObjEntity objEntity = (ObjEntity) content;
-                objEntity.setName(UniqueNameGenerator.generate(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
+                objEntity.setName(DuplicateNameResolver.resolve(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
 
                 dataMap.addObjEntity(objEntity);
                 CreateObjEntityAction.fireObjEntityEvent(
@@ -277,7 +277,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof Embeddable) {
                 // paste Embeddable to DataMap
                 Embeddable embeddable = (Embeddable) content;
-                embeddable.setClassName(UniqueNameGenerator.generate(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
+                embeddable.setClassName(DuplicateNameResolver.resolve(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
 
                 dataMap.addEmbeddable(embeddable);
                 CreateEmbeddableAction.fireEmbeddableEvent(
@@ -289,7 +289,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof QueryDescriptor) {
                 QueryDescriptor query = (QueryDescriptor) content;
 
-                query.setName(UniqueNameGenerator.generate(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
+                query.setName(DuplicateNameResolver.resolve(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
                 query.setDataMap(dataMap);
 
                 dataMap.addQueryDescriptor(query);
@@ -298,7 +298,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof Procedure) {
                 // paste Procedure to DataMap
                 Procedure procedure = (Procedure) content;
-                procedure.setName(UniqueNameGenerator.generate(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
+                procedure.setName(DuplicateNameResolver.resolve(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
 
                 dataMap.addProcedure(procedure);
                 CreateProcedureAction.fireProcedureEvent(
@@ -313,7 +313,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof DbAttribute) {
                 DbAttribute attr = (DbAttribute) content;
-                attr.setName(UniqueNameGenerator.generate(NameCheckers.dbAttribute, COPY_PATTERN, dbEntity, attr.getName()));
+                attr.setName(DuplicateNameResolver.resolve(NameCheckers.dbAttribute, COPY_PATTERN, dbEntity, attr.getName()));
 
                 dbEntity.addAttribute(attr);
                 CreateAttributeAction.fireDbAttributeEvent(this, mediator, mediator
@@ -321,7 +321,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
             else if (content instanceof DbRelationship) {
                 DbRelationship rel = (DbRelationship) content;
-                rel.setName(UniqueNameGenerator.generate(NameCheckers.dbRelationship, COPY_PATTERN, dbEntity, rel.getName()));
+                rel.setName(DuplicateNameResolver.resolve(NameCheckers.dbRelationship, COPY_PATTERN, dbEntity, rel.getName()));
 
                 dbEntity.addRelationship(rel);
                 CreateRelationshipAction.fireDbRelationshipEvent(
@@ -337,7 +337,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof ObjAttribute) {
                 ObjAttribute attr = (ObjAttribute) content;
-                attr.setName(UniqueNameGenerator.generate(NameCheckers.objAttribute, COPY_PATTERN, objEntity, attr.getName()));
+                attr.setName(DuplicateNameResolver.resolve(NameCheckers.objAttribute, COPY_PATTERN, objEntity, attr.getName()));
 
                 objEntity.addAttribute(attr);
                 CreateAttributeAction.fireObjAttributeEvent(this, mediator, mediator
@@ -345,7 +345,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
             else if (content instanceof ObjRelationship) {
                 ObjRelationship rel = (ObjRelationship) content;
-                rel.setName(UniqueNameGenerator.generate(NameCheckers.objRelationship, COPY_PATTERN, objEntity, rel.getName()));
+                rel.setName(DuplicateNameResolver.resolve(NameCheckers.objRelationship, COPY_PATTERN, objEntity, rel.getName()));
 
                 objEntity.addRelationship(rel);
                 CreateRelationshipAction.fireObjRelationshipEvent(
@@ -357,7 +357,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if(content instanceof ObjCallbackMethod) {
                 ObjCallbackMethod method = (ObjCallbackMethod) content;
 
-                method.setName(UniqueNameGenerator.generate(NameCheckers.objCallbackMethod, COPY_PATTERN, objEntity, method.getName()));
+                method.setName(DuplicateNameResolver.resolve(NameCheckers.objCallbackMethod, COPY_PATTERN, objEntity, method.getName()));
                 
                 objEntity.getCallbackMap().getCallbackDescriptor(mediator.getCurrentCallbackType().getType()).addCallbackMethod(method.getName());
 
@@ -376,7 +376,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof EmbeddableAttribute) {
                 EmbeddableAttribute attr = (EmbeddableAttribute) content;
-                attr.setName(UniqueNameGenerator.generate(NameCheckers.embeddableAttribute, COPY_PATTERN, embeddable, attr.getName()));
+                attr.setName(DuplicateNameResolver.resolve(NameCheckers.embeddableAttribute, COPY_PATTERN, embeddable, attr.getName()));
 
                 embeddable.addAttribute(attr);
                 CreateAttributeAction.fireEmbeddableAttributeEvent(
@@ -395,7 +395,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             if (content instanceof ProcedureParameter) {
                 ProcedureParameter param = (ProcedureParameter) content;
 
-                param.setName(UniqueNameGenerator.generate(NameCheckers.procedureParameter, COPY_PATTERN, procedure, param.getName()));
+                param.setName(DuplicateNameResolver.resolve(NameCheckers.procedureParameter, COPY_PATTERN, procedure, param.getName()));
 
                 procedure.addCallParameter(param);
                 CreateProcedureParameterAction.fireProcedureParameterEvent(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 13a4aa5..08c0c1f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -25,8 +25,8 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.CayenneModelerController;
 import org.apache.cayenne.modeler.ProjectController;
@@ -55,8 +55,8 @@ public class ReverseEngineeringAction extends CayenneAction {
         DataMap dataMap = projectController.getCurrentDataMap();
         DataChannelDescriptor dataChannelDescriptor = projectController.getCurrentDataChanel();
         if (dataMap == null) {
-            dataMap = new DataMap(UniqueNameGenerator.generate(NameCheckers.dataMap));
-            dataMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, projectController.getProject().getRootNode()));
+            dataMap = new DataMap(DuplicateNameResolver.resolve(NameCheckers.dataMap));
+            dataMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, projectController.getProject().getRootNode()));
             dataChannelDescriptor.getDataMaps().add(dataMap);
             getProjectController().fireDataMapEvent(new DataMapEvent(this, dataMap, MapEvent.ADD));
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
index 03db3fe..9284881 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
@@ -46,8 +46,8 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit;
@@ -292,7 +292,7 @@ public class ResolveDbRelationshipDialog extends CayenneDialog {
         }
 
         if (sourceEntityName == null) {
-            sourceEntityName = UniqueNameGenerator.generate(NameCheckers.dbRelationship, relationship.getSourceEntity());
+            sourceEntityName = DuplicateNameResolver.resolve(NameCheckers.dbRelationship, relationship.getSourceEntity());
         }
 
         if (!validateName(relationship.getSourceEntity(), relationship, sourceEntityName)) {
@@ -305,7 +305,7 @@ public class ResolveDbRelationshipDialog extends CayenneDialog {
         }
 
         if (targetEntityName == null) {
-            targetEntityName = UniqueNameGenerator.generate(NameCheckers.dbRelationship, relationship.getTargetEntity());
+            targetEntityName = DuplicateNameResolver.resolve(NameCheckers.dbRelationship, relationship.getTargetEntity());
         }
 
         // check if reverse name is valid

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/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 cbcb34e..acaafdf 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
@@ -35,8 +35,8 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
@@ -335,8 +335,8 @@ public class DbLoaderHelper {
             DbLoaderHelper.this.existingMap = dataMap != null;
 
             if (!existingMap) {
-                dataMap = new DataMap(UniqueNameGenerator.generate(NameCheckers.dataMap));
-                dataMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, mediator.getProject().getRootNode()));
+                dataMap = new DataMap(DuplicateNameResolver.resolve(NameCheckers.dataMap));
+                dataMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, mediator.getProject().getRootNode()));
             }
 
             if (isCanceled()) {
@@ -351,7 +351,7 @@ public class DbLoaderHelper {
                     reverseEngineering.setConfigurationSource(dataMap.getReverseEngineering().getConfigurationSource());
                 }
             } else {
-                reverseEngineering.setName(UniqueNameGenerator.generate(NameCheckers.reverseEngineering, dataChannelDescriptor));
+                reverseEngineering.setName(DuplicateNameResolver.resolve(NameCheckers.reverseEngineering, dataChannelDescriptor));
             }
 
             if (dataMap.getConfigurationSource() != null) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
index dd2c71d..8b0dd85 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
@@ -29,8 +29,8 @@ import org.apache.cayenne.configuration.event.QueryEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.QueryDisplayEvent;
 import org.apache.cayenne.modeler.undo.CreateQueryUndoableEdit;
@@ -119,7 +119,7 @@ public class QueryType extends CayenneController{
         String queryType = getSelectedQuery();
 
         // update query...
-        String queryName = UniqueNameGenerator.generate(NameCheckers.query, dataMap);
+        String queryName = DuplicateNameResolver.resolve(NameCheckers.query, dataMap);
 
         QueryDescriptor query = QueryDescriptor.descriptor(queryType);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
index 932e345..790b98a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackType.java
@@ -18,40 +18,26 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.editor;
 
-import java.io.Serializable;
-
 import org.apache.cayenne.map.LifecycleEvent;
-import org.apache.cayenne.dbsync.reverse.naming.NameConverter;
+import org.apache.cayenne.util.Util;
+
+import java.io.Serializable;
 
 /**
  * Entity for callback type. Contains type and type name
- * 
+ *
  * @version 1.0 Oct 26, 2007
  */
 
 public class CallbackType implements Serializable {
 
     private LifecycleEvent type;
-
-    /**
-     * callback type name
-     */
     private String name;
-
-    /**
-     * methods counter
-     */
     private int counter;
 
-    /**
-     * constructor
-     * 
-     * @param type type id
-     * @param name name
-     */
     public CallbackType(LifecycleEvent type) {
         this.type = type;
-        this.name = NameConverter.underscoredToJava(type.name(), true);
+        this.name = Util.underscoredToJava(type.name(), true);
         this.counter = 0;
     }
 
@@ -78,7 +64,7 @@ public class CallbackType implements Serializable {
 
     /**
      * Method to specify counter value
-     * 
+     *
      * @param counter new coutner value
      */
     public void setCounter(int counter) {
@@ -91,11 +77,9 @@ public class CallbackType implements Serializable {
     public String toString() {
         if (counter <= 0) {
             return name;
-        }
-        else if (counter == 1) {
+        } else if (counter == 1) {
             return name + " (1 method)";
-        }
-        else {
+        } else {
             return name + " (" + counter + " methods)";
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-wocompat/pom.xml
----------------------------------------------------------------------
diff --git a/modeler/cayenne-wocompat/pom.xml b/modeler/cayenne-wocompat/pom.xml
index d52ed09..cd57281 100644
--- a/modeler/cayenne-wocompat/pom.xml
+++ b/modeler/cayenne-wocompat/pom.xml
@@ -46,6 +46,12 @@
 			<artifactId>cayenne-server</artifactId>
 			<version>${project.version}</version>
 		</dependency>
+
+		<dependency>
+			<groupId>org.apache.cayenne</groupId>
+			<artifactId>cayenne-dbsync</artifactId>
+			<version>${project.version}</version>
+		</dependency>
 	</dependencies>
 
     <profiles>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ad944755/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
index 82bfa91..fac6202 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
@@ -19,6 +19,30 @@
 
 package org.apache.cayenne.wocompat;
 
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
+import org.apache.cayenne.dbsync.naming.NameCheckers;
+import org.apache.cayenne.exp.ExpressionException;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.map.SQLTemplateDescriptor;
+import org.apache.cayenne.map.SelectQueryDescriptor;
+import org.apache.cayenne.query.Ordering;
+import org.apache.cayenne.query.QueryMetadata;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.wocompat.parser.Parser;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.PredicateUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import java.io.File;
 import java.io.InputStream;
 import java.net.URL;
@@ -31,19 +55,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
-import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.exp.ExpressionException;
-import org.apache.cayenne.map.*;
-import org.apache.cayenne.map.naming.UniqueNameGenerator;
-import org.apache.cayenne.map.naming.NameCheckers;
-import org.apache.cayenne.query.*;
-import org.apache.cayenne.wocompat.parser.Parser;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.PredicateUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 /**
  * Class for converting stored Apple EOModel mapping files to Cayenne DataMaps.
@@ -716,7 +727,7 @@ public class EOModelProcessor {
 			if (relationship.getReverseRelationship() == null) {
 				DbRelationship reverse = relationship.createReverseRelationship();
 
-				String name = UniqueNameGenerator.generate(NameCheckers.dbRelationship,
+				String name = DuplicateNameResolver.resolve(NameCheckers.dbRelationship,
 						reverse.getSourceEntity(), relationship.getName() + "Reverse");
 				reverse.setName(name);
 				relationship.getTargetEntity().addRelationship(reverse);


[2/5] cayenne git commit: CAY-2116 Split schema synchronization code in a separate module

Posted by aa...@apache.org.
CAY-2116 Split schema synchronization code in a separate module


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

Branch: refs/heads/master
Commit: 633303cfac84cdffad50420b0ce5967e95771ca9
Parents: 3e03bc1
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Fri Sep 30 17:34:49 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Fri Sep 30 18:04:04 2016 +0300

----------------------------------------------------------------------
 .../dbsync/merge/EntityMergeSupport.java        |  6 +-
 .../cayenne/dbsync/reverse/db/DbLoader.java     |  6 +-
 .../reverse/db/ManyToManyCandidateEntity.java   |  4 +-
 .../java/org/apache/cayenne/map/ObjEntity.java  | 29 +++---
 .../map/naming/DefaultUniqueNameGenerator.java  | 96 --------------------
 .../apache/cayenne/map/naming/NameChecker.java  |  1 -
 .../cayenne/map/naming/UniqueNameGenerator.java | 71 +++++++++++++--
 .../cayenne/map/naming/NameCheckersTest.java    | 38 ++++----
 .../modeler/action/CreateAttributeAction.java   |  8 +-
 .../action/CreateCallbackMethodAction.java      |  4 +-
 .../modeler/action/CreateDataMapAction.java     |  4 +-
 .../modeler/action/CreateDbEntityAction.java    |  4 +-
 .../modeler/action/CreateEmbeddableAction.java  |  4 +-
 .../modeler/action/CreateNodeAction.java        |  4 +-
 .../modeler/action/CreateObjEntityAction.java   |  6 +-
 .../modeler/action/CreateProcedureAction.java   |  4 +-
 .../action/CreateProcedureParameterAction.java  |  4 +-
 .../action/CreateRelationshipAction.java        |  6 +-
 .../modeler/action/ImportDataMapAction.java     |  6 +-
 .../modeler/action/ImportEOModelAction.java     |  4 +-
 .../modeler/action/NewProjectAction.java        |  4 +-
 .../cayenne/modeler/action/PasteAction.java     | 38 ++++----
 .../action/ReverseEngineeringAction.java        | 14 +--
 .../dialog/ResolveDbRelationshipDialog.java     |  6 +-
 .../modeler/dialog/db/DbLoaderHelper.java       |  8 +-
 .../cayenne/modeler/dialog/query/QueryType.java |  4 +-
 .../cayenne/wocompat/EOModelProcessor.java      |  4 +-
 27 files changed, 170 insertions(+), 217 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
index cabdb4d..7db68af 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/EntityMergeSupport.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
@@ -205,7 +205,7 @@ public class EntityMergeSupport {
 
     private boolean createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) {
         String relationshipName = nameGenerator.createObjRelationshipName(dr);
-        relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName);
+        relationshipName = UniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName);
 
         ObjRelationship or = new ObjRelationship(relationshipName);
         or.addDbRelationship(dr);
@@ -279,7 +279,7 @@ public class EntityMergeSupport {
     }
 
     private void addMissingAttribute(ObjEntity entity, DbAttribute da) {
-        String attrName = DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, entity,
+        String attrName = UniqueNameGenerator.generate(NameCheckers.objAttribute, entity,
                 nameGenerator.createObjAttributeName(da));
 
         String type = TypesMapping.getJavaBySqlType(da.getType());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
index 2811981..5f233cd 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
@@ -34,7 +34,7 @@ import org.apache.cayenne.map.DbRelationshipDetected;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.dbsync.reverse.naming.LegacyObjectNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
@@ -133,7 +133,7 @@ public class DbLoader {
                 continue;
             }
 
-            String objEntityName = DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, map,
+            String objEntityName = UniqueNameGenerator.generate(NameCheckers.objEntity, map,
                     nameGenerator.createObjEntityName(dbEntity));
 
             ObjEntity objEntity = new ObjEntity(objEntityName);
@@ -439,7 +439,7 @@ public class DbLoader {
 
     private String generateName(DbEntity entity, ExportedKey key, boolean toMany) {
         String forwardPreferredName = nameGenerator.createDbRelationshipName(key, toMany);
-        return DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship, entity, forwardPreferredName);
+        return UniqueNameGenerator.generate(NameCheckers.dbRelationship, entity, forwardPreferredName);
     }
 
     private void fireObjEntitiesAddedEvents(Collection<ObjEntity> loadedObjEntities) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
index 718015b..06c7d82 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/ManyToManyCandidateEntity.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.reverse.db;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.dbsync.reverse.naming.ObjectNameGenerator;
 import org.apache.commons.logging.Log;
@@ -113,7 +113,7 @@ class ManyToManyCandidateEntity {
                 (short) 1);
 
         ObjRelationship newRelationship = new ObjRelationship();
-        newRelationship.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, srcEntity,
+        newRelationship.setName(UniqueNameGenerator.generate(NameCheckers.objRelationship, srcEntity,
                 nameGenerator.createDbRelationshipName(key, true)));
 
         newRelationship.setSourceEntity(srcEntity);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
index 94ddfca..de79a6a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
@@ -19,19 +19,6 @@
 
 package org.apache.cayenne.map;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
@@ -42,12 +29,24 @@ import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.ObjEntityListener;
-import org.apache.cayenne.map.naming.NameConverter;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
 import org.apache.commons.collections.Transformer;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
 /**
  * ObjEntity is a mapping descriptor for a DataObject Java class. It contains
  * the information about the Java class itself, as well as its mapping to the
@@ -678,7 +677,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
 
             // create synthetic attribute
             if (attribute == null) {
-                attribute = new SyntheticPKObjAttribute(NameConverter.underscoredToJava(pk.getName(), false));
+                attribute = new SyntheticPKObjAttribute(pk.getName());
                 attribute.setDbAttributePath(pk.getName());
                 attribute.setType(TypesMapping.getJavaBySqlType(pk.getType()));
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-server/src/main/java/org/apache/cayenne/map/naming/DefaultUniqueNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/DefaultUniqueNameGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/DefaultUniqueNameGenerator.java
deleted file mode 100644
index 409a48e..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/DefaultUniqueNameGenerator.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    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.map.naming;
-
-import org.apache.cayenne.map.DataMap;
-
-/**
- * @since 4.0
- */
-public class DefaultUniqueNameGenerator implements UniqueNameGenerator {
-
-    public static final String DEFAULT_PATTERN = "%s%d";
-
-    private final NameChecker nameChecker;
-
-    private final String pattern;
-
-    public static String generate(NameChecker checker) {
-        return generate(checker, DEFAULT_PATTERN, null, null);
-    }
-
-    public static String generate(NameChecker checker, Object context) {
-        return generate(checker, DEFAULT_PATTERN, context, null);
-    }
-
-    public static String generate(NameChecker checker, Object context, String baseName) {
-        return generate(checker, DEFAULT_PATTERN, context, baseName);
-    }
-
-    public static String generate(NameChecker checker, String pattern, Object context, String baseName) {
-        DefaultUniqueNameGenerator generator;
-        if (checker == NameCheckers.embeddable) {
-            generator = new DefaultUniqueNameGenerator(NameCheckers.embeddable, pattern) {
-                @Override
-                public String generate(Object namingContext, String nameBase) {
-                    return ((DataMap) namingContext).getNameWithDefaultPackage(super.generate(namingContext, nameBase));
-                }
-            };
-        } else {
-            generator = new DefaultUniqueNameGenerator(checker, pattern);
-        }
-
-        return generator.generate(context, baseName);
-    }
-
-
-
-    public DefaultUniqueNameGenerator(NameChecker nameChecker, String pattern) {
-        this.nameChecker = nameChecker;
-        this.pattern = pattern;
-    }
-
-    /**
-     * Creates a unique name for the new object and constructs this object.
-     */
-    public String generate(Object namingContext) {
-        return generate(namingContext, nameChecker.baseName());
-    }
-
-    /**
-     * @since 1.0.5
-     */
-    public String generate(Object namingContext, String nameBase) {
-        return generate(pattern, namingContext, nameBase != null ? nameBase : nameChecker.baseName());
-    }
-
-    /**
-     * @since 1.0.5
-     */
-    private String generate(String pattern, Object namingContext, String nameBase) {
-        int c = 1;
-        String name = nameBase;
-        while (nameChecker.isNameInUse(namingContext, name)) {
-            name = String.format(pattern, nameBase, c++);
-        }
-
-        return name;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
index 573e25a..68fdfd3 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/NameChecker.java
@@ -25,7 +25,6 @@ public interface NameChecker {
 
 	/**
 	 * Returns a base default name, like "UntitledEntity", etc.
-	 * 
 	 */
 	String baseName();
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
index d56f856..2fe6801 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/naming/UniqueNameGenerator.java
@@ -18,15 +18,74 @@
  ****************************************************************/
 package org.apache.cayenne.map.naming;
 
+import org.apache.cayenne.map.DataMap;
+
 /**
- * A "filter" for the mapping artifact names generated elsewhere that ensures no
- * duplicate names are generated.
- * 
  * @since 4.0
  */
-public interface UniqueNameGenerator {
+public class UniqueNameGenerator {
+
+    public static final String DEFAULT_PATTERN = "%s%d";
+
+    private final NameChecker nameChecker;
+
+    private final String pattern;
+
+    public UniqueNameGenerator(NameChecker nameChecker, String pattern) {
+        this.nameChecker = nameChecker;
+        this.pattern = pattern;
+    }
+
+    public static String generate(NameChecker checker) {
+        return generate(checker, DEFAULT_PATTERN, null, null);
+    }
+
+    public static String generate(NameChecker checker, Object context) {
+        return generate(checker, DEFAULT_PATTERN, context, null);
+    }
+
+    public static String generate(NameChecker checker, Object context, String baseName) {
+        return generate(checker, DEFAULT_PATTERN, context, baseName);
+    }
+
+    public static String generate(NameChecker checker, String pattern, Object context, String baseName) {
+        UniqueNameGenerator generator;
+        if (checker == NameCheckers.embeddable) {
+            generator = new UniqueNameGenerator(NameCheckers.embeddable, pattern) {
+                @Override
+                public String generate(Object namingContext, String nameBase) {
+                    return ((DataMap) namingContext).getNameWithDefaultPackage(super.generate(namingContext, nameBase));
+                }
+            };
+        } else {
+            generator = new UniqueNameGenerator(checker, pattern);
+        }
+
+        return generator.generate(context, baseName);
+    }
+
+    /**
+     * Creates a unique name for the new object and constructs this object.
+     */
+    String generate(Object namingContext) {
+        return generate(namingContext, nameChecker.baseName());
+    }
+
+    String generate(Object namingContext, String nameBase) {
+        return generate(pattern, namingContext, nameBase != null ? nameBase : nameChecker.baseName());
+    }
+
+    /**
+     * @since 1.0.5
+     */
+    private String generate(String pattern, Object namingContext, String nameBase) {
+        int c = 1;
+        String name = nameBase;
+        while (nameChecker.isNameInUse(namingContext, name)) {
+            name = String.format(pattern, nameBase, c++);
+        }
 
-	String generate(Object namingContext);
+        return name;
+    }
 
-	String generate(Object namingContext, String nameBase);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
index ad67222..e3e6628 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/naming/NameCheckersTest.java
@@ -47,35 +47,35 @@ public class NameCheckersTest {
         ObjEntity namingContainer = new ObjEntity();
 
         String baseName = maker.baseName();
-        String name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        String name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName, name);
         namingContainer.addAttribute(new ObjAttribute(name));
 
-        name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName + "1", name);
         namingContainer.addAttribute(new ObjAttribute(name));
 
-        name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName + "2", name);
         namingContainer.addAttribute(new ObjAttribute(name));
 
-        name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName + "3", name);
         namingContainer.addAttribute(new ObjAttribute(name));
 
         maker = NameCheckers.objRelationship;
         baseName = maker.baseName();
-        name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName, name);
         namingContainer.addRelationship(new ObjRelationship(name));
 
-        name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName + "1", name);
         namingContainer.addRelationship(new ObjRelationship(name));
 
         maker = NameCheckers.objCallbackMethod;
         baseName = maker.baseName();
-        name = DefaultUniqueNameGenerator.generate(maker, namingContainer);
+        name = UniqueNameGenerator.generate(maker, namingContainer);
         assertEquals(baseName, name);
         namingContainer.addRelationship(new ObjRelationship(name));
     }
@@ -152,8 +152,8 @@ public class NameCheckersTest {
 
     private void checkNameAndOther(Object namingContainer, NameCheckers maker, String newName) {
         assertTrue(maker.isNameInUse(namingContainer, newName));
-        assertEquals(newName + "1", DefaultUniqueNameGenerator.generate(maker,namingContainer, newName));
-        assertEquals("other" + newName, DefaultUniqueNameGenerator.generate(maker,namingContainer, "other" + newName));
+        assertEquals(newName + "1", UniqueNameGenerator.generate(maker,namingContainer, newName));
+        assertEquals("other" + newName, UniqueNameGenerator.generate(maker,namingContainer, "other" + newName));
     }
 
     @Test
@@ -161,13 +161,13 @@ public class NameCheckersTest {
         ObjEntity namingContainer = new ObjEntity();
 
         namingContainer.addAttribute(new ObjAttribute("myName"));
-        Assert.assertEquals("getMyName1", DefaultUniqueNameGenerator.generate(NameCheckers.objCallbackMethod, namingContainer, "getMyName"));
+        Assert.assertEquals("getMyName1", UniqueNameGenerator.generate(NameCheckers.objCallbackMethod, namingContainer, "getMyName"));
 
         namingContainer.getCallbackMap().getPostAdd().addCallbackMethod("getSecondName");
-        Assert.assertEquals("SecondName1", DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "SecondName"));
-        Assert.assertEquals("secondName1", DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "secondName"));
-        Assert.assertEquals("SecondName1", DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, namingContainer, "SecondName"));
-        Assert.assertEquals("secondName1", DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, namingContainer, "secondName"));
+        Assert.assertEquals("SecondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "SecondName"));
+        Assert.assertEquals("secondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "secondName"));
+        Assert.assertEquals("SecondName1", UniqueNameGenerator.generate(NameCheckers.objRelationship, namingContainer, "SecondName"));
+        Assert.assertEquals("secondName1", UniqueNameGenerator.generate(NameCheckers.objRelationship, namingContainer, "secondName"));
     }
 
     @Test
@@ -179,8 +179,8 @@ public class NameCheckersTest {
         Assert.assertFalse(NameCheckers.objAttribute.isNameInUse(namingContainer, "MyName"));
 
         namingContainer.getCallbackMap().getPostAdd().addCallbackMethod("getSecondName");
-        Assert.assertEquals("SecondName1", DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "SecondName"));
-        Assert.assertEquals("secondName1", DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "secondName"));
+        Assert.assertEquals("SecondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "SecondName"));
+        Assert.assertEquals("secondName1", UniqueNameGenerator.generate(NameCheckers.objAttribute, namingContainer, "secondName"));
     }
 
     @Test
@@ -189,16 +189,16 @@ public class NameCheckersTest {
 
         map.addEmbeddable(new Embeddable("name"));
         Assert.assertTrue(NameCheckers.embeddable.isNameInUse(map, "name"));
-        Assert.assertEquals("name1", DefaultUniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
+        Assert.assertEquals("name1", UniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
         Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "other-name"));
 
         map.setDefaultPackage("package");
         Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "name"));
-        Assert.assertEquals("package.name", DefaultUniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
+        Assert.assertEquals("package.name", UniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
         map.addEmbeddable(new Embeddable("package.name"));
 
         Assert.assertTrue(NameCheckers.embeddable.isNameInUse(map, "name"));
-        Assert.assertEquals("package.name1", DefaultUniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
+        Assert.assertEquals("package.name1", UniqueNameGenerator.generate(NameCheckers.embeddable, map, "name"));
         Assert.assertFalse(NameCheckers.embeddable.isNameInUse(map, "other-name"));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
index 371a84b..970aafb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
@@ -36,7 +36,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EmbeddableAttributeEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -77,7 +77,7 @@ public class CreateAttributeAction extends CayenneAction {
             Embeddable embeddable = mediator.getCurrentEmbeddable();
 
             EmbeddableAttribute attr = new EmbeddableAttribute();
-            attr.setName(DefaultUniqueNameGenerator.generate(NameCheckers.embeddableAttribute, embeddable));
+            attr.setName(UniqueNameGenerator.generate(NameCheckers.embeddableAttribute, embeddable));
 
             createEmbAttribute(embeddable, attr);
 
@@ -89,7 +89,7 @@ public class CreateAttributeAction extends CayenneAction {
 
             ObjEntity objEntity = mediator.getCurrentObjEntity();
 
-            ObjAttribute attr = new ObjAttribute(DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, objEntity), null, objEntity);
+            ObjAttribute attr = new ObjAttribute(UniqueNameGenerator.generate(NameCheckers.objAttribute, objEntity), null, objEntity);
 
             createObjAttribute(mediator.getCurrentDataMap(), objEntity, attr);
 
@@ -99,7 +99,7 @@ public class CreateAttributeAction extends CayenneAction {
         } else if (getProjectController().getCurrentDbEntity() != null) {
             DbEntity dbEntity = getProjectController().getCurrentDbEntity();
 
-            DbAttribute attr = new DbAttribute(DefaultUniqueNameGenerator.generate(NameCheckers.dbAttribute, dbEntity),
+            DbAttribute attr = new DbAttribute(UniqueNameGenerator.generate(NameCheckers.dbAttribute, dbEntity),
                     TypesMapping.NOT_DEFINED, dbEntity);
 
             createDbAttribute(mediator.getCurrentDataMap(), dbEntity, attr);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
index 150241c..5835ac9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
@@ -23,7 +23,7 @@ import java.awt.event.ActionEvent;
 import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.editor.CallbackType;
@@ -78,7 +78,7 @@ public class CreateCallbackMethodAction extends CayenneAction {
 
         // generate methodName
         String methodNamePrefix = toMethodName(callbackType.getType());
-        String methodName = DefaultUniqueNameGenerator.generate(NameCheckers.objCallbackMethod, getProjectController().getCurrentObjEntity(), methodNamePrefix);
+        String methodName = UniqueNameGenerator.generate(NameCheckers.objCallbackMethod, getProjectController().getCurrentObjEntity(), methodNamePrefix);
 
         createCallbackMethod(callbackType, methodName);
         application.getUndoManager().addEdit(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
index dccafcb..aecc843 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -63,7 +63,7 @@ public class CreateDataMapAction extends CayenneAction {
                 .getProject()
                 .getRootNode();
 
-        DataMap map = new DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, currentDomain));
+        DataMap map = new DataMap(UniqueNameGenerator.generate(NameCheckers.dataMap, currentDomain));
 
         createDataMap(map);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
index c34d686..ec2520b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -63,7 +63,7 @@ public class CreateDbEntityAction extends CayenneAction {
 		ProjectController mediator = getProjectController();
 
 		DataMap map = mediator.getCurrentDataMap();
-		DbEntity entity = new DbEntity(DefaultUniqueNameGenerator.generate(NameCheckers.dbEntity, map));
+		DbEntity entity = new DbEntity(UniqueNameGenerator.generate(NameCheckers.dbEntity, map));
 
 		createEntity(map, entity);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
index 6466f57..05a00a4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -56,7 +56,7 @@ public class CreateEmbeddableAction extends CayenneAction {
 
         DataMap dataMap = mediator.getCurrentDataMap();
 
-        Embeddable embeddable = new Embeddable(DefaultUniqueNameGenerator.generate(NameCheckers.embeddable, mediator.getCurrentDataMap()));
+        Embeddable embeddable = new Embeddable(UniqueNameGenerator.generate(NameCheckers.embeddable, mediator.getCurrentDataMap()));
         createEmbeddable(dataMap, embeddable);
 
         application.getUndoManager().addEdit(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
index d8b7cbd..4dfc3f3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.configuration.event.DataNodeEvent;
 import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -104,7 +104,7 @@ public class CreateNodeAction extends CayenneAction {
 	 * A factory method that makes a new DataNode.
 	 */
 	DataNodeDescriptor buildDataNode(DataChannelDescriptor domain) {
-		DataNodeDescriptor node = new DataNodeDescriptor(DefaultUniqueNameGenerator.generate(
+		DataNodeDescriptor node = new DataNodeDescriptor(UniqueNameGenerator.generate(
 				NameCheckers.dataNodeDescriptor, domain));
 		node.setDataChannelDescriptor(domain);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/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 a4f54fc..cb656d9 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
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.map.naming.NameConverter;
 import org.apache.cayenne.modeler.Application;
@@ -69,7 +69,7 @@ public class CreateObjEntityAction extends CayenneAction {
         ProjectController mediator = getProjectController();
 
         DataMap dataMap = mediator.getCurrentDataMap();
-        ObjEntity entity = new ObjEntity(DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, dataMap));
+        ObjEntity entity = new ObjEntity(UniqueNameGenerator.generate(NameCheckers.objEntity, dataMap));
 
         // init defaults
         entity.setSuperClassName(dataMap.getDefaultSuperclass());
@@ -79,7 +79,7 @@ public class CreateObjEntityAction extends CayenneAction {
         if (dbEntity != null) {
             entity.setDbEntity(dbEntity);
             String baseName = NameConverter.underscoredToJava(dbEntity.getName(), true);
-            entity.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, dbEntity.getDataMap(), baseName));
+            entity.setName(UniqueNameGenerator.generate(NameCheckers.objEntity, dbEntity.getDataMap(), baseName));
         }
 
         entity.setClassName(dataMap.getNameWithDefaultPackage(entity.getName()));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
index 1c5397f..ba060b8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.configuration.event.ProcedureEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -52,7 +52,7 @@ public class CreateProcedureAction extends CayenneAction {
 		ProjectController mediator = getProjectController();
 		DataMap map = mediator.getCurrentDataMap();
 
-		Procedure procedure = new Procedure(DefaultUniqueNameGenerator.generate(NameCheckers.procedure, map));
+		Procedure procedure = new Procedure(UniqueNameGenerator.generate(NameCheckers.procedure, map));
 
 		createProcedure(map, procedure);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
index cc2f0ee..70aaa5c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.configuration.event.ProcedureParameterEvent;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -64,7 +64,7 @@ public class CreateProcedureParameterAction extends CayenneAction {
 	public void createProcedureParameter() {
 		Procedure procedure = getProjectController().getCurrentProcedure();
 
-		ProcedureParameter parameter = new ProcedureParameter(DefaultUniqueNameGenerator.generate(
+		ProcedureParameter parameter = new ProcedureParameter(UniqueNameGenerator.generate(
 				NameCheckers.procedureParameter, procedure));
 		procedure.addCallParameter(parameter);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
index 9a4ef96..1f62b77 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
@@ -31,7 +31,7 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -66,7 +66,7 @@ public class CreateRelationshipAction extends CayenneAction {
 		ObjEntity objEnt = getProjectController().getCurrentObjEntity();
 		if (objEnt != null) {
 
-			ObjRelationship rel = new ObjRelationship(DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship,
+			ObjRelationship rel = new ObjRelationship(UniqueNameGenerator.generate(NameCheckers.objRelationship,
 					objEnt));
 			createObjRelationship(objEnt, rel);
 
@@ -76,7 +76,7 @@ public class CreateRelationshipAction extends CayenneAction {
 			DbEntity dbEnt = getProjectController().getCurrentDbEntity();
 			if (dbEnt != null) {
 
-				DbRelationship rel = new DbRelationship(DefaultUniqueNameGenerator.generate(
+				DbRelationship rel = new DbRelationship(UniqueNameGenerator.generate(
 						NameCheckers.dbRelationship, dbEnt));
 				createDbRelationship(dbEnt, rel);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
index 4466ce4..f662b64 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
@@ -31,7 +31,7 @@ import javax.swing.JOptionPane;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.FSPath;
@@ -85,9 +85,9 @@ public class ImportDataMapAction extends CayenneAction {
 			DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController().getProject().getRootNode();
 
 			if (newMap.getName() != null) {
-				newMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain, newMap.getName()));
+				newMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, domain, newMap.getName()));
 			} else {
-				newMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain));
+				newMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, domain));
 			}
 
 			Resource baseResource = domain.getConfigurationSource();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
index 5466d3b..8672759 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
@@ -45,7 +45,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -302,7 +302,7 @@ public class ImportEOModelAction extends CayenneAction {
         else {
             // fix DataMap name, as there maybe a map with the same name already
             DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
-            map.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain, map.getName()));
+            map.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, domain, map.getName()));
 
             // side effect of this operation is that if a node was created, this DataMap
             // will be linked with it...

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
index d897350..b088fd1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
@@ -27,7 +27,7 @@ import javax.swing.KeyStroke;
 
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.CayenneModelerController;
@@ -68,7 +68,7 @@ public class NewProjectAction extends ProjectAction {
 
         DataChannelDescriptor domain = new DataChannelDescriptor();
 
-        domain.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataChannelDescriptor, domain));
+        domain.setName(UniqueNameGenerator.generate(NameCheckers.dataChannelDescriptor, domain));
 
         Project project = new Project(
                 new ConfigurationTree<DataChannelDescriptor>(domain));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
index e1885b9..2291544 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
@@ -35,7 +35,7 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -171,7 +171,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             // paste DataMap to DataDomain or DataNode
             DataMap dataMap = ((DataMap) content);
 
-            dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, COPY_PATTERN, domain, dataMap.getName()));
+            dataMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, COPY_PATTERN, domain, dataMap.getName()));
 
             /**
              * Update all names in the new DataMap, so that they would not conflict with
@@ -187,7 +187,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             for (DbEntity dbEntity : dataMap.getDbEntities()) {
                 String oldName = dbEntity.getName();
-                dbEntity.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
+                dbEntity.setName(UniqueNameGenerator.generate(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
 
                 if (!oldName.equals(dbEntity.getName())) {
                     renamedDbEntities.put(oldName, dbEntity.getName());
@@ -195,7 +195,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
             for (ObjEntity objEntity : dataMap.getObjEntities()) {
                 String oldName = objEntity.getName();
-                objEntity.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
+                objEntity.setName(UniqueNameGenerator.generate(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
 
                 if (!oldName.equals(objEntity.getName())) {
                     renamedObjEntities.put(oldName, objEntity.getName());
@@ -204,7 +204,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             for (Embeddable embeddable : dataMap.getEmbeddables()) {
                 String oldName = embeddable.getClassName();
-                embeddable.setClassName(DefaultUniqueNameGenerator.generate(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
+                embeddable.setClassName(UniqueNameGenerator.generate(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
 
                 if (!oldName.equals(embeddable.getClassName())) {
                     renamedEmbeddables.put(oldName, embeddable.getClassName());
@@ -212,10 +212,10 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
 
             for (Procedure procedure : dataMap.getProcedures()) {
-                procedure.setName(DefaultUniqueNameGenerator.generate(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
+                procedure.setName(UniqueNameGenerator.generate(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
             }
             for (QueryDescriptor query : dataMap.getQueryDescriptors()) {
-                query.setName(DefaultUniqueNameGenerator.generate(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
+                query.setName(UniqueNameGenerator.generate(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
             }
 
             // if an entity was renamed, we rename all links to it too
@@ -257,7 +257,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof DbEntity) {
                 DbEntity dbEntity = (DbEntity) content;
-                dbEntity.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
+                dbEntity.setName(UniqueNameGenerator.generate(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
 
                 dataMap.addDbEntity(dbEntity);
                 CreateDbEntityAction.fireDbEntityEvent(this, mediator, dbEntity);
@@ -265,7 +265,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof ObjEntity) {
                 // paste ObjEntity to DataMap
                 ObjEntity objEntity = (ObjEntity) content;
-                objEntity.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
+                objEntity.setName(UniqueNameGenerator.generate(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
 
                 dataMap.addObjEntity(objEntity);
                 CreateObjEntityAction.fireObjEntityEvent(
@@ -277,7 +277,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof Embeddable) {
                 // paste Embeddable to DataMap
                 Embeddable embeddable = (Embeddable) content;
-                embeddable.setClassName(DefaultUniqueNameGenerator.generate(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
+                embeddable.setClassName(UniqueNameGenerator.generate(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
 
                 dataMap.addEmbeddable(embeddable);
                 CreateEmbeddableAction.fireEmbeddableEvent(
@@ -289,7 +289,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof QueryDescriptor) {
                 QueryDescriptor query = (QueryDescriptor) content;
 
-                query.setName(DefaultUniqueNameGenerator.generate(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
+                query.setName(UniqueNameGenerator.generate(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
                 query.setDataMap(dataMap);
 
                 dataMap.addQueryDescriptor(query);
@@ -298,7 +298,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if (content instanceof Procedure) {
                 // paste Procedure to DataMap
                 Procedure procedure = (Procedure) content;
-                procedure.setName(DefaultUniqueNameGenerator.generate(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
+                procedure.setName(UniqueNameGenerator.generate(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
 
                 dataMap.addProcedure(procedure);
                 CreateProcedureAction.fireProcedureEvent(
@@ -313,7 +313,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof DbAttribute) {
                 DbAttribute attr = (DbAttribute) content;
-                attr.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dbAttribute, COPY_PATTERN, dbEntity, attr.getName()));
+                attr.setName(UniqueNameGenerator.generate(NameCheckers.dbAttribute, COPY_PATTERN, dbEntity, attr.getName()));
 
                 dbEntity.addAttribute(attr);
                 CreateAttributeAction.fireDbAttributeEvent(this, mediator, mediator
@@ -321,7 +321,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
             else if (content instanceof DbRelationship) {
                 DbRelationship rel = (DbRelationship) content;
-                rel.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship, COPY_PATTERN, dbEntity, rel.getName()));
+                rel.setName(UniqueNameGenerator.generate(NameCheckers.dbRelationship, COPY_PATTERN, dbEntity, rel.getName()));
 
                 dbEntity.addRelationship(rel);
                 CreateRelationshipAction.fireDbRelationshipEvent(
@@ -337,7 +337,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof ObjAttribute) {
                 ObjAttribute attr = (ObjAttribute) content;
-                attr.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, COPY_PATTERN, objEntity, attr.getName()));
+                attr.setName(UniqueNameGenerator.generate(NameCheckers.objAttribute, COPY_PATTERN, objEntity, attr.getName()));
 
                 objEntity.addAttribute(attr);
                 CreateAttributeAction.fireObjAttributeEvent(this, mediator, mediator
@@ -345,7 +345,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
             else if (content instanceof ObjRelationship) {
                 ObjRelationship rel = (ObjRelationship) content;
-                rel.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, COPY_PATTERN, objEntity, rel.getName()));
+                rel.setName(UniqueNameGenerator.generate(NameCheckers.objRelationship, COPY_PATTERN, objEntity, rel.getName()));
 
                 objEntity.addRelationship(rel);
                 CreateRelationshipAction.fireObjRelationshipEvent(
@@ -357,7 +357,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             else if(content instanceof ObjCallbackMethod) {
                 ObjCallbackMethod method = (ObjCallbackMethod) content;
 
-                method.setName(DefaultUniqueNameGenerator.generate(NameCheckers.objCallbackMethod, COPY_PATTERN, objEntity, method.getName()));
+                method.setName(UniqueNameGenerator.generate(NameCheckers.objCallbackMethod, COPY_PATTERN, objEntity, method.getName()));
                 
                 objEntity.getCallbackMap().getCallbackDescriptor(mediator.getCurrentCallbackType().getType()).addCallbackMethod(method.getName());
 
@@ -376,7 +376,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof EmbeddableAttribute) {
                 EmbeddableAttribute attr = (EmbeddableAttribute) content;
-                attr.setName(DefaultUniqueNameGenerator.generate(NameCheckers.embeddableAttribute, COPY_PATTERN, embeddable, attr.getName()));
+                attr.setName(UniqueNameGenerator.generate(NameCheckers.embeddableAttribute, COPY_PATTERN, embeddable, attr.getName()));
 
                 embeddable.addAttribute(attr);
                 CreateAttributeAction.fireEmbeddableAttributeEvent(
@@ -395,7 +395,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             if (content instanceof ProcedureParameter) {
                 ProcedureParameter param = (ProcedureParameter) content;
 
-                param.setName(DefaultUniqueNameGenerator.generate(NameCheckers.procedureParameter, COPY_PATTERN, procedure, param.getName()));
+                param.setName(UniqueNameGenerator.generate(NameCheckers.procedureParameter, COPY_PATTERN, procedure, param.getName()));
 
                 procedure.addCallParameter(param);
                 CreateProcedureParameterAction.fireProcedureParameterEvent(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 287e703..13a4aa5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -20,24 +20,16 @@
 package org.apache.cayenne.modeler.action;
 
 import java.awt.event.ActionEvent;
-import java.sql.Connection;
-
-import javax.swing.SwingUtilities;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.event.DataMapEvent;
-import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.CayenneModelerController;
 import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.db.ReverseEngineeringController;
-import org.apache.cayenne.modeler.dialog.db.DbLoaderHelper;
-import org.apache.cayenne.modeler.dialog.db.ReverseEngineeringScrollPane;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
 /**
@@ -63,8 +55,8 @@ public class ReverseEngineeringAction extends CayenneAction {
         DataMap dataMap = projectController.getCurrentDataMap();
         DataChannelDescriptor dataChannelDescriptor = projectController.getCurrentDataChanel();
         if (dataMap == null) {
-            dataMap = new DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap));
-            dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, projectController.getProject().getRootNode()));
+            dataMap = new DataMap(UniqueNameGenerator.generate(NameCheckers.dataMap));
+            dataMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, projectController.getProject().getRootNode()));
             dataChannelDescriptor.getDataMaps().add(dataMap);
             getProjectController().fireDataMapEvent(new DataMapEvent(this, dataMap, MapEvent.ADD));
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
index ce79cd5..03db3fe 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
@@ -46,7 +46,7 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
@@ -292,7 +292,7 @@ public class ResolveDbRelationshipDialog extends CayenneDialog {
         }
 
         if (sourceEntityName == null) {
-            sourceEntityName = DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship, relationship.getSourceEntity());
+            sourceEntityName = UniqueNameGenerator.generate(NameCheckers.dbRelationship, relationship.getSourceEntity());
         }
 
         if (!validateName(relationship.getSourceEntity(), relationship, sourceEntityName)) {
@@ -305,7 +305,7 @@ public class ResolveDbRelationshipDialog extends CayenneDialog {
         }
 
         if (targetEntityName == null) {
-            targetEntityName = DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship, relationship.getTargetEntity());
+            targetEntityName = UniqueNameGenerator.generate(NameCheckers.dbRelationship, relationship.getTargetEntity());
         }
 
         // check if reverse name is valid

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/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 a9016c8..cbcb34e 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
@@ -35,7 +35,7 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -335,8 +335,8 @@ public class DbLoaderHelper {
             DbLoaderHelper.this.existingMap = dataMap != null;
 
             if (!existingMap) {
-                dataMap = new DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap));
-                dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, mediator.getProject().getRootNode()));
+                dataMap = new DataMap(UniqueNameGenerator.generate(NameCheckers.dataMap));
+                dataMap.setName(UniqueNameGenerator.generate(NameCheckers.dataMap, mediator.getProject().getRootNode()));
             }
 
             if (isCanceled()) {
@@ -351,7 +351,7 @@ public class DbLoaderHelper {
                     reverseEngineering.setConfigurationSource(dataMap.getReverseEngineering().getConfigurationSource());
                 }
             } else {
-                reverseEngineering.setName(DefaultUniqueNameGenerator.generate(NameCheckers.reverseEngineering, dataChannelDescriptor));
+                reverseEngineering.setName(UniqueNameGenerator.generate(NameCheckers.reverseEngineering, dataChannelDescriptor));
             }
 
             if (dataMap.getConfigurationSource() != null) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
index 41a0e2f..dd2c71d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryType.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.configuration.event.QueryEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.QueryDisplayEvent;
@@ -119,7 +119,7 @@ public class QueryType extends CayenneController{
         String queryType = getSelectedQuery();
 
         // update query...
-        String queryName = DefaultUniqueNameGenerator.generate(NameCheckers.query, dataMap);
+        String queryName = UniqueNameGenerator.generate(NameCheckers.query, dataMap);
 
         QueryDescriptor query = QueryDescriptor.descriptor(queryType);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/633303cf/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
index 9c2f561..82bfa91 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
@@ -34,7 +34,7 @@ import java.util.StringTokenizer;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.map.*;
-import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.UniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.query.*;
 import org.apache.cayenne.wocompat.parser.Parser;
@@ -716,7 +716,7 @@ public class EOModelProcessor {
 			if (relationship.getReverseRelationship() == null) {
 				DbRelationship reverse = relationship.createReverseRelationship();
 
-				String name = DefaultUniqueNameGenerator.generate(NameCheckers.dbRelationship,
+				String name = UniqueNameGenerator.generate(NameCheckers.dbRelationship,
 						reverse.getSourceEntity(), relationship.getName() + "Reverse");
 				reverse.setName(name);
 				relationship.getTargetEntity().addRelationship(reverse);