You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/11/14 14:27:44 UTC

[13/32] cayenne git commit: Add cgen tab.

Add cgen tab.


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

Branch: refs/heads/master
Commit: 6a43436ab12017594762210c18dd508e2f2ded9d
Parents: aa22c93
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 31 10:51:32 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 31 10:51:32 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ArtifactsGenerationMode.java    |   2 +-
 .../cayenne/gen/ClassGenerationAction.java      | 499 ++++++++++---------
 .../gen/ClientClassGenerationAction.java        |   7 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      | 117 ++---
 .../cayenne/gen/xml/CgenSaverDelegate.java      |  23 +
 .../cayenne/gen/xml/EmbeddableHandler.java      |  70 ---
 .../cayenne/gen/xml/ObjEntityHandler.java       |  69 ---
 .../cayenne/project/CompoundSaverDelegate.java  |  28 +-
 .../cayenne/project/FileProjectSaver.java       |   2 +
 .../project/extension/BaseSaverDelegate.java    |  13 +
 .../project/extension/SaverDelegate.java        |   4 +
 .../main/java/org/apache/cayenne/util/Util.java |  33 +-
 .../cayenne/tools/CayenneGeneratorMojo.java     |   5 +-
 .../cayenne/modeler/CayenneModelerFrame.java    |  81 +--
 .../cayenne/modeler/action/CgenAction.java      |  27 -
 .../modeler/action/DefaultActionManager.java    |   5 +-
 .../dialog/codegen/ClassesTabController.java    |  13 +-
 .../modeler/dialog/codegen/ClassesTabPanel.java |  15 +-
 .../dialog/codegen/ClientModeController.java    |   2 +-
 .../dialog/codegen/CodeGeneratorController.java |   4 +-
 .../codegen/CodeGeneratorControllerBase.java    |  18 +-
 .../dialog/codegen/CodeGeneratorDialog.java     |  17 +-
 .../dialog/codegen/CustomModeController.java    |  19 +-
 .../modeler/dialog/codegen/CustomModePanel.java |   9 +-
 .../dialog/codegen/GeneratorController.java     |  26 +-
 .../codegen/GeneratorControllerPanel.java       |   4 +-
 .../dialog/codegen/GeneratorTabController.java  |   2 +-
 .../dialog/codegen/GeneratorTabPanel.java       |   2 +-
 .../dialog/codegen/StandardModeController.java  |   6 +-
 .../dialog/codegen/StandardModePanel.java       |   2 +-
 .../dialog/codegen/StandardPanelComponent.java  |   2 +-
 .../modeler/dialog/codegen/cgen/CgenDialog.java |  74 ---
 .../codegen/cgen/CgenGlobalController.java      |  68 ---
 .../dialog/codegen/cgen/CgenGlobalPanel.java    | 293 -----------
 .../codegen/cgen/CgenGlobalPanelController.java | 306 ------------
 .../modeler/editor/DataMapTabbedView.java       |  25 +-
 .../editor/cgen/ClassesTabController.java       |  13 +-
 .../modeler/editor/cgen/ClassesTabPanel.java    |  12 +-
 .../editor/cgen/ClientModeController.java       |  40 ++
 .../editor/cgen/CodeGeneratorController.java    |  48 +-
 .../cgen/CodeGeneratorControllerBase.java       | 112 +++--
 .../modeler/editor/cgen/CodeGeneratorPane.java  |  45 +-
 .../editor/cgen/CustomModeController.java       |  83 +--
 .../modeler/editor/cgen/CustomModePanel.java    | 137 +----
 .../editor/cgen/GeneratorController.java        | 157 +++---
 .../editor/cgen/GeneratorControllerPanel.java   |  30 +-
 .../editor/cgen/GeneratorTabController.java     |  64 ++-
 .../modeler/editor/cgen/GeneratorTabPanel.java  |  70 ++-
 .../editor/cgen/StandardModeController.java     |  61 +++
 .../modeler/editor/cgen/StandardModePanel.java  |  42 ++
 .../editor/cgen/StandardPanelComponent.java     |  63 +++
 51 files changed, 1027 insertions(+), 1842 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
