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/10/02 18:31:31 UTC

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 5ee3c0e..5b1841d 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
@@ -19,11 +19,10 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
@@ -36,8 +35,6 @@ 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.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;
@@ -46,19 +43,60 @@ import org.apache.cayenne.modeler.undo.CreateAttributeUndoableEdit;
 import org.apache.cayenne.modeler.undo.CreateEmbAttributeUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
+import java.awt.event.ActionEvent;
+
 /**
  */
 public class CreateAttributeAction extends CayenneAction {
 
+    /**
+     * Constructor for CreateAttributeAction.
+     */
+    public CreateAttributeAction(Application application) {
+        super(getActionName(), application);
+    }
+
     public static String getActionName() {
         return "Create Attribute";
     }
 
+    static void fireEmbeddableAttributeEvent(Object src, ProjectController mediator, Embeddable embeddable,
+                                             EmbeddableAttribute attr) {
+
+        mediator.fireEmbeddableAttributeEvent(new EmbeddableAttributeEvent(src, attr, embeddable, MapEvent.ADD));
+
+        EmbeddableAttributeDisplayEvent e = new EmbeddableAttributeDisplayEvent(src, embeddable, attr,
+                mediator.getCurrentDataMap(), (DataChannelDescriptor) mediator.getProject().getRootNode());
+
+        mediator.fireEmbeddableAttributeDisplayEvent(e);
+    }
+
     /**
-     * Constructor for CreateAttributeAction.
+     * Fires events when an obj attribute was added
      */
-    public CreateAttributeAction(Application application) {
-        super(getActionName(), application);
+    static void fireObjAttributeEvent(Object src, ProjectController mediator, DataMap map, ObjEntity objEntity,
+                                      ObjAttribute attr) {
+
+        mediator.fireObjAttributeEvent(new AttributeEvent(src, attr, objEntity, MapEvent.ADD));
+
+        DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
+
+        AttributeDisplayEvent ade = new AttributeDisplayEvent(src, attr, objEntity, map, domain);
+
+        mediator.fireObjAttributeDisplayEvent(ade);
+    }
+
+    /**
+     * Fires events when a db attribute was added
+     */
+    static void fireDbAttributeEvent(Object src, ProjectController mediator, DataMap map, DbEntity dbEntity,
+                                     DbAttribute attr) {
+        mediator.fireDbAttributeEvent(new AttributeEvent(src, attr, dbEntity, MapEvent.ADD));
+
+        AttributeDisplayEvent ade = new AttributeDisplayEvent(src, attr, dbEntity, map,
+                (DataChannelDescriptor) mediator.getProject().getRootNode());
+
+        mediator.fireDbAttributeDisplayEvent(ade);
     }
 
     @Override
@@ -77,19 +115,22 @@ public class CreateAttributeAction extends CayenneAction {
             Embeddable embeddable = mediator.getCurrentEmbeddable();
 
             EmbeddableAttribute attr = new EmbeddableAttribute();
-            attr.setName(DuplicateNameResolver.resolve(NameCheckers.embeddableAttribute, embeddable));
+            attr.setName(NameBuilder
+                    .builder(attr, embeddable)
+                    .name());
 
             createEmbAttribute(embeddable, attr);
 
             application.getUndoManager().addEdit(
-                    new CreateEmbAttributeUndoableEdit(embeddable, new EmbeddableAttribute[] { attr }));
+                    new CreateEmbAttributeUndoableEdit(embeddable, new EmbeddableAttribute[]{attr}));
         }
 
         if (getProjectController().getCurrentObjEntity() != null) {
 
             ObjEntity objEntity = mediator.getCurrentObjEntity();
 
-            ObjAttribute attr = new ObjAttribute(DuplicateNameResolver.resolve(NameCheckers.objAttribute, objEntity), null, objEntity);
+            ObjAttribute attr = new ObjAttribute();
+            attr.setName(NameBuilder.builder(attr, objEntity).name());
 
             createObjAttribute(mediator.getCurrentDataMap(), objEntity, attr);
 
@@ -99,8 +140,10 @@ public class CreateAttributeAction extends CayenneAction {
         } else if (getProjectController().getCurrentDbEntity() != null) {
             DbEntity dbEntity = getProjectController().getCurrentDbEntity();
 
-            DbAttribute attr = new DbAttribute(DuplicateNameResolver.resolve(NameCheckers.dbAttribute, dbEntity),
-                    TypesMapping.NOT_DEFINED, dbEntity);
+            DbAttribute attr = new DbAttribute();
+            attr.setName(NameBuilder.builder(attr, dbEntity).name());
+            attr.setType(TypesMapping.NOT_DEFINED);
+            attr.setEntity(dbEntity);
 
             createDbAttribute(mediator.getCurrentDataMap(), dbEntity, attr);
 
@@ -116,17 +159,6 @@ public class CreateAttributeAction extends CayenneAction {
         fireEmbeddableAttributeEvent(this, mediator, embeddable, attr);
     }
 
-    static void fireEmbeddableAttributeEvent(Object src, ProjectController mediator, Embeddable embeddable,
-            EmbeddableAttribute attr) {
-
-        mediator.fireEmbeddableAttributeEvent(new EmbeddableAttributeEvent(src, attr, embeddable, MapEvent.ADD));
-
-        EmbeddableAttributeDisplayEvent e = new EmbeddableAttributeDisplayEvent(src, embeddable, attr,
-                mediator.getCurrentDataMap(), (DataChannelDescriptor) mediator.getProject().getRootNode());
-
-        mediator.fireEmbeddableAttributeDisplayEvent(e);
-    }
-
     public void createObjAttribute(DataMap map, ObjEntity objEntity, ObjAttribute attr) {
 
         ProjectController mediator = getProjectController();
@@ -134,21 +166,6 @@ public class CreateAttributeAction extends CayenneAction {
         fireObjAttributeEvent(this, mediator, map, objEntity, attr);
     }
 
-    /**
-     * Fires events when an obj attribute was added
-     */
-    static void fireObjAttributeEvent(Object src, ProjectController mediator, DataMap map, ObjEntity objEntity,
-            ObjAttribute attr) {
-
-        mediator.fireObjAttributeEvent(new AttributeEvent(src, attr, objEntity, MapEvent.ADD));
-
-        DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
-
-        AttributeDisplayEvent ade = new AttributeDisplayEvent(src, attr, objEntity, map, domain);
-
-        mediator.fireObjAttributeDisplayEvent(ade);
-    }
-
     public void createDbAttribute(DataMap map, DbEntity dbEntity, DbAttribute attr) {
         dbEntity.addAttribute(attr);
         ProjectController mediator = getProjectController();
@@ -156,19 +173,6 @@ public class CreateAttributeAction extends CayenneAction {
     }
 
     /**
-     * Fires events when a db attribute was added
-     */
-    static void fireDbAttributeEvent(Object src, ProjectController mediator, DataMap map, DbEntity dbEntity,
-            DbAttribute attr) {
-        mediator.fireDbAttributeEvent(new AttributeEvent(src, attr, dbEntity, MapEvent.ADD));
-
-        AttributeDisplayEvent ade = new AttributeDisplayEvent(src, attr, dbEntity, map,
-                (DataChannelDescriptor) mediator.getProject().getRootNode());
-
-        mediator.fireDbAttributeDisplayEvent(ade);
-    }
-
-    /**
      * Returns <code>true</code> if path contains an Entity object.
      */
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 cc37948..a3b5507 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,8 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
-import org.apache.cayenne.dbsync.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.map.event.MapEvent;
@@ -34,11 +33,9 @@ import java.awt.event.ActionEvent;
 
 /**
  * Action class for creating callback methods on ObjEntity
- *
- * @version 1.0 Oct 30, 2007
  */
 public class CreateCallbackMethodAction extends CayenneAction {
-    
+
     /**
      * unique action name
      */
@@ -46,8 +43,8 @@ public class CreateCallbackMethodAction extends CayenneAction {
 
     /**
      * Constructor.
-     * 
-     * @param actionName unique action name
+     *
+     * @param actionName  unique action name
      * @param application Application instance
      */
     public CreateCallbackMethodAction(String actionName, Application application) {
@@ -55,12 +52,25 @@ public class CreateCallbackMethodAction extends CayenneAction {
     }
 
     /**
+     * Constructor.
+     *
+     * @param application Application instance
+     */
+    public CreateCallbackMethodAction(Application application) {
+        super(ACTION_NAME, application);
+    }
+
+    public static String getActionName() {
+        return ACTION_NAME;
+    }
+
+    /**
      * @return CallbackMap instance where to create a method
      */
     public CallbackMap getCallbackMap() {
         return getProjectController().getCurrentObjEntity().getCallbackMap();
     }
-    
+
     /**
      * @return icon file name for button
      */
@@ -70,14 +80,16 @@ public class CreateCallbackMethodAction extends CayenneAction {
 
     /**
      * performs adding new callback method
-     * 
+     *
      * @param e event
      */
     public final void performAction(ActionEvent e) {
         CallbackType callbackType = getProjectController().getCurrentCallbackType();
 
-        String methodNamePrefix = toMethodName(callbackType.getType());
-        String methodName = DuplicateNameResolver.resolve(NameCheckers.objCallbackMethod, getProjectController().getCurrentObjEntity(), methodNamePrefix);
+        String methodName = NameBuilder
+                .builderForCallbackMethod(getProjectController().getCurrentObjEntity())
+                .baseName(toMethodName(callbackType.getType()))
+                .name();
 
         createCallbackMethod(callbackType, methodName);
         application.getUndoManager().addEdit(
@@ -103,18 +115,5 @@ public class CreateCallbackMethodAction extends CayenneAction {
     private String toMethodName(LifecycleEvent event) {
         return "on" + Util.underscoredToJava(event.name(), true);
     }
-    
-    public static String getActionName() {
-        return ACTION_NAME;
-    }
-    
-    /**
-     * Constructor.
-     *
-     * @param application Application instance
-     */
-    public CreateCallbackMethodAction(Application application) {
-        super(ACTION_NAME, application);
-    }
 }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 8403cb7..66dbae7 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
@@ -22,9 +22,8 @@ package org.apache.cayenne.modeler.action;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
-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;
@@ -34,7 +33,6 @@ import java.awt.event.ActionEvent;
 
 /**
  * Action that creates new DataMap in the project.
- * 
  */
 public class CreateDataMapAction extends CayenneAction {
 
@@ -59,16 +57,15 @@ public class CreateDataMapAction extends CayenneAction {
     public void performAction(ActionEvent e) {
         ProjectController mediator = getProjectController();
 
-        DataChannelDescriptor currentDomain = (DataChannelDescriptor) mediator
+        DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) mediator
                 .getProject()
                 .getRootNode();
 
-        DataMap map = new DataMap(DuplicateNameResolver.resolve(NameCheckers.dataMap, currentDomain));
-
+        DataMap map = new DataMap();
+        map.setName(NameBuilder.builder(map, dataChannelDescriptor).name());
         createDataMap(map);
 
-        application.getUndoManager().addEdit(
-                new CreateDataMapUndoableEdit(currentDomain, map));
+        application.getUndoManager().addEdit(new CreateDataMapUndoableEdit(dataChannelDescriptor, map));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 abeaee3..1117bf1 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
@@ -19,88 +19,84 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 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.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;
 import org.apache.cayenne.modeler.undo.CreateDbEntityUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
-public class CreateDbEntityAction extends CayenneAction {
+import java.awt.event.ActionEvent;
 
-	public static String getActionName() {
-		return "Create DbEntity";
-	}
+public class CreateDbEntityAction extends CayenneAction {
 
-	/**
-	 * Constructor for CreateDbEntityAction.
-	 */
-	public CreateDbEntityAction(Application application) {
-		super(getActionName(), application);
-	}
+    /**
+     * Constructor for CreateDbEntityAction.
+     */
+    public CreateDbEntityAction(Application application) {
+        super(getActionName(), application);
+    }
 
-	public String getIconName() {
-		return "icon-dbentity.gif";
-	}
+    public static String getActionName() {
+        return "Create DbEntity";
+    }
 
-	/**
-	 * Creates new DbEntity, adds it to the current DataMap, fires DbEntityEvent
-	 * and DbEntityDisplayEvent.
-	 * 
-	 * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent)
-	 */
-	public void performAction(ActionEvent e) {
-		ProjectController mediator = getProjectController();
+    /**
+     * Fires events when a db entity was added
+     */
+    static void fireDbEntityEvent(Object src, ProjectController mediator, DbEntity entity) {
+        mediator.fireDbEntityEvent(new EntityEvent(src, entity, MapEvent.ADD));
+        EntityDisplayEvent displayEvent = new EntityDisplayEvent(src, entity, mediator.getCurrentDataMap(),
+                mediator.getCurrentDataNode(), (DataChannelDescriptor) mediator.getProject().getRootNode());
+        displayEvent.setMainTabFocus(true);
+        mediator.fireDbEntityDisplayEvent(displayEvent);
+    }
 
-		DataMap map = mediator.getCurrentDataMap();
-		DbEntity entity = new DbEntity(DuplicateNameResolver.resolve(NameCheckers.dbEntity, map));
+    public String getIconName() {
+        return "icon-dbentity.gif";
+    }
 
-		createEntity(map, entity);
+    /**
+     * Creates new DbEntity, adds it to the current DataMap, fires DbEntityEvent and DbEntityDisplayEvent.
+     */
+    public void performAction(ActionEvent e) {
+        ProjectController mediator = getProjectController();
 
-		application.getUndoManager().addEdit(new CreateDbEntityUndoableEdit(map, entity));
-	}
+        DataMap map = mediator.getCurrentDataMap();
+        DbEntity entity = new DbEntity();
+        entity.setName(NameBuilder.builder(entity, map).name());
+        createEntity(map, entity);
 
-	/**
-	 * Fires events when a db entity was added
-	 */
-	static void fireDbEntityEvent(Object src, ProjectController mediator, DbEntity entity) {
-		mediator.fireDbEntityEvent(new EntityEvent(src, entity, MapEvent.ADD));
-		EntityDisplayEvent displayEvent = new EntityDisplayEvent(src, entity, mediator.getCurrentDataMap(),
-				mediator.getCurrentDataNode(), (DataChannelDescriptor) mediator.getProject().getRootNode());
-		displayEvent.setMainTabFocus(true);
-		mediator.fireDbEntityDisplayEvent(displayEvent);
-	}
+        application.getUndoManager().addEdit(new CreateDbEntityUndoableEdit(map, entity));
+    }
 
-	/**
-	 * Constructs and returns a new DbEntity. Entity returned is added to the
-	 * DataMap.
-	 */
-	public void createEntity(DataMap map, DbEntity entity) {
-		ProjectController mediator = getProjectController();
-		entity.setCatalog(map.getDefaultCatalog());
-		entity.setSchema(map.getDefaultSchema());
-		map.addDbEntity(entity);
-		fireDbEntityEvent(this, mediator, entity);
-	}
+    /**
+     * Constructs and returns a new DbEntity. Entity returned is added to the
+     * DataMap.
+     */
+    public void createEntity(DataMap map, DbEntity entity) {
+        ProjectController mediator = getProjectController();
+        entity.setCatalog(map.getDefaultCatalog());
+        entity.setSchema(map.getDefaultSchema());
+        map.addDbEntity(entity);
+        fireDbEntityEvent(this, mediator, entity);
+    }
 
-	/**
-	 * Returns <code>true</code> if path contains a DataMap object.
-	 */
-	public boolean enableForPath(ConfigurationNode object) {
-		if (object == null) {
-			return false;
-		}
+    /**
+     * Returns <code>true</code> if path contains a DataMap object.
+     */
+    public boolean enableForPath(ConfigurationNode object) {
+        if (object == null) {
+            return false;
+        }
 
-		return ((Entity) object).getDataMap() != null;
-	}
+        return ((Entity) object).getDataMap() != null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 7fea640..fe073ec 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
@@ -18,23 +18,22 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 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.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;
 import org.apache.cayenne.modeler.undo.CreateEmbeddableUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
+import java.awt.event.ActionEvent;
+
 public class CreateEmbeddableAction extends CayenneAction {
 
     public static String getActionName() {
@@ -56,11 +55,11 @@ public class CreateEmbeddableAction extends CayenneAction {
 
         DataMap dataMap = mediator.getCurrentDataMap();
 
-        Embeddable embeddable = new Embeddable(DuplicateNameResolver.resolve(NameCheckers.embeddable, mediator.getCurrentDataMap()));
+        Embeddable embeddable = new Embeddable();
+        embeddable.setClassName(NameBuilder.builder(embeddable, dataMap).name());
         createEmbeddable(dataMap, embeddable);
 
-        application.getUndoManager().addEdit(
-                new CreateEmbeddableUndoableEdit(dataMap, embeddable));
+        application.getUndoManager().addEdit(new CreateEmbeddableUndoableEdit(dataMap, embeddable));
     }
 
     public void createEmbeddable(DataMap dataMap, Embeddable embeddable) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 eb0fbf9..56a0437 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
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.access.dbsync.SkipSchemaUpdateStrategy;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
@@ -28,86 +26,86 @@ import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.event.DataNodeEvent;
 import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.event.MapEvent;
-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;
 import org.apache.cayenne.modeler.undo.CreateNodeUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
+import java.awt.event.ActionEvent;
+
 public class CreateNodeAction extends CayenneAction {
 
-	public static String getActionName() {
-		return "Create DataNode";
-	}
-
-	/**
-	 * Constructor for CreateNodeAction.
-	 * 
-	 * @param application
-	 */
-	public CreateNodeAction(Application application) {
-		super(getActionName(), application);
-	}
-
-	public String getIconName() {
-		return "icon-node.gif";
-	}
-
-	/**
-	 * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent)
-	 */
-	public void performAction(ActionEvent e) {
-		DataNodeDescriptor node = buildDataNode();
-		createDataNode(node);
-		application.getUndoManager().addEdit(new CreateNodeUndoableEdit(application, node));
-	}
-
-	public void createDataNode(DataNodeDescriptor node) {
-		DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController().getProject().getRootNode();
-		domain.getNodeDescriptors().add(node);
-		getProjectController().fireDataNodeEvent(new DataNodeEvent(this, node, MapEvent.ADD));
-		getProjectController().fireDataNodeDisplayEvent(new DataNodeDisplayEvent(this, domain, node));
-	}
-
-	/**
-	 * Returns <code>true</code> if path contains a DataDomain object.
-	 */
-	public boolean enableForPath(ConfigurationNode object) {
-		return object != null && ((DataNodeDescriptor) object).getDataChannelDescriptor() != null;
-
-	}
-
-	/**
-	 * Creates a new DataNode, adding to the current domain, but doesn't send
-	 * any events.
-	 */
-	public DataNodeDescriptor buildDataNode() {
-		ProjectController mediator = getProjectController();
-		DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
-
-		DataNodeDescriptor node = buildDataNode(domain);
-
-		DataSourceInfo src = new DataSourceInfo();
-		node.setDataSourceDescriptor(src);
-
-		// by default create JDBC Node
-		node.setDataSourceFactoryType(XMLPoolingDataSourceFactory.class.getName());
-		node.setSchemaUpdateStrategyType(SkipSchemaUpdateStrategy.class.getName());
-
-		return node;
-	}
-
-	/**
-	 * A factory method that makes a new DataNode.
-	 */
-	DataNodeDescriptor buildDataNode(DataChannelDescriptor domain) {
-		DataNodeDescriptor node = new DataNodeDescriptor(DuplicateNameResolver.resolve(
-				NameCheckers.dataNodeDescriptor, domain));
-		node.setDataChannelDescriptor(domain);
-
-		return node;
-	}
+    /**
+     * Constructor for CreateNodeAction.
+     *
+     * @param application
+     */
+    public CreateNodeAction(Application application) {
+        super(getActionName(), application);
+    }
+
+    public static String getActionName() {
+        return "Create DataNode";
+    }
+
+    @Override
+    public String getIconName() {
+        return "icon-node.gif";
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        DataNodeDescriptor node = buildDataNode();
+        createDataNode(node);
+        application.getUndoManager().addEdit(new CreateNodeUndoableEdit(application, node));
+    }
+
+    public void createDataNode(DataNodeDescriptor node) {
+        DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController().getProject().getRootNode();
+        domain.getNodeDescriptors().add(node);
+        getProjectController().fireDataNodeEvent(new DataNodeEvent(this, node, MapEvent.ADD));
+        getProjectController().fireDataNodeDisplayEvent(new DataNodeDisplayEvent(this, domain, node));
+    }
+
+    /**
+     * Returns <code>true</code> if path contains a DataDomain object.
+     */
+    public boolean enableForPath(ConfigurationNode object) {
+        return object != null && ((DataNodeDescriptor) object).getDataChannelDescriptor() != null;
+
+    }
+
+    /**
+     * Creates a new DataNode, adding to the current domain, but doesn't send
+     * any events.
+     */
+    public DataNodeDescriptor buildDataNode() {
+        ProjectController mediator = getProjectController();
+        DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
+
+        DataNodeDescriptor node = buildDataNode(domain);
+
+        DataSourceInfo src = new DataSourceInfo();
+        node.setDataSourceDescriptor(src);
+
+        // by default create JDBC Node
+        node.setDataSourceFactoryType(XMLPoolingDataSourceFactory.class.getName());
+        node.setSchemaUpdateStrategyType(SkipSchemaUpdateStrategy.class.getName());
+
+        return node;
+    }
+
+    /**
+     * A factory method that makes a new DataNode.
+     */
+    DataNodeDescriptor buildDataNode(DataChannelDescriptor dataChannelDescriptor) {
+        DataNodeDescriptor node = new DataNodeDescriptor();
+        node.setName(NameBuilder.builder(node, dataChannelDescriptor).name());
+        node.setDataChannelDescriptor(dataChannelDescriptor);
+
+        return node;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 8a2bd4b..8569697 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,8 +22,7 @@ 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.dbsync.naming.NameBuilder;
 import org.apache.cayenne.dbsync.reverse.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -36,16 +35,11 @@ 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;
 
 public class CreateObjEntityAction extends CayenneAction {
 
-    public static String getActionName() {
-        return "Create ObjEntity";
-    }
-
     /**
      * Constructor for CreateObjEntityAction.
      */
@@ -53,14 +47,32 @@ public class CreateObjEntityAction extends CayenneAction {
         super(getActionName(), application);
     }
 
+    public static String getActionName() {
+        return "Create ObjEntity";
+    }
+
+
+    static void fireObjEntityEvent(
+            Object src,
+            ProjectController mediator,
+            DataMap dataMap,
+            ObjEntity entity) {
+        mediator.fireObjEntityEvent(new EntityEvent(src, entity, MapEvent.ADD));
+        EntityDisplayEvent displayEvent = new EntityDisplayEvent(
+                src,
+                entity,
+                dataMap,
+                mediator.getCurrentDataNode(),
+                (DataChannelDescriptor) mediator.getProject().getRootNode());
+        displayEvent.setMainTabFocus(true);
+        mediator.fireObjEntityDisplayEvent(displayEvent);
+    }
+
     @Override
     public String getIconName() {
         return "icon-new_objentity.gif";
     }
 
-    /**
-     * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent)
-     */
     @Override
     public void performAction(ActionEvent e) {
         createObjEntity();
@@ -70,7 +82,10 @@ public class CreateObjEntityAction extends CayenneAction {
         ProjectController mediator = getProjectController();
 
         DataMap dataMap = mediator.getCurrentDataMap();
-        ObjEntity entity = new ObjEntity(DuplicateNameResolver.resolve(NameCheckers.objEntity, dataMap));
+        ObjEntity entity = new ObjEntity();
+        entity.setName(NameBuilder
+                .builder(entity, dataMap)
+                .name());
 
         // init defaults
         entity.setSuperClassName(dataMap.getDefaultSuperclass());
@@ -79,8 +94,13 @@ public class CreateObjEntityAction extends CayenneAction {
         DbEntity dbEntity = mediator.getCurrentDbEntity();
         if (dbEntity != null) {
             entity.setDbEntity(dbEntity);
-            String baseName = Util.underscoredToJava(dbEntity.getName(), true);
-            entity.setName(DuplicateNameResolver.resolve(NameCheckers.objEntity, dbEntity.getDataMap(), baseName));
+
+            // TODO: use injectable name generator
+            String baseName = new DefaultObjectNameGenerator().createObjEntityName(dbEntity);
+            entity.setName(NameBuilder
+                    .builder(entity, dbEntity.getDataMap())
+                    .baseName(baseName)
+                    .name());
         }
 
         entity.setClassName(dataMap.getNameWithDefaultPackage(entity.getName()));
@@ -110,25 +130,6 @@ public class CreateObjEntityAction extends CayenneAction {
     }
 
     /**
-     * Fires events when a obj entity was added
-     */
-    static void fireObjEntityEvent(
-            Object src,
-            ProjectController mediator,
-            DataMap dataMap,
-            ObjEntity entity) {
-        mediator.fireObjEntityEvent(new EntityEvent(src, entity, MapEvent.ADD));
-        EntityDisplayEvent displayEvent = new EntityDisplayEvent(
-                src,
-                entity,
-                dataMap,
-                mediator.getCurrentDataNode(),
-                (DataChannelDescriptor) mediator.getProject().getRootNode());
-        displayEvent.setMainTabFocus(true);
-        mediator.fireObjEntityDisplayEvent(displayEvent);
-    }
-
-    /**
      * Returns <code>true</code> if path contains a DataMap object.
      */
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 7787abc..3dbdaa4 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
@@ -19,75 +19,74 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.event.ProcedureEvent;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.event.MapEvent;
-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;
 import org.apache.cayenne.modeler.undo.CreateProcedureUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
+import java.awt.event.ActionEvent;
+
 /**
  * Action class to create a new stored procedure mapping.
  */
 public class CreateProcedureAction extends CayenneAction {
 
-	public static String getActionName() {
-		return "Create Stored Procedure";
-	}
-
-	public CreateProcedureAction(Application application) {
-		super(getActionName(), application);
-	}
+    public CreateProcedureAction(Application application) {
+        super(getActionName(), application);
+    }
 
-	public void performAction(ActionEvent e) {
-		ProjectController mediator = getProjectController();
-		DataMap map = mediator.getCurrentDataMap();
+    public static String getActionName() {
+        return "Create Stored Procedure";
+    }
 
-		Procedure procedure = new Procedure(DuplicateNameResolver.resolve(NameCheckers.procedure, map));
+    /**
+     * Fires events when a procedure was added
+     */
+    static void fireProcedureEvent(Object src, ProjectController mediator, DataMap dataMap, Procedure procedure) {
+        mediator.fireProcedureEvent(new ProcedureEvent(src, procedure, MapEvent.ADD));
+        mediator.fireProcedureDisplayEvent(new ProcedureDisplayEvent(src, procedure, mediator.getCurrentDataMap(),
+                (DataChannelDescriptor) mediator.getProject().getRootNode()));
+    }
 
-		createProcedure(map, procedure);
+    public void performAction(ActionEvent e) {
+        ProjectController mediator = getProjectController();
+        DataMap map = mediator.getCurrentDataMap();
 
-		application.getUndoManager().addEdit(new CreateProcedureUndoableEdit(map, procedure));
-	}
+        Procedure procedure = new Procedure();
+        procedure.setName(NameBuilder.builder(procedure, map).name());
+        createProcedure(map, procedure);
 
-	/**
-	 * Fires events when a procedure was added
-	 */
-	static void fireProcedureEvent(Object src, ProjectController mediator, DataMap dataMap, Procedure procedure) {
-		mediator.fireProcedureEvent(new ProcedureEvent(src, procedure, MapEvent.ADD));
-		mediator.fireProcedureDisplayEvent(new ProcedureDisplayEvent(src, procedure, mediator.getCurrentDataMap(),
-				(DataChannelDescriptor) mediator.getProject().getRootNode()));
-	}
+        application.getUndoManager().addEdit(new CreateProcedureUndoableEdit(map, procedure));
+    }
 
-	public void createProcedure(DataMap map, Procedure procedure) {
-		ProjectController mediator = getProjectController();
-		procedure.setSchema(map.getDefaultSchema());
-		procedure.setCatalog(map.getDefaultCatalog());
-		map.addProcedure(procedure);
-		fireProcedureEvent(this, mediator, map, procedure);
-	}
+    public void createProcedure(DataMap map, Procedure procedure) {
+        ProjectController mediator = getProjectController();
+        procedure.setSchema(map.getDefaultSchema());
+        procedure.setCatalog(map.getDefaultCatalog());
+        map.addProcedure(procedure);
+        fireProcedureEvent(this, mediator, map, procedure);
+    }
 
-	/**
-	 * Returns <code>true</code> if path contains a DataMap object.
-	 */
-	public boolean enableForPath(ConfigurationNode object) {
-		if (object == null) {
-			return false;
-		}
+    /**
+     * Returns <code>true</code> if path contains a DataMap object.
+     */
+    public boolean enableForPath(ConfigurationNode object) {
+        if (object == null) {
+            return false;
+        }
 
-		return ((Procedure) object).getDataMap() != null;
-	}
+        return ((Procedure) object).getDataMap() != null;
+    }
 
-	public String getIconName() {
-		return "icon-stored-procedure.gif";
-	}
+    public String getIconName() {
+        return "icon-stored-procedure.gif";
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 e939f86..67c19c5 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
@@ -19,78 +19,78 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.event.ProcedureParameterEvent;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
-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;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
+import java.awt.event.ActionEvent;
+
 public class CreateProcedureParameterAction extends CayenneAction {
 
-	public static String getActionName() {
-		return "Create Parameter";
-	}
+    /**
+     * Constructor for CreateProcedureParameterAction.
+     */
+    public CreateProcedureParameterAction(Application application) {
+        super(getActionName(), application);
+    }
 
-	/**
-	 * Constructor for CreateProcedureParameterAction.
-	 * 
-	 */
-	public CreateProcedureParameterAction(Application application) {
-		super(getActionName(), application);
-	}
+    public static String getActionName() {
+        return "Create Parameter";
+    }
 
-	public String getIconName() {
-		return "icon-plus.gif";
-	}
+    /**
+     * Fires events when an proc parameter was added
+     */
+    static void fireProcedureParameterEvent(Object src, ProjectController mediator, Procedure procedure,
+                                            ProcedureParameter parameter) {
+        mediator.fireProcedureParameterEvent(new ProcedureParameterEvent(src, parameter, MapEvent.ADD));
 
-	/**
-	 * Creates ProcedureParameter depending on context.
-	 */
-	public void performAction(ActionEvent e) {
-		if (getProjectController().getCurrentProcedure() != null) {
-			createProcedureParameter();
-		}
-	}
+        mediator.fireProcedureParameterDisplayEvent(new ProcedureParameterDisplayEvent(src, parameter, procedure,
+                mediator.getCurrentDataMap(), (DataChannelDescriptor) mediator.getProject().getRootNode()));
+    }
 
-	public void createProcedureParameter() {
-		Procedure procedure = getProjectController().getCurrentProcedure();
+    @Override
+    public String getIconName() {
+        return "icon-plus.gif";
+    }
 
-		ProcedureParameter parameter = new ProcedureParameter(DuplicateNameResolver.resolve(
-				NameCheckers.procedureParameter, procedure));
-		procedure.addCallParameter(parameter);
+    /**
+     * Creates ProcedureParameter depending on context.
+     */
+    @Override
+    public void performAction(ActionEvent e) {
+        if (getProjectController().getCurrentProcedure() != null) {
+            createProcedureParameter();
+        }
+    }
 
-		ProjectController mediator = getProjectController();
-		fireProcedureParameterEvent(this, mediator, procedure, parameter);
-	}
+    public void createProcedureParameter() {
+        Procedure procedure = getProjectController().getCurrentProcedure();
 
-	/**
-	 * Fires events when an proc parameter was added
-	 */
-	static void fireProcedureParameterEvent(Object src, ProjectController mediator, Procedure procedure,
-			ProcedureParameter parameter) {
-		mediator.fireProcedureParameterEvent(new ProcedureParameterEvent(src, parameter, MapEvent.ADD));
+        ProcedureParameter parameter = new ProcedureParameter();
+        parameter.setName(NameBuilder.builder(parameter, procedure).name());
+        procedure.addCallParameter(parameter);
 
-		mediator.fireProcedureParameterDisplayEvent(new ProcedureParameterDisplayEvent(src, parameter, procedure,
-				mediator.getCurrentDataMap(), (DataChannelDescriptor) mediator.getProject().getRootNode()));
-	}
+        ProjectController mediator = getProjectController();
+        fireProcedureParameterEvent(this, mediator, procedure, parameter);
+    }
 
-	/**
-	 * Returns <code>true</code> if path contains a Procedure object.
-	 */
-	public boolean enableForPath(ConfigurationNode object) {
-		if (object == null) {
-			return false;
-		}
+    /**
+     * Returns <code>true</code> if path contains a Procedure object.
+     */
+    public boolean enableForPath(ConfigurationNode object) {
+        if (object == null) {
+            return false;
+        }
 
-		return ((ProcedureParameter) object).getProcedure() != null;
-	}
+        return ((ProcedureParameter) object).getProcedure() != null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 8abec0c..ec3a42d 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
@@ -19,10 +19,9 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.Entity;
@@ -31,8 +30,6 @@ 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.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;
@@ -40,111 +37,113 @@ import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 
+import java.awt.event.ActionEvent;
+
 public class CreateRelationshipAction extends CayenneAction {
 
-	public static String getActionName() {
-		return "Create Relationship";
-	}
-
-	/**
-	 * Constructor for CreateRelationshipAction.
-	 */
-	public CreateRelationshipAction(Application application) {
-		super(getActionName(), application);
-	}
-
-	@Override
-	public String getIconName() {
-		return "icon-relationship.gif";
-	}
-
-	/**
-	 * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent)
-	 */
-	@Override
-	public void performAction(ActionEvent e) {
-		ObjEntity objEnt = getProjectController().getCurrentObjEntity();
-		if (objEnt != null) {
-
-			ObjRelationship rel = new ObjRelationship(DuplicateNameResolver.resolve(NameCheckers.objRelationship,
-					objEnt));
-			createObjRelationship(objEnt, rel);
-
-			application.getUndoManager().addEdit(
-					new CreateRelationshipUndoableEdit(objEnt, new ObjRelationship[] { rel }));
-		} else {
-			DbEntity dbEnt = getProjectController().getCurrentDbEntity();
-			if (dbEnt != null) {
-
-				DbRelationship rel = new DbRelationship(DuplicateNameResolver.resolve(
-						NameCheckers.dbRelationship, dbEnt));
-				createDbRelationship(dbEnt, rel);
-
-				application.getUndoManager().addEdit(
-						new CreateRelationshipUndoableEdit(dbEnt, new DbRelationship[] { rel }));
-			}
-		}
-	}
-
-	public void createObjRelationship(ObjEntity objEntity, ObjRelationship rel) {
-		ProjectController mediator = getProjectController();
-
-		rel.setSourceEntity(objEntity);
-		DeleteRuleUpdater.updateObjRelationship(rel);
-
-		objEntity.addRelationship(rel);
-		fireObjRelationshipEvent(this, mediator, objEntity, rel);
-	}
-
-	/**
-	 * Fires events when a obj rel was added
-	 */
-	static void fireObjRelationshipEvent(Object src, ProjectController mediator, ObjEntity objEntity,
-			ObjRelationship rel) {
-
-		mediator.fireObjRelationshipEvent(new RelationshipEvent(src, rel, objEntity, MapEvent.ADD));
-
-		RelationshipDisplayEvent rde = new RelationshipDisplayEvent(src, rel, objEntity, mediator.getCurrentDataMap(),
-				(DataChannelDescriptor) mediator.getProject().getRootNode());
-
-		mediator.fireObjRelationshipDisplayEvent(rde);
-	}
-
-	public void createDbRelationship(DbEntity dbEntity, DbRelationship rel) {
-		ProjectController mediator = getProjectController();
-
-		rel.setSourceEntity(dbEntity);
-		dbEntity.addRelationship(rel);
-
-		fireDbRelationshipEvent(this, mediator, dbEntity, rel);
-	}
-
-	/**
-	 * Fires events when a db rel was added
-	 */
-	static void fireDbRelationshipEvent(Object src, ProjectController mediator, DbEntity dbEntity, DbRelationship rel) {
-
-		mediator.fireDbRelationshipEvent(new RelationshipEvent(src, rel, dbEntity, MapEvent.ADD));
-
-		RelationshipDisplayEvent rde = new RelationshipDisplayEvent(src, rel, dbEntity, mediator.getCurrentDataMap(),
-				(DataChannelDescriptor) mediator.getProject().getRootNode());
-
-		mediator.fireDbRelationshipDisplayEvent(rde);
-	}
-
-	/**
-	 * Returns <code>true</code> if path contains an Entity object.
-	 */
-	@Override
-	public boolean enableForPath(ConfigurationNode object) {
-		if (object == null) {
-			return false;
-		}
-
-		if (object instanceof Relationship) {
-			return ((Relationship) object).getParent() != null && ((Relationship) object).getParent() instanceof Entity;
-		}
-
-		return false;
-	}
+    /**
+     * Constructor for CreateRelationshipAction.
+     */
+    public CreateRelationshipAction(Application application) {
+        super(getActionName(), application);
+    }
+
+    public static String getActionName() {
+        return "Create Relationship";
+    }
+
+    /**
+     * Fires events when a obj rel was added
+     */
+    static void fireObjRelationshipEvent(Object src, ProjectController mediator, ObjEntity objEntity,
+                                         ObjRelationship rel) {
+
+        mediator.fireObjRelationshipEvent(new RelationshipEvent(src, rel, objEntity, MapEvent.ADD));
+
+        RelationshipDisplayEvent rde = new RelationshipDisplayEvent(src, rel, objEntity, mediator.getCurrentDataMap(),
+                (DataChannelDescriptor) mediator.getProject().getRootNode());
+
+        mediator.fireObjRelationshipDisplayEvent(rde);
+    }
+
+    /**
+     * Fires events when a db rel was added
+     */
+    static void fireDbRelationshipEvent(Object src, ProjectController mediator, DbEntity dbEntity, DbRelationship rel) {
+
+        mediator.fireDbRelationshipEvent(new RelationshipEvent(src, rel, dbEntity, MapEvent.ADD));
+
+        RelationshipDisplayEvent rde = new RelationshipDisplayEvent(src, rel, dbEntity, mediator.getCurrentDataMap(),
+                (DataChannelDescriptor) mediator.getProject().getRootNode());
+
+        mediator.fireDbRelationshipDisplayEvent(rde);
+    }
+
+    @Override
+    public String getIconName() {
+        return "icon-relationship.gif";
+    }
+
+    /**
+     * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent)
+     */
+    @Override
+    public void performAction(ActionEvent e) {
+        ObjEntity objEnt = getProjectController().getCurrentObjEntity();
+        if (objEnt != null) {
+
+            ObjRelationship rel = new ObjRelationship();
+            rel.setName(NameBuilder.builder(rel, objEnt).name());
+            createObjRelationship(objEnt, rel);
+
+            application.getUndoManager().addEdit(
+                    new CreateRelationshipUndoableEdit(objEnt, new ObjRelationship[]{rel}));
+        } else {
+            DbEntity dbEnt = getProjectController().getCurrentDbEntity();
+            if (dbEnt != null) {
+
+                DbRelationship rel = new DbRelationship();
+                rel.setName(NameBuilder.builder(rel, dbEnt).name());
+                createDbRelationship(dbEnt, rel);
+
+                application.getUndoManager().addEdit(
+                        new CreateRelationshipUndoableEdit(dbEnt, new DbRelationship[]{rel}));
+            }
+        }
+    }
+
+    public void createObjRelationship(ObjEntity objEntity, ObjRelationship rel) {
+        ProjectController mediator = getProjectController();
+
+        rel.setSourceEntity(objEntity);
+        DeleteRuleUpdater.updateObjRelationship(rel);
+
+        objEntity.addRelationship(rel);
+        fireObjRelationshipEvent(this, mediator, objEntity, rel);
+    }
+
+    public void createDbRelationship(DbEntity dbEntity, DbRelationship rel) {
+        ProjectController mediator = getProjectController();
+
+        rel.setSourceEntity(dbEntity);
+        dbEntity.addRelationship(rel);
+
+        fireDbRelationshipEvent(this, mediator, dbEntity, rel);
+    }
+
+    /**
+     * Returns <code>true</code> if path contains an Entity object.
+     */
+    @Override
+    public boolean enableForPath(ConfigurationNode object) {
+        if (object == null) {
+            return false;
+        }
+
+        if (object instanceof Relationship) {
+            return ((Relationship) object).getParent() != null && ((Relationship) object).getParent() instanceof Entity;
+        }
+
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 3158e90..732963d 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
@@ -19,20 +19,11 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-
+import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.MapLoader;
-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;
@@ -42,91 +33,95 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.xml.sax.InputSource;
 
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+
 /**
  * Modeler action that imports a DataMap into a project from an arbitrary
  * location.
- * 
+ *
  * @since 1.1
  */
 public class ImportDataMapAction extends CayenneAction {
 
-	private static Log logObj = LogFactory.getLog(ImportDataMapAction.class);
-
-	public static String getActionName() {
-		return "Import DataMap";
-	}
-
-	public ImportDataMapAction(Application application) {
-		super(getActionName(), application);
-	}
+    private static Log logObj = LogFactory.getLog(ImportDataMapAction.class);
 
-	public void performAction(ActionEvent e) {
-		importDataMap();
-	}
+    public ImportDataMapAction(Application application) {
+        super(getActionName(), application);
+    }
 
-	protected void importDataMap() {
-		File dataMapFile = selectDataMap(Application.getFrame());
-		if (dataMapFile == null) {
-			return;
-		}
+    public static String getActionName() {
+        return "Import DataMap";
+    }
 
-		DataMap newMap;
+    public void performAction(ActionEvent e) {
+        importDataMap();
+    }
 
-		try {
+    protected void importDataMap() {
+        File dataMapFile = selectDataMap(Application.getFrame());
+        if (dataMapFile == null) {
+            return;
+        }
 
-			URL url = dataMapFile.toURI().toURL();
+        DataMap newMap;
 
-			try (InputStream in = url.openStream();) {
-				InputSource inSrc = new InputSource(in);
-				inSrc.setSystemId(dataMapFile.getAbsolutePath());
-				newMap = new MapLoader().loadDataMap(inSrc);
-			}
+        try {
+            URL url = dataMapFile.toURI().toURL();
 
-			DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController().getProject().getRootNode();
+            try (InputStream in = url.openStream();) {
+                InputSource inSrc = new InputSource(in);
+                inSrc.setSystemId(dataMapFile.getAbsolutePath());
+                newMap = new MapLoader().loadDataMap(inSrc);
+            }
 
-			if (newMap.getName() != null) {
-				newMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, domain, newMap.getName()));
-			} else {
-				newMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, domain));
-			}
+            ConfigurationNode root = getProjectController().getProject().getRootNode();
+            newMap.setName(NameBuilder
+                    .builder(newMap, root)
+                    .baseName(newMap.getName())
+                    .name());
 
-			Resource baseResource = domain.getConfigurationSource();
+            Resource baseResource = ((DataChannelDescriptor) root).getConfigurationSource();
 
-			if (baseResource != null) {
-				Resource dataMapResource = baseResource.getRelativeResource(newMap.getName());
-				newMap.setConfigurationSource(dataMapResource);
-			}
+            if (baseResource != null) {
+                Resource dataMapResource = baseResource.getRelativeResource(newMap.getName());
+                newMap.setConfigurationSource(dataMapResource);
+            }
 
-			getProjectController().addDataMap(this, newMap);
-		} catch (Exception ex) {
-			logObj.info("Error importing DataMap.", ex);
-			JOptionPane.showMessageDialog(Application.getFrame(), "Error reading DataMap: " + ex.getMessage(),
-					"Can't Open DataMap", JOptionPane.OK_OPTION);
-		}
-	}
+            getProjectController().addDataMap(this, newMap);
+        } catch (Exception ex) {
+            logObj.info("Error importing DataMap.", ex);
+            JOptionPane.showMessageDialog(Application.getFrame(), "Error reading DataMap: " + ex.getMessage(),
+                    "Can't Open DataMap", JOptionPane.OK_OPTION);
+        }
+    }
 
-	protected File selectDataMap(Frame f) {
+    protected File selectDataMap(Frame f) {
 
-		// find start directory in preferences
-		FSPath lastDir = getApplication().getFrameController().getLastDirectory();
+        // find start directory in preferences
+        FSPath lastDir = getApplication().getFrameController().getLastDirectory();
 
-		// configure dialog
-		JFileChooser chooser = new JFileChooser();
-		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
-		lastDir.updateChooser(chooser);
+        // configure dialog
+        JFileChooser chooser = new JFileChooser();
+        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+        lastDir.updateChooser(chooser);
 
-		chooser.addChoosableFileFilter(FileFilters.getDataMapFilter());
+        chooser.addChoosableFileFilter(FileFilters.getDataMapFilter());
 
-		int status = chooser.showDialog(f, "Select DataMap");
-		if (status == JFileChooser.APPROVE_OPTION) {
-			File file = chooser.getSelectedFile();
+        int status = chooser.showDialog(f, "Select DataMap");
+        if (status == JFileChooser.APPROVE_OPTION) {
+            File file = chooser.getSelectedFile();
 
-			// save to preferences...
-			lastDir.updateFromChooser(chooser);
+            // save to preferences...
+            lastDir.updateFromChooser(chooser);
 
-			return file;
-		}
+            return file;
+        }
 
-		return null;
-	}
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 8c5f1c6..75290c6 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
@@ -19,20 +19,7 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.Component;
-import java.awt.HeadlessException;
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
-
+import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.event.DataNodeEvent;
@@ -41,12 +28,12 @@ import org.apache.cayenne.configuration.server.JNDIDataSourceFactory;
 import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-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;
@@ -56,12 +43,22 @@ import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.AdapterMapping;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.modeler.util.FileFilters;
-import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.wocompat.EOModelProcessor;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import javax.swing.*;
+import javax.swing.filechooser.FileFilter;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
 /**
  * Action handler for WebObjects EOModel import function.
  * 
@@ -301,8 +298,11 @@ 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(DuplicateNameResolver.resolve(NameCheckers.dataMap, domain, map.getName()));
+            ConfigurationNode root = (DataChannelDescriptor) mediator.getProject().getRootNode();
+            map.setName(NameBuilder
+                    .builder(map, root)
+                    .baseName(map.getName())
+                    .name());
 
             // 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/38e4e7fd/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 468ff1d..b5bbbc5 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
@@ -19,23 +19,19 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.awt.Toolkit;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-
-import javax.swing.KeyStroke;
-
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.dbsync.naming.DuplicateNameResolver;
-import org.apache.cayenne.dbsync.naming.NameCheckers;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.CayenneModelerController;
 import org.apache.cayenne.modeler.event.DomainDisplayEvent;
 import org.apache.cayenne.project.Project;
 
-/**
- */
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
 public class NewProjectAction extends ProjectAction {
 
     public static String getActionName() {
@@ -66,17 +62,18 @@ public class NewProjectAction extends ProjectAction {
             return;
         }
 
-        DataChannelDescriptor domain = new DataChannelDescriptor();
+        DataChannelDescriptor dataChannelDescriptor = new DataChannelDescriptor();
 
-        domain.setName(DuplicateNameResolver.resolve(NameCheckers.dataChannelDescriptor, domain));
+        dataChannelDescriptor.setName(NameBuilder
+                .builder(dataChannelDescriptor)
+                .name());
 
         Project project = new Project(
-                new ConfigurationTree<DataChannelDescriptor>(domain));
+                new ConfigurationTree<DataChannelDescriptor>(dataChannelDescriptor));
 
         controller.projectOpenedAction(project);
 
         // select default domain
-        getProjectController().fireDomainDisplayEvent(
-                new DomainDisplayEvent(this, domain));
+        getProjectController().fireDomainDisplayEvent(new DomainDisplayEvent(this, dataChannelDescriptor));
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/38e4e7fd/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 a146307..cf835ef 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
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.action;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -34,9 +35,8 @@ 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.apache.cayenne.map.event.MapEvent;
-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;
@@ -48,11 +48,10 @@ import org.apache.cayenne.modeler.undo.PasteUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.modeler.util.CayenneTransferable;
 import org.apache.cayenne.query.Query;
-import org.apache.cayenne.map.QueryDescriptor;
 
-import javax.swing.KeyStroke;
+import javax.swing.*;
 import javax.swing.undo.UndoableEdit;
-import java.awt.Toolkit;
+import java.awt.*;
 import java.awt.datatransfer.FlavorEvent;
 import java.awt.datatransfer.FlavorListener;
 import java.awt.datatransfer.UnsupportedFlavorException;
@@ -69,10 +68,6 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
     private static final String COPY_PATTERN = "Copy of %s (%d)";
 
-    public static String getActionName() {
-        return "Paste";
-    }
-
     /**
      * Constructor for PasteAction
      */
@@ -84,6 +79,10 @@ public class PasteAction extends CayenneAction implements FlavorListener {
         Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(this);
     }
 
+    public static String getActionName() {
+        return "Paste";
+    }
+
     @Override
     public String getIconName() {
         return "icon-paste.gif";
@@ -125,19 +124,16 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                                 currentObject,
                                 o));
                     }
-                }
-                else {
+                } else {
                     paste(currentObject, content);
                     undoableEdit = new PasteUndoableEdit(domain, map, currentObject, content);
                 }
 
                 application.getUndoManager().addEdit(undoableEdit);
             }
-        }
-        catch (UnsupportedFlavorException ufe) {
+        } catch (UnsupportedFlavorException ufe) {
             // do nothing
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
             ErrorDebugDialog.guiException(ex);
         }
     }
@@ -154,7 +150,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
     public void paste(
             Object where,
             Object content,
-            DataChannelDescriptor domain,
+            DataChannelDescriptor dataChannelDescriptor,
             DataMap map) {
         final ProjectController mediator = getProjectController();
 
@@ -171,7 +167,11 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             // paste DataMap to DataDomain or DataNode
             DataMap dataMap = ((DataMap) content);
 
-            dataMap.setName(DuplicateNameResolver.resolve(NameCheckers.dataMap, COPY_PATTERN, domain, dataMap.getName()));
+            dataMap.setName(NameBuilder
+                    .builder(dataMap, dataChannelDescriptor)
+                    .baseName(dataMap.getName())
+                    .dupesPattern(COPY_PATTERN)
+                    .name());
 
             /**
              * Update all names in the new DataMap, so that they would not conflict with
@@ -182,20 +182,28 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             // to it as well
             Map<String, String> renamedDbEntities = new HashMap<>();
             Map<String, String> renamedObjEntities = new HashMap<>();
-
             Map<String, String> renamedEmbeddables = new HashMap<>();
 
             for (DbEntity dbEntity : dataMap.getDbEntities()) {
                 String oldName = dbEntity.getName();
-                dbEntity.setName(DuplicateNameResolver.resolve(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
+                dbEntity.setName(NameBuilder
+                        .builder(dbEntity, dataMap)
+                        .baseName(dbEntity.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 if (!oldName.equals(dbEntity.getName())) {
                     renamedDbEntities.put(oldName, dbEntity.getName());
                 }
             }
+
             for (ObjEntity objEntity : dataMap.getObjEntities()) {
                 String oldName = objEntity.getName();
-                objEntity.setName(DuplicateNameResolver.resolve(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
+                objEntity.setName(NameBuilder
+                        .builder(objEntity, dataMap)
+                        .baseName(objEntity.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 if (!oldName.equals(objEntity.getName())) {
                     renamedObjEntities.put(oldName, objEntity.getName());
@@ -204,7 +212,11 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             for (Embeddable embeddable : dataMap.getEmbeddables()) {
                 String oldName = embeddable.getClassName();
-                embeddable.setClassName(DuplicateNameResolver.resolve(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
+                embeddable.setClassName(NameBuilder
+                        .builder(embeddable, dataMap)
+                        .baseName(embeddable.getClassName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 if (!oldName.equals(embeddable.getClassName())) {
                     renamedEmbeddables.put(oldName, embeddable.getClassName());
@@ -212,10 +224,18 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
 
             for (Procedure procedure : dataMap.getProcedures()) {
-                procedure.setName(DuplicateNameResolver.resolve(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
+                procedure.setName(NameBuilder
+                        .builder(procedure, dataMap)
+                        .baseName(procedure.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
             }
+
             for (QueryDescriptor query : dataMap.getQueryDescriptors()) {
-                query.setName(DuplicateNameResolver.resolve(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
+                query.setName(NameBuilder.builder(query, dataMap)
+                        .baseName(query.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
             }
 
             // if an entity was renamed, we rename all links to it too
@@ -247,8 +267,7 @@ public class PasteAction extends CayenneAction implements FlavorListener {
             }
 
             mediator.addDataMap(this, dataMap);
-        }
-        else if (where instanceof DataMap) {
+        } else if (where instanceof DataMap) {
             // paste DbEntity to DataMap
             final DataMap dataMap = ((DataMap) where);
 
@@ -257,15 +276,21 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
             if (content instanceof DbEntity) {
                 DbEntity dbEntity = (DbEntity) content;
-                dbEntity.setName(DuplicateNameResolver.resolve(NameCheckers.dbEntity, COPY_PATTERN, dataMap, dbEntity.getName()));
+                dbEntity.setName(NameBuilder
+                        .builder(dbEntity, dataMap)
+                        .baseName(dbEntity.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 dataMap.addDbEntity(dbEntity);
                 CreateDbEntityAction.fireDbEntityEvent(this, mediator, dbEntity);
-            }
-            else if (content instanceof ObjEntity) {
+            } else if (content instanceof ObjEntity) {
                 // paste ObjEntity to DataMap
                 ObjEntity objEntity = (ObjEntity) content;
-                objEntity.setName(DuplicateNameResolver.resolve(NameCheckers.objEntity, COPY_PATTERN, dataMap, objEntity.getName()));
+                objEntity.setName(NameBuilder.builder(objEntity, dataMap)
+                        .baseName(objEntity.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 dataMap.addObjEntity(objEntity);
                 CreateObjEntityAction.fireObjEntityEvent(
@@ -273,11 +298,14 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                         mediator,
                         dataMap,
                         objEntity);
-            }
-            else if (content instanceof Embeddable) {
+            } else if (content instanceof Embeddable) {
                 // paste Embeddable to DataMap
                 Embeddable embeddable = (Embeddable) content;
-                embeddable.setClassName(DuplicateNameResolver.resolve(NameCheckers.embeddable, COPY_PATTERN, dataMap, embeddable.getClassName()));
+                embeddable.setClassName(NameBuilder
+                        .builder(embeddable, dataMap)
+                        .baseName(embeddable.getClassName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 dataMap.addEmbeddable(embeddable);
                 CreateEmbeddableAction.fireEmbeddableEvent(
@@ -285,20 +313,26 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                         mediator,
                         dataMap,
                         embeddable);
-            }
-            else if (content instanceof QueryDescriptor) {
+            } else if (content instanceof QueryDescriptor) {
                 QueryDescriptor query = (QueryDescriptor) content;
 
-                query.setName(DuplicateNameResolver.resolve(NameCheckers.query, COPY_PATTERN, dataMap, query.getName()));
+                query.setName(NameBuilder
+                        .builder(query, dataMap)
+                        .dupesPattern(COPY_PATTERN)
+                        .baseName(query.getName())
+                        .name());
                 query.setDataMap(dataMap);
 
                 dataMap.addQueryDescriptor(query);
                 QueryType.fireQueryEvent(this, mediator, dataMap, query);
-            }
-            else if (content instanceof Procedure) {
+            } else if (content instanceof Procedure) {
                 // paste Procedure to DataMap
                 Procedure procedure = (Procedure) content;
-                procedure.setName(DuplicateNameResolver.resolve(NameCheckers.procedure, COPY_PATTERN, dataMap, procedure.getName()));
+                procedure.setName(NameBuilder
+                        .builder(procedure, dataMap)
+                        .dupesPattern(COPY_PATTERN)
+                        .baseName(procedure.getName())
+                        .name());
 
                 dataMap.addProcedure(procedure);
                 CreateProcedureAction.fireProcedureEvent(
@@ -307,21 +341,27 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                         dataMap,
                         procedure);
             }
-        }
-        else if (where instanceof DbEntity) {
+        } else if (where instanceof DbEntity) {
             final DbEntity dbEntity = (DbEntity) where;
 
             if (content instanceof DbAttribute) {
                 DbAttribute attr = (DbAttribute) content;
-                attr.setName(DuplicateNameResolver.resolve(NameCheckers.dbAttribute, COPY_PATTERN, dbEntity, attr.getName()));
+                attr.setName(NameBuilder
+                        .builder(attr, dbEntity)
+                        .dupesPattern(COPY_PATTERN)
+                        .baseName(attr.getName())
+                        .name());
 
                 dbEntity.addAttribute(attr);
                 CreateAttributeAction.fireDbAttributeEvent(this, mediator, mediator
                         .getCurrentDataMap(), dbEntity, attr);
-            }
-            else if (content instanceof DbRelationship) {
+            } else if (content instanceof DbRelationship) {
                 DbRelationship rel = (DbRelationship) content;
-                rel.setName(DuplicateNameResolver.resolve(NameCheckers.dbRelationship, COPY_PATTERN, dbEntity, rel.getName()));
+                rel.setName(NameBuilder
+                        .builder(rel, dbEntity)
+                        .baseName(rel.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 dbEntity.addRelationship(rel);
                 CreateRelationshipAction.fireDbRelationshipEvent(
@@ -330,22 +370,27 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                         dbEntity,
                         rel);
             }
-        }
-        else if (where instanceof ObjEntity) {
-            final ObjEntity objEntity = (ObjEntity) where;
-
+        } else if (where instanceof ObjEntity) {
+            ObjEntity objEntity = (ObjEntity) where;
 
             if (content instanceof ObjAttribute) {
                 ObjAttribute attr = (ObjAttribute) content;
-                attr.setName(DuplicateNameResolver.resolve(NameCheckers.objAttribute, COPY_PATTERN, objEntity, attr.getName()));
+                attr.setName(NameBuilder
+                        .builder(attr, objEntity)
+                        .baseName(attr.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 objEntity.addAttribute(attr);
                 CreateAttributeAction.fireObjAttributeEvent(this, mediator, mediator
                         .getCurrentDataMap(), objEntity, attr);
-            }
-            else if (content instanceof ObjRelationship) {
+            } else if (content instanceof ObjRelationship) {
                 ObjRelationship rel = (ObjRelationship) content;
-                rel.setName(DuplicateNameResolver.resolve(NameCheckers.objRelationship, COPY_PATTERN, objEntity, rel.getName()));
+                rel.setName(NameBuilder
+                        .builder(rel, objEntity)
+                        .baseName(rel.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 objEntity.addRelationship(rel);
                 CreateRelationshipAction.fireObjRelationshipEvent(
@@ -353,13 +398,18 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                         mediator,
                         objEntity,
                         rel);
-            }
-            else if(content instanceof ObjCallbackMethod) {
+            } else if (content instanceof ObjCallbackMethod) {
                 ObjCallbackMethod method = (ObjCallbackMethod) content;
 
-                method.setName(DuplicateNameResolver.resolve(NameCheckers.objCallbackMethod, COPY_PATTERN, objEntity, method.getName()));
-                
-                objEntity.getCallbackMap().getCallbackDescriptor(mediator.getCurrentCallbackType().getType()).addCallbackMethod(method.getName());
+                method.setName(NameBuilder
+                        .builderForCallbackMethod(objEntity)
+                        .baseName(method.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
+
+                objEntity.getCallbackMap()
+                        .getCallbackDescriptor(mediator.getCurrentCallbackType().getType())
+                        .addCallbackMethod(method.getName());
 
                 CallbackMethodEvent ce = new CallbackMethodEvent(
                         this,
@@ -369,14 +419,16 @@ public class PasteAction extends CayenneAction implements FlavorListener {
 
                 getProjectController().fireCallbackMethodEvent(ce);
             }
-        }
-
-        else if (where instanceof Embeddable) {
+        } else if (where instanceof Embeddable) {
             final Embeddable embeddable = (Embeddable) where;
 
             if (content instanceof EmbeddableAttribute) {
                 EmbeddableAttribute attr = (EmbeddableAttribute) content;
-                attr.setName(DuplicateNameResolver.resolve(NameCheckers.embeddableAttribute, COPY_PATTERN, embeddable, attr.getName()));
+                attr.setName(NameBuilder
+                        .builder(attr, embeddable)
+                        .baseName(attr.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 embeddable.addAttribute(attr);
                 CreateAttributeAction.fireEmbeddableAttributeEvent(
@@ -386,16 +438,18 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                         attr);
             }
 
-        }
-
-        else if (where instanceof Procedure) {
+        } else if (where instanceof Procedure) {
             // paste param to procedure
             final Procedure procedure = (Procedure) where;
 
             if (content instanceof ProcedureParameter) {
                 ProcedureParameter param = (ProcedureParameter) content;
 
-                param.setName(DuplicateNameResolver.resolve(NameCheckers.procedureParameter, COPY_PATTERN, procedure, param.getName()));
+                param.setName(NameBuilder
+                        .builder(param, procedure)
+                        .baseName(param.getName())
+                        .dupesPattern(COPY_PATTERN)
+                        .name());
 
                 procedure.addCallParameter(param);
                 CreateProcedureParameterAction.fireProcedureParameterEvent(
@@ -476,9 +530,8 @@ public class PasteAction extends CayenneAction implements FlavorListener {
                     (currentObject instanceof Procedure
                             && (content instanceof ProcedureParameter || isTreeLeaf(content)) ||
 
-                    (currentObject instanceof Query && isTreeLeaf(content)));
-        }
-        catch (Exception ex) {
+                            (currentObject instanceof Query && isTreeLeaf(content)));
+        } catch (Exception ex) {
             return false;
         }
     }