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

[08/32] cayenne git commit: Add loading cgen config loading from datamap to maven, ant and gradle plugins

Add loading cgen config loading from datamap to maven, ant and gradle plugins


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

Branch: refs/heads/master
Commit: d9db6e3123eae9e2863058c88d455837a244821c
Parents: b10cd80
Author: Arseni Bulatski <an...@gmail.com>
Authored: Thu Jun 28 15:00:26 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:44:24 2018 +0300

----------------------------------------------------------------------
 .../cayenne/tools/CayenneGeneratorTask.java     | 73 ++++++++-------
 .../java/org/apache/cayenne/gen/CgenModule.java | 21 +++++
 .../cayenne/gen/ClassGenerationAction.java      | 55 ++++++-----
 .../java/org/apache/cayenne/tools/CgenTask.java | 99 +++++++++++++-------
 .../org/apache/cayenne/tools/CgenTaskTest.java  |  9 +-
 .../cayenne/tools/CayenneGeneratorMojo.java     | 44 +++++----
 .../cayenne/modeler/CayenneModelerFrame.java    | 80 +++++++++++++++-
 .../cayenne/modeler/action/CgenAction.java      | 24 -----
 .../modeler/dialog/codegen/cgen/CgenDialog.java | 36 ++++++-
 .../codegen/cgen/CgenGlobalController.java      | 25 ++++-
 .../dialog/codegen/cgen/CgenGlobalPanel.java    | 77 +++++++++------
 .../codegen/cgen/CgenGlobalPanelController.java | 43 ++++++---
 .../modeler/editor/DataMapTabbedView.java       |  3 +-
 .../editor/cgen/ClassesTabController.java       |  4 +-
 .../modeler/editor/cgen/ClassesTabPanel.java    | 19 +++-
 .../editor/cgen/CodeGeneratorController.java    |  4 +-
 .../modeler/editor/cgen/CodeGeneratorPane.java  | 13 ++-
 .../editor/cgen/CustomModeController.java       | 16 ++--
 .../modeler/editor/cgen/CustomModePanel.java    | 79 ++++++++--------
 .../editor/cgen/GeneratorController.java        | 15 ++-
 .../editor/cgen/GeneratorControllerPanel.java   |  4 +-
 .../editor/cgen/GeneratorTabController.java     |  2 +-
 .../modeler/editor/cgen/GeneratorTabPanel.java  |  5 +-
 .../cayenne/modeler/util/ComboBoxAdapter.java   | 14 +--
 24 files changed, 511 insertions(+), 253 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
index 3d600b1..a82931e 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
@@ -19,11 +19,12 @@
 package org.apache.cayenne.tools;
 
 import foundrylogic.vpp.VPPConfig;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.gen.ArtifactsGenerationMode;