index e76c172..98aca33 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
@@ -26,7 +26,7 @@ package org.apache.cayenne.gen;
 public enum ArtifactsGenerationMode {
 
     // TODO: andrus 12/9/2007 - label names are old... need to call it something else...
-    DATAMAP("datamap"), ENTITY("entity"), ALL("all");
+    ENTITY("entity"), ALL("all");
 
     private String label;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index f74ca21..434421f 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -33,16 +33,12 @@ import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.slf4j.Logger;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Serializable;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.stream.Collectors;
 
 public class ClassGenerationAction implements Serializable, XMLSerializable {
 	static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
@@ -62,10 +58,11 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	public static final String SUPERCLASS_PREFIX = "_";
 	private static final String WILDCARD = "*";
 
-	protected Collection<Artifact> artifacts;
-
+	Collection<Artifact> artifacts;
 	private Collection<String> entityArtifacts;
+	private Collection<String> excludeEntityArtifacts;
 	private Collection<String> embeddableArtifacts;
+	private Collection<String> excludeEmbeddableArtifacts;
 
 	protected String superPkg;
 	protected DataMap dataMap;
@@ -74,7 +71,10 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	protected boolean makePairs;
 
 	protected Logger logger;
-	protected File destDir;
+
+	protected Path rootPath;
+	protected Path relPath;
+
 	protected boolean overwrite;
 	protected boolean usePkgPath;
 
@@ -110,22 +110,20 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 
         this.artifacts = new ArrayList<>();
         this.entityArtifacts = new ArrayList<>();
+        this.excludeEntityArtifacts = new ArrayList<>();
         this.embeddableArtifacts = new ArrayList<>();
+        this.excludeEmbeddableArtifacts = new ArrayList<>();
         this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
 
         this.overwrite = false;
-	}
-
-	public void setDefaults() {
-        this.template = SUBCLASS_TEMPLATE;
-        this.superTemplate = SUPERCLASS_TEMPLATE;
+		this.template = SUBCLASS_TEMPLATE;
+		this.superTemplate = SUPERCLASS_TEMPLATE;
+		this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
+		this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
 
-        this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
-        this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
-
-        this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
-        this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
-    }
+		this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
+		this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
+	}
 
 	protected String defaultTemplateName(TemplateType type) {
 		switch (type) {
@@ -178,14 +176,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	/**
-	 * Returns a String used to prefix class name to create a generated
-	 * superclass. Default value is "_".
-	 */
-	private String getSuperclassPrefix() {
-		return ClassGenerationAction.SUPERCLASS_PREFIX;
-	}
-
-	/**
 	 * VelocityContext initialization method called once per artifact.
 	 */
 	private void resetContextForArtifact(Artifact artifact) {
@@ -232,7 +222,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public void prepareArtifacts() {
-        resetArtifacts();
+		this.artifacts.clear();
         addAllEntities();
         addAllEmbeddables();
         addQueries(dataMap.getQueryDescriptors());
@@ -317,84 +307,21 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * Called internally from "execute".
 	 */
 	private void validateAttributes() {
-		if (destDir == null) {
-			throw new CayenneRuntimeException("'destDir' attribute is missing.");
+		Path dir = buildPath();
+		if (dir == null) {
+			throw new CayenneRuntimeException("'rootPath' attribute is missing.");
 		}
 
-		if (!destDir.isDirectory()) {
+		if (!Files.isDirectory(dir)) {
 			throw new CayenneRuntimeException("'destDir' is not a directory.");
 		}
 
-		if (!destDir.canWrite()) {
-			throw new CayenneRuntimeException("Do not have write permissions for %s", destDir);
+		if (!Files.isWritable(dir)) {
+			throw new CayenneRuntimeException("Do not have write permissions for %s", dir);
 		}
 	}
 
 	/**
-	 * Sets the destDir.
-	 */
-	public void setDestDir(File destDir) {
-		this.destDir = destDir;
-	}
-
-	/**
-	 * Sets <code>overwrite</code> property.
-	 */
-	public void setOverwrite(boolean overwrite) {
-		this.overwrite = overwrite;
-	}
-
-	/**
-	 * Sets <code>makepairs</code> property.
-	 */
-	public void setMakePairs(boolean makePairs) {
-		this.makePairs = makePairs;
-	}
-
-	/**
-	 * Sets <code>template</code> property.
-	 */
-	public void setTemplate(String template) {
-		this.template = template;
-	}
-
-	/**
-	 * Sets <code>superTemplate</code> property.
-	 */
-	public void setSuperTemplate(String superTemplate) {
-		this.superTemplate = superTemplate;
-	}
-
-	public void setQueryTemplate(String queryTemplate) {
-		this.queryTemplate = queryTemplate;
-	}
-
-	public void setQuerySuperTemplate(String querySuperTemplate) {
-		this.querySuperTemplate = querySuperTemplate;
-	}
-
-	/**
-	 * Sets <code>usepkgpath</code> property.
-	 */
-	public void setUsePkgPath(boolean usePkgPath) {
-		this.usePkgPath = usePkgPath;
-	}
-
-	/**
-	 * Sets <code>outputPattern</code> property.
-	 */
-	public void setOutputPattern(String outputPattern) {
-		this.outputPattern = outputPattern;
-	}
-
-	/**
-	 * Sets <code>createPropertyNames</code> property.
-	 */
-	public void setCreatePropertyNames(boolean createPropertyNames) {
-		this.createPropertyNames = createPropertyNames;
-	}
-
-	/**
 	 * Opens a Writer to write generated output. Returned Writer is mapped to a
 	 * filesystem file (although subclasses may override that). File location is
 	 * determined from the current state of VelocityContext and the TemplateType
@@ -429,7 +356,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		String className = (String) context.get(Artifact.SUPER_CLASS_KEY);
 
 		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
-		File dest = new File(mkpath(destDir, packageName), filename);
+		File dest = new File(mkpath(new File(getDir()), packageName), filename);
 
 		if (dest.exists() && !fileNeedUpdate(dest, superTemplate)) {
 			return null;
@@ -448,7 +375,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		String className = (String) context.get(Artifact.SUB_CLASS_KEY);
 
 		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
-		File dest = new File(mkpath(destDir, packageName), filename);
+		File dest = new File(mkpath(new File(Objects.requireNonNull(buildPath()).toString()), packageName), filename);
 
 		if (dest.exists()) {
 			// no overwrite of subclasses
@@ -517,31 +444,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return fullPath;
 	}
 
-	public void setTimestamp(long timestamp) {
-		this.timestamp = timestamp;
-	}
-
-	/**
-	 * Sets file encoding. If set to null, default system encoding will be used.
-	 */
-	public void setEncoding(String encoding) {
-		this.encoding = encoding;
-	}
-
-	/**
-	 * Sets "superPkg" property value.
-	 */
-	public void setSuperPkg(String superPkg) {
-		this.superPkg = superPkg;
-	}
-
-	/**
-	 * @param dataMap The dataMap to set.
-	 */
-	public void setDataMap(DataMap dataMap) {
-		this.dataMap = dataMap;
-	}
-
 	/**
 	 * Adds entities to the internal entity list.
 	 * @param entities collection
@@ -549,64 +451,50 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * @since 4.0 throws exception
 	 */
 	public void addEntities(Collection<ObjEntity> entities) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			if (entities != null) {
-				for (ObjEntity entity : entities) {
-					artifacts.add(new EntityArtifact(entity));
-				}
+		if (entities != null) {
+			for (ObjEntity entity : entities) {
+				artifacts.add(new EntityArtifact(entity));
 			}
 		}
 	}
 
 	public void addEmbeddables(Collection<Embeddable> embeddables) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			if (embeddables != null) {
-				for (Embeddable embeddable : embeddables) {
-					artifacts.add(new EmbeddableArtifact(embeddable));
-				}
+		if (embeddables != null) {
+			for (Embeddable embeddable : embeddables) {
+				artifacts.add(new EmbeddableArtifact(embeddable));
 			}
 		}
 	}
 
 	public void addQueries(Collection<QueryDescriptor> queries) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.DATAMAP
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-
+		if (artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
 			// TODO: andrus 10.12.2010 - why not also check for empty query list??
 			// Or create a better API for enabling DataMapArtifact
 			if (queries != null) {
 				Artifact artifact = new DataMapArtifact(dataMap, queries);
 				if(!artifacts.contains(artifact)) {
-					artifacts.add(new DataMapArtifact(dataMap, queries));
+					artifacts.add(artifact);
 				}
 			}
 		}
 	}
 
     private void addAllEntities() {
-		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-            entityArtifacts.forEach(val -> {
-            	Artifact artifact = new EntityArtifact(dataMap.getObjEntity(val));
-            	if(!artifacts.contains(artifact)) {
-					artifacts.add(artifact);
-				}
-			});
-		}
+		entityArtifacts.forEach(val -> {
+			Artifact artifact = new EntityArtifact(dataMap.getObjEntity(val));
+			if(!artifacts.contains(artifact)) {
+				artifacts.add(artifact);
+			}
+		});
 	}
 
     private void addAllEmbeddables() {
-		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-		    embeddableArtifacts.forEach(val -> {
-		    	Artifact artifact = new EmbeddableArtifact(dataMap.getEmbeddable(val));
-				if(!artifacts.contains(artifact)) {
-		    		artifacts.add(artifact);
-		    	}
-			});
-		}
+		embeddableArtifacts.forEach(val -> {
+			Artifact artifact = new EmbeddableArtifact(dataMap.getEmbeddable(val));
+			if(!artifacts.contains(artifact)) {
+				artifacts.add(artifact);
+			}
+		});
 	}
 
     /**
@@ -616,85 +504,91 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		entityArtifacts.add(name);
 	}
 
-    /**
-     * @since 4.1
-     */
+	/**
+	 * @since 4.1
+	 */
 	public void loadEmbeddable(String name) {
 		embeddableArtifacts.add(name);
 	}
 
-	/**
-	 * Sets an optional shared VelocityContext. Useful with tools like VPP that
-	 * can set custom values in the context, not known to Cayenne.
-	 */
-	public void setContext(VelocityContext context) {
-		this.context = context;
+	public void setArtifactsGenerationMode(String mode) {
+		if (ArtifactsGenerationMode.ENTITY.getLabel().equalsIgnoreCase(mode)) {
+			this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+		} else {
+			this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
+		}
 	}
 
-	/**
-	 * Injects an optional logger that will be used to trace generated files at
-	 * the info level.
-	 */
-	public void setLogger(Logger logger) {
-		this.logger = logger;
+	public Path buildPath() {
+		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : null;
 	}
 
-	public void setEmbeddableTemplate(String embeddableTemplate) {
-		this.embeddableTemplate = embeddableTemplate;
+	public void loadEntities(String entities) {
+		excludeEntityArtifacts.addAll(Arrays.asList(entities.split(",")));
 	}
 
-	public void setEmbeddableSuperTemplate(String embeddableSuperTemplate) {
-		this.embeddableSuperTemplate = embeddableSuperTemplate;
+	public void resolveExcludeEntities() {
+		entityArtifacts = dataMap.getObjEntities()
+				.stream()
+				.filter(entity -> !excludeEntityArtifacts.contains(entity.getName()))
+				.map(ObjEntity::getName)
+				.collect(Collectors.toList());
 	}
 
-	public void setArtifactsGenerationMode(String mode) {
-		if (ArtifactsGenerationMode.ENTITY.getLabel().equalsIgnoreCase(mode)) {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
-		} else if (ArtifactsGenerationMode.DATAMAP.getLabel().equalsIgnoreCase(mode)) {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.DATAMAP;
-		} else {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
-		}
+	public void loadEmbeddables(String embeddables) {
+		excludeEmbeddableArtifacts.addAll(Arrays.asList(embeddables.split(",")));
 	}
 
-    /**
-     * @since 4.1
-     */
-    public boolean isCreatePKProperties() {
-        return createPKProperties;
-    }
+	public void resolveExcludeEmbeddables() {
+    	embeddableArtifacts = dataMap.getEmbeddables()
+				.stream()
+				.filter(embeddable -> !excludeEmbeddableArtifacts.contains(embeddable.getClassName()))
+				.map(Embeddable::getClassName)
+				.collect(Collectors.toList());
+	}
 
-    /**
-     * @since 4.1
-     */
-    public void setCreatePKProperties(boolean createPKProperties) {
-        this.createPKProperties = createPKProperties;
-    }
+    public void resetCollections(){
+		this.embeddableArtifacts.clear();
+		this.entityArtifacts.clear();
+	}
 
-    private Collection<EntityArtifact> getEntityArtifacts() {
-		resetArtifacts();
-		addAllEntities();
-		Collection<EntityArtifact> entityArtifacts = new ArrayList<>();
-		for(Artifact artifact : artifacts){
-			if(artifact instanceof EntityArtifact){
-				entityArtifacts.add((EntityArtifact) artifact);
-			}
-		}
-		return entityArtifacts;
+	private String getExcludeEntites() {
+		Collection<String> excludeEntities = dataMap.getObjEntities()
+				.stream()
+				.filter(entity -> !entityArtifacts.contains(entity.getName()))
+				.map(ObjEntity::getName)
+				.collect(Collectors.toList());
+		return org.apache.commons.lang3.StringUtils.join(excludeEntities, ",");
 	}
 
-    private Collection<EmbeddableArtifact> getEmbeddableArtifacts() {
-		resetArtifacts();
-		addAllEmbeddables();
-		Collection<EmbeddableArtifact> embeddableArtifacts = new ArrayList<>();
-		for(Artifact artifact : artifacts){
-			if(artifact instanceof EmbeddableArtifact){
-				embeddableArtifacts.add((EmbeddableArtifact) artifact);
-			}
-		}
+	private String getExcludeEmbeddables() {
+		Collection<String> excludeEmbeddable = dataMap.getEmbeddables()
+				.stream()
+				.filter(embeddable -> !embeddableArtifacts.contains(embeddable.getClassName()))
+				.map(Embeddable::getClassName)
+				.collect(Collectors.toList());
+		return org.apache.commons.lang3.StringUtils.join(excludeEmbeddable, ",");
+	}
+
+	/**
+	 * Returns a String used to prefix class name to create a generated
+	 * superclass. Default value is "_".
+	 */
+	private String getSuperclassPrefix() {
+		return ClassGenerationAction.SUPERCLASS_PREFIX;
+	}
+
+	public Collection<String> getEmbeddables() {
 		return embeddableArtifacts;
 	}
 
+	/**
+	 * @since 4.1
+	 */
+	public boolean isCreatePKProperties() {
+		return createPKProperties;
+	}
+
 	public boolean isMakePairs() {
 		return makePairs;
 	}
@@ -724,11 +618,9 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public String getDir(){
-		return destDir != null ? destDir.getAbsolutePath() : null;
+		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize().toString() : rootPath.toString() : null;
 	}
 
-	public File getDestDir() { return destDir; }
-
 	public String getTemplate() {
 		return template;
 	}
@@ -737,16 +629,15 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return superPkg;
 	}
 
-	private void resetArtifacts(){
-		this.artifacts = new ArrayList<>();
-	}
-
 	public Collection<String> getEntities() {
 		return entityArtifacts;
 	}
 
-	public Collection<String> getEmbeddables() {
-		return embeddableArtifacts;
+	public String getRelPath() {
+    	if(relPath == null || relPath.toString().isEmpty()) {
+    		return ".";
+		}
+		return relPath.toString();
 	}
 
 	public String getArtifactsGenerationMode(){
@@ -774,39 +665,155 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public String getQueryTemplate() {
-	    return queryTemplate;
-    }
+		return queryTemplate;
+	}
 
-    public String getQuerySuperTemplate() {
-        return querySuperTemplate;
-    }
+	public String getQuerySuperTemplate() {
+		return querySuperTemplate;
+	}
 
-    public void resetCollections(){
-		this.embeddableArtifacts = new ArrayList<>();
-		this.entityArtifacts = new ArrayList<>();
+	/**
+	 * Sets an optional shared nVelocityContext. Useful with tools like VPP that
+	 * can set custom values in the context, not known to Cayenne.
+	 */
+	public void setContext(VelocityContext context) {
+		this.context = context;
+	}
+
+	/**
+	 * Injects an optional logger that will be used to trace generated files at
+	 * the info level.
+	 */
+	public void setLogger(Logger logger) {
+		this.logger = logger;
+	}
+
+	public void setTimestamp(long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	/**
+	 * Sets file encoding. If set to null, default system encoding will be used.
+	 */
+	public void setEncoding(String encoding) {
+		this.encoding = encoding;
+	}
+
+	/**
+	 * Sets "superPkg" property value.
+	 */
+	public void setSuperPkg(String superPkg) {
+		this.superPkg = superPkg;
+	}
+
+	/**
+	 * @param dataMap The dataMap to set.
+	 */
+	public void setDataMap(DataMap dataMap) {
+		this.dataMap = dataMap;
+	}
+
+	public void setEmbeddableTemplate(String embeddableTemplate) {
+		this.embeddableTemplate = embeddableTemplate;
+	}
+
+	public void setEmbeddableSuperTemplate(String embeddableSuperTemplate) {
+		this.embeddableSuperTemplate = embeddableSuperTemplate;
+	}
+
+	/**
+	 * Sets <code>overwrite</code> property.
+	 */
+	public void setOverwrite(boolean overwrite) {
+		this.overwrite = overwrite;
+	}
+
+	/**
+	 * Sets <code>makepairs</code> property.
+	 */
+	public void setMakePairs(boolean makePairs) {
+		this.makePairs = makePairs;
+	}
+
+	/**
+	 * Sets <code>template</code> property.
+	 */
+	public void setTemplate(String template) {
+		this.template = template;
+	}
+
+	/**
+	 * Sets <code>superTemplate</code> property.
+	 */
+	public void setSuperTemplate(String superTemplate) {
+		this.superTemplate = superTemplate;
+	}
+
+	public void setQueryTemplate(String queryTemplate) {
+		this.queryTemplate = queryTemplate;
+	}
+
+	public void setQuerySuperTemplate(String querySuperTemplate) {
+		this.querySuperTemplate = querySuperTemplate;
+	}
+
+	/**
+	 * Sets <code>usepkgpath</code> property.
+	 */
+	public void setUsePkgPath(boolean usePkgPath) {
+		this.usePkgPath = usePkgPath;
+	}
+
+	/**
+	 * Sets <code>outputPattern</code> property.
+	 */
+	public void setOutputPattern(String outputPattern) {
+		this.outputPattern = outputPattern;
+	}
+
+	/**
+	 * Sets <code>createPropertyNames</code> property.
+	 */
+	public void setCreatePropertyNames(boolean createPropertyNames) {
+		this.createPropertyNames = createPropertyNames;
+	}
+
+	/**
+	 * @since 4.1
+	 */
+	public void setCreatePKProperties(boolean createPKProperties) {
+		this.createPKProperties = createPKProperties;
+	}
+
+	public void setRootPath(Path rootPath) {
+		this.rootPath = rootPath;
+	}
+
+	public void setRelPath(Path relPath) {
+		this.relPath = relPath;
+	}
+
+	public void setRelPath(String path) {
+		this.relPath = rootPath.relativize(Paths.get(path));
 	}
 
 	@Override
 	public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
 		encoder.start("cgen")
 				.attribute("xmlns", CgenExtension.NAMESPACE)
-				.nested(this.getEntityArtifacts(), delegate)
-				.nested(this.getEmbeddableArtifacts(), delegate)
-				.simpleTag("outputDirectory", this.destDir != null ? this.destDir.getAbsolutePath() : null)
+				.simpleTag("excludeEntities", getExcludeEntites())
+				.simpleTag("excludeEmbeddables",getExcludeEmbeddables())
+				.simpleTag("outputDirectory", getRelPath())
 				.simpleTag("generationMode", this.artifactsGenerationMode.getLabel())
-                .simpleTag("dataMapTemplate", this.queryTemplate)
-                .simpleTag("dataMapSuperclassTemplate", this.querySuperTemplate)
 				.simpleTag("subclassTemplate", this.template)
 				.simpleTag("superclassTemplate", this.superTemplate)
-				.simpleTag("embeddableTemplate", this.embeddableTemplate)
-				.simpleTag("embeddableSuperclassTemplate", this.embeddableSuperTemplate)
 				.simpleTag("outputPattern", this.outputPattern)
 				.simpleTag("makePairs", Boolean.toString(this.makePairs))
 				.simpleTag("usePkgPath", Boolean.toString(this.usePkgPath))
 				.simpleTag("overwriteSubclasses", Boolean.toString(this.overwrite))
 				.simpleTag("createPropertyNames", Boolean.toString(this.createPropertyNames))
 				.simpleTag("superPkg", this.superPkg)
-				.simpleTag("encoding", this.encoding)
+				.simpleTag("createPKProperties", Boolean.toString(this.createPKProperties))
 				.end();
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
index c944f40..c8880aa 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
@@ -19,12 +19,12 @@
 
 package org.apache.cayenne.gen;
 
-import java.util.Collection;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 
+import java.util.Collection;
+
 /**
  * @since 3.0
  */
@@ -88,8 +88,7 @@ public class ClientClassGenerationAction extends ClassGenerationAction {
 
     @Override
     public void addQueries(Collection<QueryDescriptor> queries) {
-        if (artifactsGenerationMode == ArtifactsGenerationMode.DATAMAP
-                || artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
+        if (artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
             if (queries != null) {
                 artifacts.add(new ClientDataMapArtifact(dataMap, queries));
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
index f77f1f1..7883ca2 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
@@ -22,10 +22,9 @@ import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
-import java.io.File;
+import java.nio.file.Paths;
 
 /**
  * @since 4.1
@@ -43,14 +42,9 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     private static final String USE_PKG_PATH_TAG = "usePkgPath";
     private static final String OVERWRITE_SUBCLASSES_TAG = "overwriteSubclasses";
     private static final String CREATE_PROPERTY_NAMES_TAG = "createPropertyNames";
-    private static final String SUPER_PKG_TAG = "superPkg";
-    private static final String OBJENTITY_TAG = "objEntity";
-    private static final String EMBEDDABLE_TAG = "embeddable";
-    private static final String ENCODING_TAG = "encoding";
-    private static final String EMBEDDABLE_TEMPLATE_TAG = "embeddableTemplate";
-    private static final String EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG = "embeddableSuperclassTemplate";
-    private static final String DATAMAP_TEMPLATE_TAG = "dataMapTemplate";
-    private static final String DATAMAP_SUPERCLASS_TEMPLATE_TAG = "dataMapSuperclassTemplate";
+    private static final String EXCLUDE_ENTITIES_TAG = "excludeEntities";
+    private static final String EXCLUDE_EMBEDDABLES_TAG = "excludeEmbeddables";
+    private static final String CREATE_PK_PROPERTIES = "createPKProperties";
 
     public static final String TRUE = "true";
 
@@ -74,22 +68,6 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     }
 
     @Override
-    protected ContentHandler createChildTagHandler(String namespaceURI, String localName,
-                                                   String qName, Attributes attributes) {
-
-        if (namespaceURI.equals(targetNamespace)) {
-            switch (localName) {
-                case OBJENTITY_TAG:
-                    return new ObjEntityHandler(this, configuration);
-                case EMBEDDABLE_TAG:
-                    return new EmbeddableHandler(this, configuration);
-            }
-        }
-
-        return super.createChildTagHandler(namespaceURI, localName, qName, attributes);
-    }
-
-    @Override
     protected void processCharData(String localName, String data) {
         switch (localName) {
             case OUTPUT_DIRECTORY_TAG:
@@ -98,6 +76,12 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case GENERATION_MODE_TAG:
                 createGenerationMode(data);
                 break;
+            case EXCLUDE_ENTITIES_TAG:
+                createExcludeEntities(data);
+                break;
+            case EXCLUDE_EMBEDDABLES_TAG:
+                createExcludeEmbeddables(data);
+                break;
             case SUBCLASS_TEMPLATE_TAG:
                 createSubclassTemplate(data);
                 break;
@@ -119,23 +103,8 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case CREATE_PROPERTY_NAMES_TAG:
                 createPropertyNamesTag(data);
                 break;
-            case SUPER_PKG_TAG:
-                createSuperPkg(data);
-                break;
-            case ENCODING_TAG:
-                createEncoding(data);
-                break;
-            case EMBEDDABLE_TEMPLATE_TAG:
-                createEmbeddableTemplate(data);
-                break;
-            case EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG:
-                createEmbeddableSuperclassTemplate(data);
-                break;
-            case DATAMAP_TEMPLATE_TAG:
-                createDataMapTemplate(data);
-                break;
-            case DATAMAP_SUPERCLASS_TEMPLATE_TAG:
-                createDataMapSuperclassTemplate(data);
+            case CREATE_PK_PROPERTIES:
+                createPkPropertiesTag(data);
                 break;
         }
     }
@@ -146,7 +115,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
 
         if(configuration != null) {
-            configuration.setDestDir(new File(path));
+            configuration.setRelPath(Paths.get(path));
         }
     }
 
@@ -160,43 +129,43 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
-    private void createSubclassTemplate(String template) {
-        if(template.trim().length() == 0) {
+    private void createExcludeEntities(String entities) {
+        if(entities.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setTemplate(template);
+            configuration.loadEntities(entities);
         }
     }
 
-    private void createSuperclassTemplate(String template) {
-        if(template.trim().length() == 0) {
+    private void createExcludeEmbeddables(String embeddables) {
+        if(embeddables.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setSuperTemplate(template);
+            configuration.loadEmbeddables(embeddables);
         }
     }
 
-    private void createEmbeddableTemplate(String template) {
+    private void createSubclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setEmbeddableTemplate(template);
+            configuration.setTemplate(template);
         }
     }
 
-    private void createEmbeddableSuperclassTemplate(String template) {
+    private void createSuperclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setEmbeddableSuperTemplate(template);
+            configuration.setSuperTemplate(template);
         }
     }
 
@@ -266,43 +235,17 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
-    private void createSuperPkg(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.setSuperPkg(data);
-        }
-    }
-
-    private void createEncoding(String data) {
+    private void createPkPropertiesTag(String data) {
         if(data.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setEncoding(data);
-        }
-    }
-
-    private void createDataMapTemplate(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.setQueryTemplate(data);
-        }
-    }
-
-    private void createDataMapSuperclassTemplate(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.setQuerySuperTemplate(data);
+            if(data.equals(TRUE)) {
+                configuration.setCreatePKProperties(true);
+            } else {
+                configuration.setCreatePKProperties(false);
+            }
         }
     }
 
@@ -310,6 +253,8 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         configuration = new ClassGenerationAction();
         loaderContext.addDataMapListener(dataMap -> {
             configuration.setDataMap(dataMap);
+            configuration.resolveExcludeEntities();
+            configuration.resolveExcludeEmbeddables();
             CgenConfigHandler.this.metaData.add(dataMap, configuration);
         });
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
index 8d25cf1..fc23e50 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
@@ -23,6 +23,11 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.project.extension.BaseSaverDelegate;
 
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
 /**
  * @since 4.1
  */
@@ -38,8 +43,26 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
     public Void visitDataMap(DataMap dataMap) {
         ClassGenerationAction cgen = metaData.get(dataMap, ClassGenerationAction.class);
         if(cgen != null){
+            resolveOutputDir(cgen);
             encoder.nested(cgen, getParentDelegate());
         }
         return null;
     }
+
+    private void resolveOutputDir(ClassGenerationAction classGenerationAction) {
+        Path prevPath = classGenerationAction.buildPath();
+        URL url = getBaseDirectory().getURL();
+        if(url != null) {
+            Path resourcePath = Paths.get(url.getPath());
+            if(Files.isRegularFile(resourcePath)) {
+                resourcePath = resourcePath.getParent();
+            }
+
+            if(prevPath != null && resourcePath.compareTo(prevPath) != 0) {
+                classGenerationAction.setRootPath(resourcePath);
+                Path relPath = resourcePath.relativize(prevPath);
+                classGenerationAction.setRelPath(relPath);
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
deleted file mode 100644
index 4772348..0000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
+++ /dev/null
@@ -1,70 +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.gen.xml;
-
-import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @since 4.1
- */
-public class EmbeddableHandler extends NamespaceAwareNestedTagHandler {
-
-    private static final String EMBEDDABLE_TAG = "embeddable";
-    private static final String EMBEDDABLE_NAME_TAG = "name";
-
-    private ClassGenerationAction configuration;
-
-    EmbeddableHandler(NamespaceAwareNestedTagHandler parentHandler, ClassGenerationAction configuration) {
-        super(parentHandler);
-        this.configuration = configuration;
-    }
-
-    @Override
-    protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
-        switch (localName) {
-            case EMBEDDABLE_TAG:
-                return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    protected void processCharData(String localName, String data) {
-        switch (localName) {
-            case EMBEDDABLE_NAME_TAG:
-                createEmbeddableEntity(data);
-                break;
-        }
-    }
-
-    private void createEmbeddableEntity(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.loadEmbeddable(data);
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
deleted file mode 100644
index 593a002..0000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
+++ /dev/null
@@ -1,69 +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.gen.xml;
-
-import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @since 4.1
- */
-public class ObjEntityHandler extends NamespaceAwareNestedTagHandler {
-
-    private static final String OBJENTITY_TAG = "objEntity";
-    private static final String OBJENTITY_NAME_TAG = "name";
-
-    private ClassGenerationAction configuration;
-
-    ObjEntityHandler(NamespaceAwareNestedTagHandler parentHandler, ClassGenerationAction configuration) {
-        super(parentHandler);
-        this.configuration = configuration;
-    }
-
-    @Override
-    protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
-        switch (localName) {
-            case OBJENTITY_TAG:
-                return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    protected void processCharData(String localName, String data) {
-        switch (localName) {
-            case OBJENTITY_NAME_TAG:
-                createObjEntity(data);
-                break;
-        }
-    }
-
-    private void createObjEntity(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.loadEntity(data);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
index 5ea7a29..4745e38 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
@@ -19,25 +19,15 @@
 
 package org.apache.cayenne.project;
 
-import java.util.Collection;
-
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-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.apache.cayenne.map.*;
 import org.apache.cayenne.project.extension.SaverDelegate;
+import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
 
+import java.util.Collection;
+
 /**
  * @since 4.1
  */
@@ -180,4 +170,14 @@ class CompoundSaverDelegate implements SaverDelegate {
     public SaverDelegate getParentDelegate() {
         return null;
     }
+
+    @Override
+    public Resource getBaseDirectory() {
+        return null;
+    }
+
+    @Override
+    public void setBaseDirectory(Resource baseDirectory) {
+        delegates.forEach(d -> d.setBaseDirectory(baseDirectory));
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
index 0d6af44..20e2328 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
@@ -97,6 +97,8 @@ public class FileProjectSaver implements ProjectSaver {
 		Collection<ConfigurationNode> nodes = project.getRootNode().acceptVisitor(saveableNodesGetter);
 		Collection<SaveUnit> units = new ArrayList<>(nodes.size());
 
+		delegate.setBaseDirectory(baseResource);
+
 		for(ConfigurationNode node : nodes) {
 			String targetLocation = nameMapper.configurationLocation(node);
 			Resource targetResource = baseResource.getRelativeResource(targetLocation);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
index a9f45f2..adb5d94 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
@@ -33,6 +33,7 @@ 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.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
 
 /**
@@ -46,6 +47,8 @@ public class BaseSaverDelegate implements SaverDelegate {
 
     protected SaverDelegate parentDelegate;
 
+    protected Resource baseDirectory;
+
     @Override
     public Void visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) {
         return null;
@@ -131,6 +134,16 @@ public class BaseSaverDelegate implements SaverDelegate {
         return parentDelegate;
     }
 
+    @Override
+    public Resource getBaseDirectory() {
+        return baseDirectory;
+    }
+
+    @Override
+    public void setBaseDirectory(Resource baseDirectory) {
+        this.baseDirectory = baseDirectory;
+    }
+
     protected boolean isStandalone() {
         return parentDelegate == null;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
index 4ed5c92..1a002fd 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.project.extension;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
 
 /**
@@ -42,4 +43,7 @@ public interface SaverDelegate extends ConfigurationNodeVisitor<Void> {
 
     SaverDelegate getParentDelegate();
 
+    Resource getBaseDirectory();
+
+    void setBaseDirectory(Resource baseDirectory);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 08941b8..de280b4 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
@@ -26,45 +26,20 @@ 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.apache.cayenne.reflect.*;
 import org.w3c.dom.Document;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-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;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
+import javax.xml.parsers.*;
+import java.io.*;
 import java.lang.reflect.Member;
 import java.lang.reflect.Modifier;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
+import java.util.*;
 import java.util.regex.Pattern;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
index 3bdf08b..1ab9f96 100644
--- a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
+++ b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
@@ -207,7 +207,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
      * @since 4.1
      */
     @Parameter(defaultValue = "false")
-    private boolean createPKProperties;
+    private Boolean createPKProperties;
 
     private transient Injector injector;
 
@@ -295,7 +295,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 		injector.injectMembers(action);
 
-		action.setDestDir(destDir);
+//		action.setDestDir(destDir.toPath());
 		action.setEncoding(encoding != null ? encoding : action.getEncoding());
 		action.setMakePairs(makePairs != null ? makePairs : action.isMakePairs());
 		action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
@@ -310,6 +310,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		action.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : action.isCreatePropertyNames());
 		action.setQueryTemplate(queryTemplate != null ? queryTemplate : action.getQueryTemplate());
 		action.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : action.getQuerySuperTemplate());
+		action.setCreatePKProperties(createPKProperties != null ? createPKProperties : action.isCreatePropertyNames());
 		return action;
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
index 97772de..1af72ba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
@@ -19,64 +19,12 @@
 
 package org.apache.cayenne.modeler;
 
-import org.apache.cayenne.modeler.action.AboutAction;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CgenAction;
-import org.apache.cayenne.modeler.action.ConfigurePreferencesAction;
-import org.apache.cayenne.modeler.action.CopyAction;
-import org.apache.cayenne.modeler.action.CreateDataMapAction;
-import org.apache.cayenne.modeler.action.CreateDbEntityAction;
-import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
-import org.apache.cayenne.modeler.action.CreateNodeAction;
-import org.apache.cayenne.modeler.action.CreateObjEntityAction;
-import org.apache.cayenne.modeler.action.CreateProcedureAction;
-import org.apache.cayenne.modeler.action.CreateQueryAction;
-import org.apache.cayenne.modeler.action.CutAction;
-import org.apache.cayenne.modeler.action.DbEntitySyncAction;
-import org.apache.cayenne.modeler.action.DocumentationAction;
-import org.apache.cayenne.modeler.action.ExitAction;
-import org.apache.cayenne.modeler.action.FindAction;
-import org.apache.cayenne.modeler.action.GenerateCodeAction;
-import org.apache.cayenne.modeler.action.GenerateDBAction;
-import org.apache.cayenne.modeler.action.ImportDataMapAction;
-import org.apache.cayenne.modeler.action.ImportEOModelAction;
-import org.apache.cayenne.modeler.action.InferRelationshipsAction;
-import org.apache.cayenne.modeler.action.MigrateAction;
-import org.apache.cayenne.modeler.action.NavigateBackwardAction;
-import org.apache.cayenne.modeler.action.NavigateForwardAction;
-import org.apache.cayenne.modeler.action.NewProjectAction;
-import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.ProjectAction;
-import org.apache.cayenne.modeler.action.RedoAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
-import org.apache.cayenne.modeler.action.RevertAction;
-import org.apache.cayenne.modeler.action.SaveAction;
-import org.apache.cayenne.modeler.action.SaveAsAction;
-import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
-import org.apache.cayenne.modeler.action.UndoAction;
-import org.apache.cayenne.modeler.action.ValidateAction;
+import org.apache.cayenne.modeler.action.*;
 import org.apache.cayenne.modeler.action.dbimport.ReverseEngineeringToolMenuAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.dialog.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.editor.EditorView;
-import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
-import org.apache.cayenne.modeler.event.DataMapDisplayListener;
-import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
-import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
-import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
-import org.apache.cayenne.modeler.event.EntityDisplayEvent;
-import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
-import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
-import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
-import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
-import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
-import org.apache.cayenne.modeler.event.QueryDisplayEvent;
-import org.apache.cayenne.modeler.event.QueryDisplayListener;
-import org.apache.cayenne.modeler.event.RecentFileListListener;
+import org.apache.cayenne.modeler.event.*;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.RecentFileMenu;
@@ -84,28 +32,8 @@ import org.apache.cayenne.swing.components.MainToolBar;
 import org.apache.cayenne.swing.components.TopBorder;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JPanel;
-import javax.swing.JSplitPane;
-import javax.swing.JTextField;
-import javax.swing.JToolBar;
-import java.awt.AWTEvent;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Font;
-import java.awt.Toolkit;
+import javax.swing.*;
+import java.awt.*;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;
@@ -236,7 +164,6 @@ public class CayenneModelerFrame extends JFrame implements DataNodeDisplayListen
         toolMenu.add(getAction(InferRelationshipsAction.class).buildMenu());
         toolMenu.add(getAction(ImportEOModelAction.class).buildMenu());
         toolMenu.addSeparator();
-        toolMenu.add(getAction(CgenAction.class).buildMenu());
         toolMenu.add(getAction(GenerateCodeAction.class).buildMenu());
         toolMenu.add(getAction(GenerateDBAction.class).buildMenu());
         toolMenu.add(getAction(MigrateAction.class).buildMenu());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
deleted file mode 100644
index 9dbd71d..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.cayenne.modeler.action;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.codegen.cgen.CgenGlobalController;
-import org.apache.cayenne.modeler.util.CayenneAction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.awt.event.ActionEvent;
-
-public class CgenAction extends CayenneAction{
-
-    private static Logger logObj = LoggerFactory.getLogger(CgenAction.class);
-
-    public CgenAction(Application application) {
-        super(getActionName(), application);
-    }
-
-    public static String getActionName(){
-        return "Generate All Classes";
-    }
-
-    @Override
-    public void performAction(ActionEvent e) {
-        new CgenGlobalController(getApplication().getFrameController()).startup();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
index d2ad35f..c476fff 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
@@ -167,8 +167,6 @@ public class DefaultActionManager implements ActionManager {
 
         registerAction(new LinkDataMapAction(application));
         registerAction(new LinkDataMapsAction(application));
-
-        registerAction(new CgenAction((application)));
     }
 
     private void initActions() {
@@ -197,8 +195,7 @@ public class DefaultActionManager implements ActionManager {
                 GenerateCodeAction.class.getName(),
                 GenerateDBAction.class.getName(),
                 PasteAction.class.getName(),
-                ReverseEngineeringToolMenuAction.class.getName(),
-                CgenAction.class.getName()));
+                ReverseEngineeringToolMenuAction.class.getName()));
 
         DATA_NODE_ACTIONS = new HashSet<>(DOMAIN_ACTIONS);
         DATA_NODE_ACTIONS.addAll(Arrays.asList(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
index 3e61094..b9d1c5b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
@@ -26,13 +26,6 @@ import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.*;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JTable;
@@ -95,7 +88,7 @@ public class ClassesTabController extends CayenneController {
         builder.bindToAction(view.getCheckAll(), "checkAllAction()");
 
         TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-        
+
         tableBuilder.addColumn(
                 "",
                 "parent.setCurrentClass(#item), selected",
@@ -104,7 +97,7 @@ public class ClassesTabController extends CayenneController {
                 Boolean.TRUE);
 
         tableBuilder.addColumn(
-                "Entity",
+                "Class",
                 "parent.getItemName(#item)",
                 JLabel.class,
                 false,
@@ -207,4 +200,4 @@ public class ClassesTabController extends CayenneController {
         }
         return true;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
index 3c6e53d..b1d3bd9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
@@ -22,12 +22,13 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.map.DataMap;
 
 import javax.swing.BoxLayout;
-import javax.swing.*;
-import javax.swing.border.EmptyBorder;
-import java.awt.*;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.UIManager;
 import javax.swing.border.EmptyBorder;
 import java.awt.BorderLayout;
 import java.awt.Component;
@@ -137,4 +138,4 @@ public class ClassesTabPanel extends JPanel {
     public JCheckBox getCheckAll() {
         return checkAll;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
index 4d5335f..9e3897e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
@@ -78,4 +78,4 @@ public class ClientModeController extends StandardModeController {
     protected ClassGenerationAction newGenerator() {
         return new ClientClassGenerationAction();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
index f4395e9..55817a6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
@@ -113,7 +113,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         }
 
         label = label.concat("; ");
-        
+
         int sizeEmb = getSelectedEmbeddablesSize();
 
         if (sizeEmb == 0) {
@@ -166,4 +166,4 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
 
         view.dispose();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
index 6e6084c..91d87e4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
@@ -27,10 +27,14 @@ import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.*;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.function.Predicate;
 
 /**
@@ -212,7 +216,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         for (Object classObj : classes) {
             if (classObj instanceof Embeddable
                     && selectedEmbeddables.contains(((Embeddable) classObj)
-                            .getClassName())) {
+                    .getClassName())) {
                 selected.add((Embeddable) classObj);
             }
         }
@@ -262,14 +266,14 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     public String getProblem(Object obj) {
 
         String name = null;
-        
+
         if (obj instanceof ObjEntity) {
             name = ((ObjEntity) obj).getName();
         }
         else if (obj instanceof Embeddable) {
             name = ((Embeddable) obj).getClassName();
         }
-        
+
         if (validation == null) {
             return null;
         }
@@ -373,4 +377,4 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         return labelIcon;
     }
 
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
index c6d6e69..2bb635f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
@@ -22,8 +22,19 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.ScrollPaneConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 
 /**
  */
@@ -85,4 +96,4 @@ public class CodeGeneratorDialog extends JDialog {
     public JLabel getClassesCount() {
         return classesCount;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
index 4f48854..bb87006 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
@@ -28,13 +28,22 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.util.Util;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.*;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import java.awt.Component;
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeMap;
 
-import static org.apache.cayenne.modeler.CodeTemplateManager.*;
+import static org.apache.cayenne.modeler.CodeTemplateManager.SINGLE_SERVER_CLASS;
+import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUBCLASS;
+import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUPERCLASS;
 import static org.apache.cayenne.modeler.dialog.pref.PreferenceDialog.TEMPLATES_KEY;
 
 /**
@@ -223,4 +232,4 @@ public class CustomModeController extends GeneratorController {
 		getApplication().getInjector().injectMembers(action);
 		return action;
 	}
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
index 73f89f7..406e1d2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
@@ -29,8 +29,6 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 import java.awt.BorderLayout;
 import java.awt.FlowLayout;
-import javax.swing.*;
-import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
@@ -58,11 +56,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
-        pairs.addChangeListener(e -> {
-            superclassTemplate.setEnabled(pairs.isSelected());
-            overwrite.setEnabled(!pairs.isSelected());
-        });
-
         // assemble
         FormLayout layout = new FormLayout(
                 "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
@@ -141,4 +134,4 @@ public class CustomModePanel extends GeneratorControllerPanel {
     public JCheckBox getCreatePKProperties() {
         return createPKProperties;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
index c695684..db8c872 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
@@ -22,7 +22,13 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
@@ -36,15 +42,22 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.JTextField;
 import java.io.File;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 
 /**
  * A mode-specific part of the code generation dialog.
- * 
+ *
  */
 public abstract class GeneratorController extends CayenneController {
 
@@ -149,7 +162,6 @@ public abstract class GeneratorController extends CayenneController {
         selectedEntities.removeIf(ObjEntity::isGeneric);
 
         Collection<ClassGenerationAction> generators = new ArrayList<>();
-        Collection<StandardPanelComponent> dataMapLines = ((GeneratorControllerPanel) getView()).getDataMapLines();
         for (DataMap map : getParentController().getDataMaps()) {
             try {
                 ClassGenerationAction generator = newGenerator();
@@ -180,7 +192,7 @@ public abstract class GeneratorController extends CayenneController {
 
                 }
 
-                generator.setDestDir(outputDir);
+//                generator.setDestDir(outputDir);
                 generator.setMakePairs(true);
                 generator.setForce(true);
 
@@ -547,4 +559,4 @@ public abstract class GeneratorController extends CayenneController {
         }
         return path.toString();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
index bb02345..49cbc4b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
@@ -27,7 +27,7 @@ import java.util.Collection;
 
 /**
  * A generic panel that is a superclass of generator panels, defining common fields.
- * 
+ *
  */
 public class GeneratorControllerPanel extends JPanel {
 
@@ -52,4 +52,4 @@ public class GeneratorControllerPanel extends JPanel {
     public Collection<StandardPanelComponent> getDataMapLines() {
         return dataMapLines;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
index 4e681ae..5d7594f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.pref.PreferenceDetail;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
 
-import java.awt.*;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.util.Collection;
 import java.util.HashMap;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
index 130741d..854e2d6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
@@ -62,4 +62,4 @@ public class GeneratorTabPanel extends JPanel {
     public JComboBox getGenerationMode() {
         return generationMode;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
index f11ade8..b0650d8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
-import java.awt.*;
+import java.awt.Component;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.TreeMap;
@@ -38,7 +38,7 @@ public class StandardModeController extends GeneratorController {
     }
 
     protected void createDefaults() {
-        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<DataMap, DataMapDefaults>();
+        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<>();
         ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
 
         for (DataMap dataMap : dataMaps) {
@@ -79,4 +79,4 @@ public class StandardModeController extends GeneratorController {
     public Collection<ClassGenerationAction> createGenerator() {
         return super.createGenerator();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
index 1f10ffb..cbb3f35 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 
-import java.awt.*;
+import java.awt.BorderLayout;
 
 public class StandardModePanel extends GeneratorControllerPanel {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
index b4794f3..425a0f2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
@@ -78,4 +78,4 @@ public class StandardPanelComponent extends JComponent {
         return superclassPackage;
     }
 
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
deleted file mode 100644
index b81cc73..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
+++ /dev/null
@@ -1,74 +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.modeler.dialog.codegen.cgen;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.swing.components.TopBorder;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.ScrollPaneConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-
-/**
- * @since 4.1
- */
-public class CgenDialog extends JDialog {
-
-    protected JPanel panel;
-    protected JButton cancelButton;
-
-    CgenDialog(Component generatorPanel) {
-        super(Application.getFrame());
-
-        this.panel = new JPanel();
-        this.panel.setFocusable(false);
-
-        this.cancelButton = new JButton("Cancel");
-        JScrollPane scrollPane = new JScrollPane(
-                generatorPanel,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        scrollPane.setPreferredSize(new Dimension(900, 550));
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.setBorder(TopBorder.create());
-        buttons.add(Box.createHorizontalStrut(50));
-        buttons.add(cancelButton);
-
-        panel.add(scrollPane);
-
-        Container contentPane = getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(panel, BorderLayout.CENTER);
-        contentPane.add(buttons, BorderLayout.SOUTH);
-
-        setTitle("Cgen Global Config");
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-}