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 <ancars...@gmail.com>
Authored: Wed Oct 31 10:51:32 2018 +0300
Committer: Arseni Bulatski <ancars...@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;
-    }
-}

Reply via email to