+import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
@@ -50,10 +51,10 @@ public class CayenneGeneratorTask extends CayenneTask {
     protected boolean client;
     protected File destDir;
     protected String encoding;
-    protected boolean makepairs;
+    protected Boolean makepairs;
     protected String mode;
     protected String outputPattern;
-    protected boolean overwrite;
+    protected Boolean overwrite;
     protected String superpkg;
     protected String supertemplate;
     protected String template;
@@ -61,8 +62,10 @@ public class CayenneGeneratorTask extends CayenneTask {
     protected String embeddablesupertemplate;
     protected String querytemplate;
     protected String querysupertemplate;
-    protected boolean usepkgpath;
-    protected boolean createpropertynames;
+    protected Boolean usepkgpath;
+    protected Boolean createpropertynames;
+
+    private transient Injector injector;
 
     /**
      * Create PK attributes as Properties
@@ -72,10 +75,6 @@ public class CayenneGeneratorTask extends CayenneTask {
     protected boolean createpkproperties;
 
     public CayenneGeneratorTask() {
-        this.makepairs = true;
-        this.mode = ArtifactsGenerationMode.ENTITY.getLabel();
-        this.outputPattern = "*.java";
-        this.usepkgpath = true;
     }
 
     protected VelocityContext getVppContext() {
@@ -83,27 +82,33 @@ public class CayenneGeneratorTask extends CayenneTask {
         return vppConfig.getVelocityContext();
     }
 
-    protected ClassGenerationAction createGeneratorAction() {
-        ClassGenerationAction action = client ? new ClientClassGenerationAction() : new ClassGenerationAction();
+    protected ClassGenerationAction createGeneratorAction(DataMap dataMap) {
+        ClassGenerationAction action = injector.getInstance(DataChannelMetaData.class).get(dataMap, ClassGenerationAction.class);
+
+        if (client) {
+            action = new ClientClassGenerationAction();
+        } else {
+            if(action == null) {
+                action = new ClassGenerationAction();
+            }
+        }
 
         action.setContext(getVppContext());
         action.setDestDir(destDir);
-        action.setEncoding(encoding);
-        action.setMakePairs(makepairs);
-        action.setArtifactsGenerationMode(mode);
-        action.setOutputPattern(outputPattern);
-        action.setOverwrite(overwrite);
-        action.setSuperPkg(superpkg);
-        action.setSuperTemplate(supertemplate);
-        action.setTemplate(template);
-        action.setEmbeddableSuperTemplate(embeddablesupertemplate);
-        action.setEmbeddableTemplate(embeddabletemplate);
-        action.setQueryTemplate(querytemplate);
-        action.setQuerySuperTemplate(querysupertemplate);
-        action.setUsePkgPath(usepkgpath);
-        action.setCreatePropertyNames(createpropertynames);
-        action.setCreatePKProperties(createpkproperties);
-
+        action.setEncoding(encoding != null ? encoding : action.getEncoding());
+        action.setMakePairs(makepairs != null ? makepairs : action.isMakePairs());
+        action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
+        action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
+        action.setOverwrite(overwrite != null ? overwrite : action.isOverwrite());
+        action.setSuperPkg(superpkg != null ? superpkg : action.getSuperPkg());
+        action.setSuperTemplate(supertemplate != null ? supertemplate : action.getSuperclassTemplate());
+        action.setTemplate(template != null ? template : action.getTemplate());
+        action.setEmbeddableSuperTemplate(embeddablesupertemplate != null ? embeddablesupertemplate : action.getEmbeddableSuperTemplate());
+        action.setEmbeddableTemplate(embeddabletemplate != null ? embeddabletemplate : action.getEmbeddableTemplate());
+        action.setUsePkgPath(usepkgpath != null ? usepkgpath : action.isUsePkgPath());
+        action.setCreatePropertyNames(createpropertynames != null ? createpropertynames : action.isCreatePropertyNames());
+        action.setQueryTemplate(querytemplate != null ? querytemplate : action.getQueryTemplate());
+        action.setQuerySuperTemplate(querysupertemplate != null ? querysupertemplate : action.getQuerySuperTemplate());
         return action;
     }
 
@@ -114,7 +119,7 @@ public class CayenneGeneratorTask extends CayenneTask {
     public void execute() throws BuildException {
         validateAttributes();
 
-        Injector injector = DIBootstrap.createInjector(new ToolsModule(LoggerFactory.getLogger(CayenneGeneratorTask.class)));
+        injector = DIBootstrap.createInjector(new CgenModule(), new ToolsModule(LoggerFactory.getLogger(CayenneGeneratorTask.class)));
 
         AntLogger logger = new AntLogger(this);
         CayenneGeneratorMapLoaderAction loadAction = new CayenneGeneratorMapLoaderAction(injector);
@@ -130,13 +135,17 @@ public class CayenneGeneratorTask extends CayenneTask {
 
             DataMap dataMap = loadAction.getMainDataMap();
 
-            ClassGenerationAction generatorAction = createGeneratorAction();
+            ClassGenerationAction generatorAction = createGeneratorAction(dataMap);
             generatorAction.setLogger(logger);
             generatorAction.setTimestamp(map.lastModified());
             generatorAction.setDataMap(dataMap);
-            generatorAction.addEntities(filterAction.getFilteredEntities(dataMap));
-            generatorAction.addEmbeddables(filterAction.getFilteredEmbeddables(dataMap));
-            generatorAction.addQueries(dataMap.getQueryDescriptors());
+            if(!generatorAction.getEntities().isEmpty() || !generatorAction.getEmbeddables().isEmpty()){
+                generatorAction.prepareArtifacts();
+            } else {
+                generatorAction.addEntities(filterAction.getFilteredEntities(dataMap));
+                generatorAction.addEmbeddables(filterAction.getFilteredEmbeddables(dataMap));
+                generatorAction.addQueries(dataMap.getQueryDescriptors());
+            }
             generatorAction.execute();
         }
         catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
index 79e411e..44b6cd7 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   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;
 
 import org.apache.cayenne.di.Binder;
@@ -5,6 +23,9 @@ import org.apache.cayenne.di.Module;
 import org.apache.cayenne.gen.xml.CgenExtension;
 import org.apache.cayenne.project.ProjectModule;
 
+/**
+ * @since 4.1
+ */
 public class CgenModule implements Module{
     @Override
     public void configure(Binder binder) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/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 afd58e0..f74ca21 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,8 +33,16 @@ import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.slf4j.Logger;
 
-import java.io.*;
-import java.util.*;
+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;
 
 public class ClassGenerationAction implements Serializable, XMLSerializable {
 	static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
@@ -56,8 +64,8 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 
 	protected Collection<Artifact> artifacts;
 
-	protected Collection<String> entityArtifacts;
-	protected Collection<String> embeddableArtifacts;
+	private Collection<String> entityArtifacts;
+	private Collection<String> embeddableArtifacts;
 
 	protected String superPkg;
 	protected DataMap dataMap;
@@ -103,16 +111,12 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
         this.artifacts = new ArrayList<>();
         this.entityArtifacts = new ArrayList<>();
         this.embeddableArtifacts = new ArrayList<>();
+        this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+
+        this.overwrite = false;
 	}
 
 	public void setDefaults() {
-        this.outputPattern = "*.java";
-        this.timestamp = 0L;
-        this.usePkgPath = true;
-        this.makePairs = true;
-        this.context = new VelocityContext();
-        this.templateCache = new HashMap<>(5);
-
         this.template = SUBCLASS_TEMPLATE;
         this.superTemplate = SUPERCLASS_TEMPLATE;
 
@@ -121,8 +125,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 
         this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
         this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
-
-        this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
     }
 
 	protected String defaultTemplateName(TemplateType type) {
@@ -150,7 +152,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		}
 	}
 
-	protected String customTemplateName(TemplateType type) {
+	private String customTemplateName(TemplateType type) {
 		switch (type) {
 		case ENTITY_SINGLE_CLASS:
 			return template;
@@ -575,7 +577,10 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 			// TODO: andrus 10.12.2010 - why not also check for empty query list??
 			// Or create a better API for enabling DataMapArtifact
 			if (queries != null) {
-				artifacts.add(new DataMapArtifact(dataMap, queries));
+				Artifact artifact = new DataMapArtifact(dataMap, queries);
+				if(!artifacts.contains(artifact)) {
+					artifacts.add(new DataMapArtifact(dataMap, queries));
+				}
 			}
 		}
 	}
@@ -583,16 +588,24 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
     private void addAllEntities() {
 		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
 				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-            entityArtifacts.forEach(val ->
-                artifacts.add(new EntityArtifact(dataMap.getObjEntity(val))));
+            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 ->
-                    artifacts.add(new EmbeddableArtifact(dataMap.getEmbeddable(val))));
+		    embeddableArtifacts.forEach(val -> {
+		    	Artifact artifact = new EmbeddableArtifact(dataMap.getEmbeddable(val));
+				if(!artifacts.contains(artifact)) {
+		    		artifacts.add(artifact);
+		    	}
+			});
 		}
 	}
 
@@ -711,7 +724,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public String getDir(){
-		return destDir.getAbsolutePath();
+		return destDir != null ? destDir.getAbsolutePath() : null;
 	}
 
 	public File getDestDir() { return destDir; }
@@ -779,7 +792,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 				.attribute("xmlns", CgenExtension.NAMESPACE)
 				.nested(this.getEntityArtifacts(), delegate)
 				.nested(this.getEmbeddableArtifacts(), delegate)
-				.simpleTag("outputDirectory", this.destDir.getAbsolutePath())
+				.simpleTag("outputDirectory", this.destDir != null ? this.destDir.getAbsolutePath() : null)
 				.simpleTag("generationMode", this.artifactsGenerationMode.getLabel())
                 .simpleTag("dataMapTemplate", this.queryTemplate)
                 .simpleTag("dataMapSuperclassTemplate", this.querySuperTemplate)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index eae85b8..384d366 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -22,11 +22,14 @@ package org.apache.cayenne.tools;
 import java.io.File;
 import java.util.Set;
 
+import com.sun.org.apache.xpath.internal.operations.Bool;
 import groovy.lang.Reference;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
@@ -70,16 +73,20 @@ public class CgenTask extends BaseCayenneTask {
     private String includeEntities;
 
     @Input
-    private boolean makePairs = true;
+    @Optional
+    private String makePairs;
 
     @Input
-    private String mode = "entity";
+    @Optional
+    private String mode;
 
     @Input
-    private String outputPattern = "*.java";
+    @Optional
+    private String outputPattern;
 
     @Input
-    private boolean overwrite;
+    @Optional
+    private String overwrite;
 
     @Input
     @Optional
@@ -102,10 +109,12 @@ public class CgenTask extends BaseCayenneTask {
     private String embeddableTemplate;
 
     @Input
-    private boolean usePkgPath = true;
+    @Optional
+    private String usePkgPath;
 
     @Input
-    private boolean createPropertyNames;
+    @Optional
+    private String createPropertyNames;
 
     /**
      * Force run (skip check for files modification time)
@@ -114,6 +123,14 @@ public class CgenTask extends BaseCayenneTask {
     @Input
     private boolean force;
 
+    @Input
+    @Optional
+    private String queryTemplate;
+
+    @Input
+    @Optional
+    private String querySuperTemplate;
+
     /**
      * If set to <code>true</code>, will generate PK attributes as Properties.
      * Default is <code>false</code>.
@@ -123,11 +140,14 @@ public class CgenTask extends BaseCayenneTask {
 
     private String destDirName;
 
+    private DataChannelMetaData metaData;
+
     @TaskAction
     public void generate() {
         File dataMapFile = getDataMapFile();
 
-        Injector injector = DIBootstrap.createInjector(new ToolsModule(LoggerFactory.getLogger(CgenTask.class)));
+        final Injector injector = DIBootstrap.createInjector(new CgenModule(), new ToolsModule(LoggerFactory.getLogger(CgenTask.class)));
+        metaData = injector.getInstance(DataChannelMetaData.class);
 
         CayenneGeneratorMapLoaderAction loaderAction = new CayenneGeneratorMapLoaderAction(injector);
         loaderAction.setMainDataMapFile(dataMapFile);
@@ -139,8 +159,8 @@ public class CgenTask extends BaseCayenneTask {
         try {
             loaderAction.setAdditionalDataMapFiles(convertAdditionalDataMaps());
 
-            ClassGenerationAction generator = this.createGenerator();
             DataMap dataMap = loaderAction.getMainDataMap();
+            ClassGenerationAction generator = this.createGenerator(dataMap);
 
             generator.setLogger(getLogger());
 
@@ -149,9 +169,13 @@ public class CgenTask extends BaseCayenneTask {
             }
             generator.setTimestamp(dataMapFile.lastModified());
             generator.setDataMap(dataMap);
-            generator.addEntities(filterAction.getFilteredEntities(dataMap));
-            generator.addEmbeddables(dataMap.getEmbeddables());
-            generator.addQueries(dataMap.getQueryDescriptors());
+            if(generator.getEntities().isEmpty() && generator.getEmbeddables().isEmpty()) {
+                generator.addEntities(filterAction.getFilteredEntities(dataMap));
+                generator.addEmbeddables(dataMap.getEmbeddables());
+                generator.addQueries(dataMap.getQueryDescriptors());
+            } else {
+                generator.prepareArtifacts();
+            }
             generator.execute();
         } catch (Exception exception) {
             throw new GradleException("Error generating classes: ", exception);
@@ -176,27 +200,32 @@ public class CgenTask extends BaseCayenneTask {
         return client ? new ClientClassGenerationAction() : new ClassGenerationAction();
     }
 
-    ClassGenerationAction createGenerator() {
-        ClassGenerationAction action = newGeneratorInstance();
+    ClassGenerationAction createGenerator(DataMap dataMap) {
+        ClassGenerationAction action = this.newGeneratorInstance();
 
-        action.setDestDir(getDestDirFile());
-        action.setEncoding(encoding);
-        action.setMakePairs(makePairs);
-        action.setArtifactsGenerationMode(mode);
-        action.setOutputPattern(outputPattern);
-        action.setOverwrite(overwrite);
-        action.setSuperPkg(superPkg);
-        action.setSuperTemplate(superTemplate);
-        action.setTemplate(template);
-        action.setEmbeddableSuperTemplate(embeddableSuperTemplate);
-        action.setEmbeddableTemplate(embeddableTemplate);
-        action.setUsePkgPath(usePkgPath);
-        action.setCreatePropertyNames(createPropertyNames);
-        action.setCreatePKProperties(createPKProperties);
+        if(metaData != null && metaData.get(dataMap, ClassGenerationAction.class) != null){
+            action = metaData.get(dataMap, ClassGenerationAction.class);
+        }
 
+        action.setDestDir(getDestDirFile());
+        action.setEncoding(encoding != null ? encoding : action.getEncoding());
+        action.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : action.isMakePairs());
+        action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
+        action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
+        action.setOverwrite(overwrite != null ? Boolean.valueOf(overwrite) : action.isOverwrite());
+        action.setSuperPkg(superPkg != null ? superPkg : action.getSuperPkg());
+        action.setSuperTemplate(superTemplate != null ? superTemplate : action.getSuperclassTemplate());
+        action.setTemplate(template != null ? template : action.getTemplate());
+        action.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : action.getEmbeddableSuperTemplate());
+        action.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : action.getEmbeddableTemplate());
+        action.setUsePkgPath(usePkgPath != null ? Boolean.valueOf(usePkgPath) : action.isUsePkgPath());
+        action.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : action.isCreatePropertyNames());
+        action.setQueryTemplate(queryTemplate != null ? queryTemplate : action.getQueryTemplate());
+        action.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : action.getQuerySuperTemplate());
         return action;
     }
 
+
     @OutputDirectory
     protected File getDestDirFile() {
         final Reference<File> javaSourceDir = new Reference<>(null);
@@ -330,11 +359,11 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     public boolean isMakePairs() {
-        return makePairs;
+        return Boolean.valueOf(makePairs);
     }
 
     public void setMakePairs(boolean makePairs) {
-        this.makePairs = makePairs;
+        this.makePairs = String.valueOf(makePairs);
     }
 
     public void makePairs(boolean makePairs) {
@@ -366,11 +395,11 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     public boolean isOverwrite() {
-        return overwrite;
+        return Boolean.valueOf(overwrite);
     }
 
     public void setOverwrite(boolean overwrite) {
-        this.overwrite = overwrite;
+        this.overwrite = String.valueOf(overwrite);
     }
 
     public void overwrite(boolean overwrite) {
@@ -438,11 +467,11 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     public boolean isUsePkgPath() {
-        return usePkgPath;
+        return Boolean.valueOf(usePkgPath);
     }
 
     public void setUsePkgPath(boolean usePkgPath) {
-        this.usePkgPath = usePkgPath;
+        this.usePkgPath = String.valueOf(usePkgPath);
     }
 
     public void usePkgPath(boolean usePkgPath) {
@@ -450,11 +479,11 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     public boolean isCreatePropertyNames() {
-        return createPropertyNames;
+        return Boolean.valueOf(createPropertyNames);
     }
 
     public void setCreatePropertyNames(boolean createPropertyNames) {
-        this.createPropertyNames = createPropertyNames;
+        this.createPropertyNames = String.valueOf(createPropertyNames);
     }
 
     public void createPropertyNames(boolean createPropertyNames) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
index 8259d21..478ac5c 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
@@ -20,13 +20,14 @@
 package org.apache.cayenne.tools;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 import java.io.File;
 
-import static org.junit.Assert.*;
+import static junit.framework.TestCase.assertSame;
 import static org.mockito.Mockito.*;
 
 /**
@@ -37,6 +38,8 @@ public class CgenTaskTest {
     @Rule
     public TemporaryFolder temp = new TemporaryFolder();
 
+    DataMap dataMap = new DataMap();
+
     private CgenTask createCgenTaskMock(ClassGenerationAction action) {
         CgenTask mock = mock(CgenTask.class);
 
@@ -57,7 +60,7 @@ public class CgenTaskTest {
         doCallRealMethod().when(mock).setUsePkgPath(anyBoolean());
         doCallRealMethod().when(mock).setTemplate(anyString());
         when(mock.newGeneratorInstance()).thenReturn(action);
-        when(mock.createGenerator()).thenCallRealMethod();
+        when(mock.createGenerator(dataMap)).thenCallRealMethod();
 
         return mock;
     }
@@ -82,7 +85,7 @@ public class CgenTaskTest {
         task.setOverwrite(true);
         task.setUsePkgPath(true);
 
-        ClassGenerationAction createdAction = task.createGenerator();
+        ClassGenerationAction createdAction = task.createGenerator(dataMap);
         assertSame(action, createdAction);
 
         verify(action).setCreatePropertyNames(true);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/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 42a2e8d..e57d306 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
@@ -99,7 +99,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * <code>true</code>).
 	 */
 	@Parameter
-	private String makePairs;
+	private Boolean makePairs;
 
 	/**
 	 * DataMap XML file to use as a base for class generation.
@@ -113,7 +113,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * iteration per datamap (This is always one iteration since cgen currently
 	 * supports specifying one-and-only-one datamap). (Default is &quot;entity&quot;)
 	 */
-	@Parameter(defaultValue = "entity")
+	@Parameter
 	private String mode;
 
 	/**
@@ -127,7 +127,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * classes. Ignored unless makepairs is set to <code>false</code>.
 	 */
 	@Parameter
-	private String overwrite;
+	private Boolean overwrite;
 
 	/**
 	 * Java package name of generated superclasses. Ignored unless
@@ -177,14 +177,14 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * ignoring their package.
 	 */
 	@Parameter
-	private String usePkgPath;
+	private Boolean usePkgPath;
 
     /**
      * If set to <code>true</code>, will generate String Property names.
      * Default is <code>false</code>.
      */
     @Parameter
-    private String createPropertyNames;
+    private Boolean createPropertyNames;
 
 	/**
 	 * If set to <code>true</code>, will skip file modification time validation and regenerate all.
@@ -195,15 +195,21 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	@Parameter(defaultValue = "false", property = "force")
 	private boolean force;
 
-	/**
-	 * If set to <code>true</code>, will generate PK attributes as Properties.
-	 * Default is <code>false</code>.
-	 * @since 4.1
-	 */
-	@Parameter(defaultValue = "false")
-	private boolean createPKProperties;
+	@Parameter
+	private String queryTemplate;
+
+	@Parameter
+	private String querySuperTemplate;
+
+    /**
+     * If set to <code>true</code>, will generate PK attributes as Properties.
+     * Default is <code>false</code>.
+     * @since 4.1
+     */
+    @Parameter(defaultValue = "false")
+    private boolean createPKProperties;
 
-	private transient Injector injector;
+    private transient Injector injector;
 
     private static final Logger logger = LoggerFactory.getLogger(CayenneGeneratorMojo.class);
 
@@ -289,17 +295,19 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 		action.setDestDir(destDir);
 		action.setEncoding(encoding != null ? encoding : action.getEncoding());
-		action.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : action.isMakePairs());
-		action.setArtifactsGenerationMode(mode);
+		action.setMakePairs(makePairs != null ? makePairs : action.isMakePairs());
+		action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
 		action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
-		action.setOverwrite(overwrite != null ? Boolean.valueOf(overwrite) : action.isOverwrite());
+		action.setOverwrite(overwrite != null ? overwrite : action.isOverwrite());
 		action.setSuperPkg(superPkg != null ? superPkg : action.getSuperPkg());
 		action.setSuperTemplate(superTemplate != null ? superTemplate : action.getSuperclassTemplate());
 		action.setTemplate(template != null ? template : action.getTemplate());
 		action.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : action.getEmbeddableSuperTemplate());
 		action.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : action.getEmbeddableTemplate());
-		action.setUsePkgPath(usePkgPath != null ? Boolean.valueOf(usePkgPath) : action.isUsePkgPath());
-		action.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : action.isCreatePropertyNames());
+		action.setUsePkgPath(usePkgPath != null ? usePkgPath : action.isUsePkgPath());
+		action.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : action.isCreatePropertyNames());
+		action.setQueryTemplate(queryTemplate != null ? queryTemplate : action.getQueryTemplate());
+		action.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : action.getQuerySuperTemplate());
 		return action;
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/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 0b12dcd..97772de 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,12 +19,64 @@
 
 package org.apache.cayenne.modeler;
 
-import org.apache.cayenne.modeler.action.*;
+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.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.*;
+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.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.RecentFileMenu;
@@ -32,8 +84,28 @@ import org.apache.cayenne.swing.components.MainToolBar;
 import org.apache.cayenne.swing.components.TopBorder;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.*;
-import java.awt.*;
+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 java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/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
index b197991..9dbd71d 100644
--- 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
@@ -22,30 +22,6 @@ public class CgenAction extends CayenneAction{
 
     @Override
     public void performAction(ActionEvent e) {
-
         new CgenGlobalController(getApplication().getFrameController()).startup();
-
-//        Collection<DataMap> dataMaps;
-//        DataChannelMetaData metaData = getApplication().getMetaData();
-//
-//        try {
-//            Project project = getProjectController().getProject();
-//            dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
-//            for (DataMap dataMap : dataMaps) {
-//                ClassGenerationAction classGenerationAction = metaData.get(dataMap, ClassGenerationAction.class);
-//                if (classGenerationAction != null) {
-//                    classGenerationAction.prepareArtifacts();
-//                    classGenerationAction.execute();
-//                }
-//            }
-//            JOptionPane.showMessageDialog(
-//                    this.getApplication().getFrameController().getView(),
-//                    "Class generation finished");
-//        } catch (Exception ex) {
-//            logObj.error("Error generating classes", e);
-//            JOptionPane.showMessageDialog(
-//                    this.getApplication().getFrameController().getView(),
-//                    "Error generating classes - " + ex.getMessage());
-//        }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/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
index 9db205b..b81cc73 100644
--- 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
@@ -1,17 +1,47 @@
+/*****************************************************************
+ *   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.*;
-import java.awt.*;
+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;
 
-    public CgenDialog(Component generatorPanel) {
+    CgenDialog(Component generatorPanel) {
         super(Application.getFrame());
 
         this.panel = new JPanel();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
index 4b88697..9242f21 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
@@ -1,15 +1,36 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.modeler.dialog.codegen.cgen;
 
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 
-import java.awt.*;
+import java.awt.Component;
 
+/**
+ * @since 4.1
+ */
 public class CgenGlobalController extends CayenneController{
 
     protected CgenDialog view;
 
-    protected CgenGlobalPanelController globalPanelController;
+    private CgenGlobalPanelController globalPanelController;
 
     public CgenGlobalController(CayenneController parent){
         super(parent);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
index 3c9b68a..c234d70 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
@@ -1,25 +1,50 @@
+/*****************************************************************
+ *   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 com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.ProjectController;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.BorderLayout;
 
+/**
+ * @since 4.1
+ */
 public class CgenGlobalPanel extends JPanel {
 
     private JButton generateButton;
 
     private JTextField outputFolder;
     private JButton selectOutputFolder;
-    private JComboBox generationMode;
-    private JComboBox subclassTemplate;
-    private JComboBox superclassTemplate;
-    private JComboBox embeddableTemplate;
-    private JComboBox embeddableSuperTemplate;
-    private JComboBox dataMapTemplate;
-    private JComboBox dataMapSuperTemplate;
+    private JComboBox<String> generationMode;
+    private JComboBox<String> subclassTemplate;
+    private JComboBox<String> superclassTemplate;
+    private JComboBox<String> embeddableTemplate;
+    private JComboBox<String> embeddableSuperTemplate;
+    private JComboBox<String> dataMapTemplate;
+    private JComboBox<String> dataMapSuperTemplate;
     private JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
@@ -44,21 +69,17 @@ public class CgenGlobalPanel extends JPanel {
     private JButton resetNames;
     private JButton resetPackage;
 
-    private ProjectController projectController;
-
     CgenGlobalPanel(ProjectController projectController) {
-        this.projectController = projectController;
-
         this.generateButton = new JButton("Generate All classes");
         this.outputFolder = new JTextField();
         this.selectOutputFolder = new JButton("Select");
-        this.generationMode = new JComboBox();
-        this.subclassTemplate = new JComboBox();
-        this.superclassTemplate = new JComboBox();
-        this.embeddableTemplate = new JComboBox();
-        this.embeddableSuperTemplate = new JComboBox();
-        this.dataMapTemplate = new JComboBox();
-        this.dataMapSuperTemplate = new JComboBox();
+        this.generationMode = new JComboBox<>();
+        this.subclassTemplate = new JComboBox<>();
+        this.superclassTemplate = new JComboBox<>();
+        this.embeddableTemplate = new JComboBox<>();
+        this.embeddableSuperTemplate = new JComboBox<>();
+        this.dataMapTemplate = new JComboBox<>();
+        this.dataMapSuperTemplate = new JComboBox<>();
         this.pairs = new JCheckBox();
         this.overwrite = new JCheckBox();
         this.usePackagePath = new JCheckBox();
@@ -156,31 +177,29 @@ public class CgenGlobalPanel extends JPanel {
         return selectOutputFolder;
     }
 
-    public JComboBox getGenerationMode() {
-        return generationMode;
-    }
+    public JComboBox<String> getGenerationMode() { return generationMode; }
 
-    public JComboBox getSubclassTemplate() {
+    public JComboBox<String> getSubclassTemplate() {
         return subclassTemplate;
     }
 
-    public JComboBox getSuperclassTemplate() {
+    public JComboBox<String> getSuperclassTemplate() {
         return superclassTemplate;
     }
 
-    public JComboBox getEmbeddableTemplate() {
+    public JComboBox<String> getEmbeddableTemplate() {
         return embeddableTemplate;
     }
 
-    public JComboBox getEmbeddableSuperTemplate() {
+    public JComboBox<String> getEmbeddableSuperTemplate() {
         return embeddableSuperTemplate;
     }
 
-    public JComboBox getDataMapTemplate() {
+    public JComboBox<String> getDataMapTemplate() {
         return dataMapTemplate;
     }
 
-    public JComboBox getDataMapSuperTemplate() {
+    public JComboBox<String> getDataMapSuperTemplate() {
         return dataMapSuperTemplate;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
index b07bdd2..f694b73 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   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.configuration.DataChannelDescriptor;
@@ -21,10 +39,13 @@ import java.io.File;
 import java.util.*;
 import java.util.List;
 
+/**
+ * @since 4.1
+ */
 public class CgenGlobalPanelController extends CayenneController{
 
-    static final String ALL_MODE_LABEL = "Generate all";
-    static final Map<String, String> modesByLabel = new HashMap<>();
+    private static final String ALL_MODE_LABEL = "Generate all";
+    private static final Map<String, String> modesByLabel = new HashMap<>();
     // correspond to non-public constants on MapClassGenerator.
     private static final String MODE_DATAMAP = "datamap";
     private static final String MODE_ENTITY = "entity";
@@ -48,7 +69,7 @@ public class CgenGlobalPanelController extends CayenneController{
 
     private Collection<ClassGenerationAction> generators;
 
-    public CgenGlobalPanelController(CayenneController parent) {
+    CgenGlobalPanelController(CayenneController parent) {
         super(parent);
         this.projectController = Application.getInstance().getFrameController().getProjectController();
 
@@ -61,8 +82,8 @@ public class CgenGlobalPanelController extends CayenneController{
     }
 
     private void updateTemplates() {
-        Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));
+        String[] modeChoices = new String[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
+        view.getGenerationMode().setModel(new DefaultComboBoxModel<>(modeChoices));
 
         CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
@@ -93,14 +114,14 @@ public class CgenGlobalPanelController extends CayenneController{
         Collections.sort(dataMapSuperTemplates);
         dataMapSuperTemplates.addAll(customTemplates);
 
-        this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
-        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
+        this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
+        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
 
-        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel(embeddableTemplates.toArray()));
-        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel(embeddableSuperTemplates.toArray()));
+        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
+        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
 
-        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel(dataMapTemplates.toArray()));
-        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel(dataMapSuperTemplates.toArray()));
+        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
+        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
 
         this.view.getOutputPattern().setText("*.java");
         this.view.getPairs().setSelected(true);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index bd9afc5..770c713 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -23,7 +23,8 @@ import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 
-import javax.swing.*;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
index 704e851..a83ef3d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
@@ -25,8 +25,8 @@ 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 javax.swing.JLabel;
+import java.awt.Component;
 
 public class ClassesTabController extends CayenneController {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
index f6cad0b..7b5776c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
@@ -19,18 +19,27 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.*;
-import java.awt.*;
+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 java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 
 /**
+ * @since 4.1
  */
 public class ClassesTabPanel extends JPanel {
 
     protected JTable table;
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
+    private JCheckBox checkAll;
+    private JLabel checkAllLabel;
 
-    public ClassesTabPanel() {
+    ClassesTabPanel() {
 
         this.table = new JTable();
         this.table.setRowHeight(22);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
index 2ee1034..35aa8d6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JOptionPane;
+import java.awt.Component;
 import java.util.function.Predicate;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
index 334931a..cac063c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
@@ -21,8 +21,17 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Box;
+import javax.swing.JButton;
+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.Dimension;
+import java.awt.FlowLayout;
 
 /**
  */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
index 5666355..029f92e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
@@ -76,8 +76,8 @@ public class CustomModeController extends GeneratorController {
     }
 
     protected void updateTemplates() {
-        Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().getComboBox().setModel(new DefaultComboBoxModel(modeChoices));
+        String[] modeChoices = new String[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
+        view.getGenerationMode().getComboBox().setModel(new DefaultComboBoxModel<>(modeChoices));
 
         CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
@@ -108,14 +108,14 @@ public class CustomModeController extends GeneratorController {
         Collections.sort(dataMapSuperTemplates);
         dataMapSuperTemplates.addAll(customTemplates);
 
-        this.view.getSubclassTemplate().getComboBox().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
-        this.view.getSuperclassTemplate().getComboBox().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
+        this.view.getSubclassTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
+        this.view.getSuperclassTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
 
-        this.view.getEmbeddableTemplate().getComboBox().setModel(new DefaultComboBoxModel(embeddableTemplates.toArray()));
-        this.view.getEmbeddableSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel(embeddableSuperTemplates.toArray()));
+        this.view.getEmbeddableTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
+        this.view.getEmbeddableSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
 
-        this.view.getDataMapTemplate().getComboBox().setModel(new DefaultComboBoxModel(dataMapTemplates.toArray()));
-        this.view.getDataMapSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel(dataMapSuperTemplates.toArray()));
+        this.view.getDataMapTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
+        this.view.getDataMapSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
     }
 
     public Component getView() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
index ca4b50f..9213a86 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
@@ -29,18 +29,23 @@ import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.swing.control.ActionLink;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
-    private ComboBoxAdapter generationMode;
-    private ComboBoxAdapter subclassTemplate;
-    private ComboBoxAdapter superclassTemplate;
-    private ComboBoxAdapter embeddableTemplate;
-    private ComboBoxAdapter embeddableSuperTemplate;
-    private ComboBoxAdapter dataMapTemplate;
-    private ComboBoxAdapter dataMapSuperTemplate;
+    private ComboBoxAdapter<String> generationMode;
+    private ComboBoxAdapter<String> subclassTemplate;
+    private ComboBoxAdapter<String> superclassTemplate;
+    private ComboBoxAdapter<String> embeddableTemplate;
+    private ComboBoxAdapter<String> embeddableSuperTemplate;
+    private ComboBoxAdapter<String> dataMapTemplate;
+    private ComboBoxAdapter<String> dataMapSuperTemplate;
     private JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
@@ -57,46 +62,46 @@ public class CustomModePanel extends GeneratorControllerPanel {
     CustomModePanel(ProjectController projectController) {
         super(projectController);
 
-        JComboBox modeField = new JComboBox();
-        this.generationMode = new ComboBoxAdapter(modeField) {
+        JComboBox<String> modeField = new JComboBox<>();
+        this.generationMode = new ComboBoxAdapter<String>(modeField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setArtifactsGenerationMode(CustomModeController.modesByLabel.get(item));
                 projectController.setDirty(true);
             }
         };
 
-        JComboBox superclassField = new JComboBox();
-        this.superclassTemplate = new ComboBoxAdapter(superclassField) {
+        JComboBox<String> superclassField = new JComboBox<>();
+        this.superclassTemplate = new ComboBoxAdapter<String>(superclassField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
                 projectController.setDirty(true);
             }
         };
 
-        JComboBox subclassField = new JComboBox();
-        this.subclassTemplate = new ComboBoxAdapter(subclassField) {
+        JComboBox<String> subclassField = new JComboBox<>();
+        this.subclassTemplate = new ComboBoxAdapter<String>(subclassField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
                 projectController.setDirty(true);
             }
         };
 
-        JComboBox dataMapField = new JComboBox();
-        this.dataMapTemplate = new ComboBoxAdapter(dataMapField) {
+        JComboBox<String> dataMapField = new JComboBox<>();
+        this.dataMapTemplate = new ComboBoxAdapter<String>(dataMapField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setQueryTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
                 projectController.setDirty(true);
             }
         };
 
-        JComboBox dataMapSuperField = new JComboBox();
-        this.dataMapSuperTemplate = new ComboBoxAdapter(dataMapSuperField) {
+        JComboBox<String> dataMapSuperField = new JComboBox<>();
+        this.dataMapSuperTemplate = new ComboBoxAdapter<String>(dataMapSuperField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setQuerySuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
                 projectController.setDirty(true);
             }
@@ -134,19 +139,19 @@ public class CustomModePanel extends GeneratorControllerPanel {
             }
         };
 
-        JComboBox embeddableField = new JComboBox();
-        this.embeddableTemplate = new ComboBoxAdapter(embeddableField) {
+        JComboBox<String> embeddableField = new JComboBox<>();
+        this.embeddableTemplate = new ComboBoxAdapter<String>(embeddableField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setEmbeddableTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
                 projectController.setDirty(true);
             }
         };
 
-        JComboBox embeddableSuperclassField = new JComboBox();
-        this.embeddableSuperTemplate = new ComboBoxAdapter(embeddableSuperclassField) {
+        JComboBox<String> embeddableSuperclassField = new JComboBox<>();
+        this.embeddableSuperTemplate = new ComboBoxAdapter<String>(embeddableSuperclassField) {
             @Override
-            protected void updateModel(Object item) throws ValidationException {
+            protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setEmbeddableSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
                 projectController.setDirty(true);
             }
@@ -229,7 +234,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         dataMapSuperTemplate.getComboBox().setEnabled(val);
     }
 
-    public ComboBoxAdapter getGenerationMode() {
+    public ComboBoxAdapter<String> getGenerationMode() {
         return generationMode;
     }
 
@@ -237,19 +242,19 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return manageTemplatesLink;
     }
 
-    public ComboBoxAdapter getSubclassTemplate() { return subclassTemplate; }
+    public ComboBoxAdapter<String> getSubclassTemplate() { return subclassTemplate; }
 
-    public ComboBoxAdapter getEmbeddableTemplate() { return embeddableTemplate; }
+    public ComboBoxAdapter<String> getEmbeddableTemplate() { return embeddableTemplate; }
 
-    public ComboBoxAdapter getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
+    public ComboBoxAdapter<String> getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
 
-    public ComboBoxAdapter getSuperclassTemplate() {
+    public ComboBoxAdapter<String> getSuperclassTemplate() {
         return superclassTemplate;
     }
 
-    public ComboBoxAdapter getDataMapTemplate() { return dataMapTemplate; }
+    public ComboBoxAdapter<String> getDataMapTemplate() { return dataMapTemplate; }
 
-    public ComboBoxAdapter getDataMapSuperTemplate() { return dataMapSuperTemplate; }
+    public ComboBoxAdapter<String> getDataMapSuperTemplate() { return dataMapSuperTemplate; }
 
     public JCheckBox getOverwrite() {
         return overwrite;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
index 7e8087f..7a8b5cb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
@@ -22,7 +22,13 @@ package org.apache.cayenne.modeler.editor.cgen;
 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;
@@ -37,9 +43,12 @@ 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 java.io.File;
-import java.util.*;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
index 7536a01..281046d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
@@ -24,7 +24,9 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
 
-import javax.swing.*;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
 import java.io.File;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
index 53000da..2824685 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.pref.PreferenceDetail;
 
-import java.awt.*;
+import java.awt.Component;
 
 /**
  */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
index 4082f36..ab25218 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
@@ -19,8 +19,9 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Component;
 
 /**
  * @since 4.1

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
index 2a7fd79..8d4eaeb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
@@ -21,20 +21,20 @@ package org.apache.cayenne.modeler.util;
 import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.*;
+import javax.swing.JComboBox;
 import java.awt.event.ActionListener;
 
 /**
  * @since 4.1
  */
-public abstract class ComboBoxAdapter {
+public abstract class ComboBoxAdapter<T> {
 
-    private JComboBox comboBox;
+    private JComboBox<T> comboBox;
     private ActionListener listener;
 
     private JComboBoxUndoListener undoListener;
 
-    protected ComboBoxAdapter(JComboBox comboBox) {
+    protected ComboBoxAdapter(JComboBox<T> comboBox) {
         this.comboBox = comboBox;
         listener = e -> updateModel();
 
@@ -57,16 +57,16 @@ public abstract class ComboBoxAdapter {
         }
     }
 
-    public JComboBox getComboBox() {
+    public JComboBox<T> getComboBox() {
         return comboBox;
     }
 
     /**
      * Updates bound model with document text.
      */
-    protected abstract void updateModel(Object item) throws ValidationException;
+    protected abstract void updateModel(T item) throws ValidationException;
 
     public void updateModel() {
-        updateModel(comboBox.getSelectedItem());
+        updateModel((T)comboBox.getSelectedItem());
     }
 }