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:34 UTC

[03/32] cayenne git commit: Cgen. Create saver and loader for dataMaps.

Cgen. Create saver and loader for dataMaps.


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

Branch: refs/heads/master
Commit: d489f2a5b45be473ffd7a07a6a18bc971940e1bc
Parents: 8119ffa
Author: Arseni Bulatski <an...@gmail.com>
Authored: Mon Jun 18 15:04:56 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:40:16 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ClassGenerationAction.java      | 178 ++++++++++++++--
 .../org/apache/cayenne/gen/DataMapArtifact.java |   1 +
 .../apache/cayenne/gen/EmbeddableArtifact.java  |  12 +-
 .../org/apache/cayenne/gen/EntityArtifact.java  |  11 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      | 206 +++++++++++++++++-
 .../apache/cayenne/gen/xml/CgenExtension.java   |   5 +-
 .../cayenne/gen/xml/CgenLoaderDelegate.java     |   6 +-
 .../cayenne/gen/xml/CgenSaverDelegate.java      |   6 +-
 .../cayenne/gen/xml/EmbeddableHandler.java      |  49 +++++
 .../cayenne/gen/xml/ObjEntityHandler.java       |  48 +++++
 .../cayenne/modeler/CodeTemplateManager.java    |  19 ++
 .../editor/cgen/ClassesTabController.java       |  22 +-
 .../editor/cgen/CodeGeneratorController.java    |  15 +-
 .../cgen/CodeGeneratorControllerBase.java       |  70 +++++--
 .../editor/cgen/CustomModeController.java       | 209 ++++++++++---------
 .../modeler/editor/cgen/CustomModePanel.java    |  64 ++++--
 .../editor/cgen/GeneratorController.java        | 110 ++++------
 .../editor/cgen/GeneratorControllerPanel.java   |  13 +-
 .../editor/cgen/GeneratorTabController.java     |   3 +-
 .../editor/cgen/StandardPanelComponent.java     |  79 -------
 20 files changed, 782 insertions(+), 344 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 0eaf66b..423fb92 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
@@ -20,26 +20,20 @@
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.gen.xml.CgenExtension;
+import org.apache.cayenne.map.*;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
 import org.apache.velocity.Template;
 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.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-public class ClassGenerationAction {
+import java.io.*;
+import java.util.*;
+
+public class ClassGenerationAction implements Serializable, XMLSerializable {
 	static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
 
 	public static final String SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "singleclass.vm";
@@ -59,6 +53,9 @@ public class ClassGenerationAction {
 
 	protected Collection<Artifact> artifacts;
 
+	protected Collection<String> entityArtifacts;
+	protected Collection<String> embeddableArtifacts;
+
 	protected String superPkg;
 	protected DataMap dataMap;
 
@@ -92,6 +89,7 @@ public class ClassGenerationAction {
 	protected Map<String, Template> templateCache;
 
 	public ClassGenerationAction() {
+//		this.destDir = new File(System.getProperty("user.dir"));
 		this.outputPattern = "*.java";
 		this.timestamp = 0L;
 		this.usePkgPath = true;
@@ -99,7 +97,13 @@ public class ClassGenerationAction {
 		this.context = new VelocityContext();
 		this.templateCache = new HashMap<>(5);
 
+		this.template = SUBCLASS_TEMPLATE;
+		this.superTemplate = SUPERCLASS_TEMPLATE;
+		this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+
 		this.artifacts = new ArrayList<>();
+		this.entityArtifacts = new ArrayList<>();
+		this.embeddableArtifacts = new ArrayList<>();
 	}
 
 	protected String defaultTemplateName(TemplateType type) {
@@ -156,14 +160,14 @@ public class ClassGenerationAction {
 	 * Returns a String used to prefix class name to create a generated
 	 * superclass. Default value is "_".
 	 */
-	protected String getSuperclassPrefix() {
+	private String getSuperclassPrefix() {
 		return ClassGenerationAction.SUPERCLASS_PREFIX;
 	}
 
 	/**
 	 * VelocityContext initialization method called once per artifact.
 	 */
-	protected void resetContextForArtifact(Artifact artifact) {
+	private void resetContextForArtifact(Artifact artifact) {
 		StringUtils stringUtils = StringUtils.getInstance();
 
 		String qualifiedClassName = artifact.getQualifiedClassName();
@@ -201,7 +205,7 @@ public class ClassGenerationAction {
 	 * VelocityContext initialization method called once per each artifact and
 	 * template type combination.
 	 */
-	protected void resetContextForArtifactTemplate(Artifact artifact, TemplateType templateType) {
+	void resetContextForArtifactTemplate(Artifact artifact, TemplateType templateType) {
 		context.put(Artifact.IMPORT_UTILS_KEY, new ImportUtils());
 		artifact.postInitContext(context);
 	}
@@ -248,7 +252,26 @@ public class ClassGenerationAction {
 		}
 	}
 
-	protected Template getTemplate(TemplateType type) {
+	public void prepareArtifacts(){
+		if(!entityArtifacts.isEmpty()) {
+			for(String name : entityArtifacts) {
+				ObjEntity objEntity = dataMap.getObjEntity(name);
+				if(objEntity != null) {
+					artifacts.add(new EntityArtifact(objEntity));
+				}
+			}
+		}
+		if(!embeddableArtifacts.isEmpty()) {
+			for(String name : embeddableArtifacts) {
+				Embeddable embeddable = dataMap.getEmbeddable(name);
+				if(embeddable != null) {
+					artifacts.add(new EmbeddableArtifact(embeddable));
+				}
+			}
+		}
+	}
+
+	private Template getTemplate(TemplateType type) {
 
 		String templateName = customTemplateName(type);
 		if (templateName == null) {
@@ -284,7 +307,7 @@ public class ClassGenerationAction {
 	 * Throws CayenneRuntimeException if it is in an inconsistent state.
 	 * Called internally from "execute".
 	 */
-	protected void validateAttributes() {
+	private void validateAttributes() {
 		if (destDir == null) {
 			throw new CayenneRuntimeException("'destDir' attribute is missing.");
 		}
@@ -391,7 +414,7 @@ public class ClassGenerationAction {
 	 * Returns a target file where a generated superclass must be saved. If null
 	 * is returned, class shouldn't be generated.
 	 */
-	protected File fileForSuperclass() throws Exception {
+	private File fileForSuperclass() throws Exception {
 
 		String packageName = (String) context.get(Artifact.SUPER_PACKAGE_KEY);
 		String className = (String) context.get(Artifact.SUPER_CLASS_KEY);
@@ -410,7 +433,7 @@ public class ClassGenerationAction {
 	 * Returns a target file where a generated class must be saved. If null is
 	 * returned, class shouldn't be generated.
 	 */
-	protected File fileForClass() throws Exception {
+	private File fileForClass() throws Exception {
 
 		String packageName = (String) context.get(Artifact.SUB_PACKAGE_KEY);
 		String className = (String) context.get(Artifact.SUB_CLASS_KEY);
@@ -470,7 +493,7 @@ public class ClassGenerationAction {
 	 * belong to <code>pkgName</code> package should reside. Creates any missing
 	 * diectories below <code>dest</code>.
 	 */
-	protected File mkpath(File dest, String pkgName) throws Exception {
+	private File mkpath(File dest, String pkgName) throws Exception {
 
 		if (!usePkgPath || pkgName == null) {
 			return dest;
@@ -550,6 +573,20 @@ public class ClassGenerationAction {
 		}
 	}
 
+	public void loadEntity(String name) {
+		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
+				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
+			entityArtifacts.add(name);
+		}
+	}
+
+	public void loadEmbeddable(String name) {
+		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
+				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
+			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.
@@ -584,6 +621,10 @@ public class ClassGenerationAction {
 		}
 	}
 
+	public String getArtifactsGenerationMode(){
+		return artifactsGenerationMode.getLabel();
+	}
+
 	public boolean isForce() {
 		return force;
 	}
@@ -605,4 +646,95 @@ public class ClassGenerationAction {
 	public void setCreatePKProperties(boolean createPKProperties) {
 		this.createPKProperties = createPKProperties;
 	}
+
+	public Collection<EntityArtifact> getEntityArtifacts() {
+		Collection<EntityArtifact> entityArtifacts = new ArrayList<>();
+		for(Artifact artifact : artifacts){
+			if(artifact instanceof EntityArtifact){
+				entityArtifacts.add((EntityArtifact) artifact);
+			}
+		}
+		return entityArtifacts;
+	}
+
+	public Collection<EmbeddableArtifact> getEmbeddableArtifacts() {
+		Collection<EmbeddableArtifact> embeddableArtifacts = new ArrayList<>();
+		for(Artifact artifact : artifacts){
+			if(artifact instanceof EmbeddableArtifact){
+				embeddableArtifacts.add((EmbeddableArtifact) artifact);
+			}
+		}
+		return embeddableArtifacts;
+	}
+
+	public boolean isMakePairs() {
+		return makePairs;
+	}
+
+	public boolean isOverwrite() {
+		return overwrite;
+	}
+
+	public boolean isUsePkgPath() {
+		return usePkgPath;
+	}
+
+	public boolean isCreatePropertyNames() {
+		return createPropertyNames;
+	}
+
+	public String getOutputPattern() {
+		return outputPattern;
+	}
+
+	public String getSuperclassTemplate(){
+		return superTemplate;
+	}
+
+	public DataMap getDataMap() {
+		return dataMap;
+	}
+
+	public String getDir(){
+		return destDir.getAbsolutePath();
+	}
+
+	public String getTemplate() {
+		return template;
+	}
+
+	public String getSuperPkg(){
+		return superPkg;
+	}
+
+	public void resetArtifacts(){
+		this.artifacts = new ArrayList<>();
+	}
+
+	public Collection<String> getEntities() {
+		return entityArtifacts;
+	}
+
+	public Collection<String> getEmbeddables() {
+		return embeddableArtifacts;
+	}
+
+	@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.getAbsolutePath())
+				.simpleTag("generationMode", this.artifactsGenerationMode.getLabel())
+				.simpleTag("subclassTemplate", this.template)
+				.simpleTag("superclassTemplate", this.superTemplate)
+				.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)
+				.end();
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
index 937f451..54a7426 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
@@ -137,4 +137,5 @@ public class DataMapArtifact implements Artifact {
     public DataMap getDataMap() {
     	return dataMap;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java
index 8e6ea43..fec8dae 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java
@@ -18,7 +18,10 @@
  ****************************************************************/
 package org.apache.cayenne.gen;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
 import org.apache.velocity.VelocityContext;
 
 /**
@@ -26,7 +29,7 @@ import org.apache.velocity.VelocityContext;
  * 
  * @since 3.0
  */
-public class EmbeddableArtifact implements Artifact {
+public class EmbeddableArtifact implements Artifact, XMLSerializable {
 
     protected Embeddable embeddable;
 
@@ -65,4 +68,11 @@ public class EmbeddableArtifact implements Artifact {
     public void postInitContext(VelocityContext context) {
         // noop - no special keys...
     }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+        encoder.start("embeddable")
+                .simpleTag("name", embeddable.getClassName())
+                .end();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
index 930b131..b53ee46 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java
@@ -19,7 +19,10 @@
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
 import org.apache.velocity.VelocityContext;
 
 /**
@@ -27,7 +30,7 @@ import org.apache.velocity.VelocityContext;
  * 
  * @since 3.0
  */
-public class EntityArtifact implements Artifact {
+public class EntityArtifact implements Artifact, XMLSerializable {
 
     public static String ENTITY_UTILS_KEY = "entityUtils";
 
@@ -95,4 +98,10 @@ public class EntityArtifact implements Artifact {
         context.put(ENTITY_UTILS_KEY, metadata);
     }
 
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+        encoder.start("objEntity")
+                .simpleTag("name", entity.getName())
+                .end();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 23f0ff3..fa89bf5 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
@@ -2,22 +2,224 @@ package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.dbsync.xml.DbImportExtension;
+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;
+
 public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
 
+    public static final String CONFIG_TAG = "cgen";
+
+    private static final String OUTPUT_DIRECTORY_TAG = "outputDirectory";
+    private static final String GENERATION_MODE_TAG = "generationMode";
+    private static final String SUBCLASS_TEMPLATE_TAG = "subclassTemplate";
+    private static final String SUPERCLASS_TEMPLATE_TAG = "superclassTemplate";
+    private static final String OUTPUT_PATTERN_TAG = "outputPattern";
+    private static final String MAKE_PAIRS_TAG = "makePairs";
+    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";
+
+    public static final String TRUE = "true";
+
     private DataChannelMetaData metaData;
+    private ClassGenerationAction configuration;
 
     CgenConfigHandler(NamespaceAwareNestedTagHandler parentHandler, DataChannelMetaData metaData) {
         super(parentHandler);
         this.metaData = metaData;
-        this.targetNamespace = DbImportExtension.NAMESPACE;
+        this.targetNamespace = CgenExtension.NAMESPACE;
     }
 
     @Override
     protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
+        switch (localName) {
+            case CONFIG_TAG:
+                createConfig();
+                return true;
+        }
         return false;
     }
+
+    @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:
+                createOutputDir(data);
+                break;
+            case GENERATION_MODE_TAG:
+                createGenerationMode(data);
+                break;
+            case SUBCLASS_TEMPLATE_TAG:
+                createSubclassTemplate(data);
+                break;
+            case SUPERCLASS_TEMPLATE_TAG:
+                createSuperclassTemplate(data);
+                break;
+            case OUTPUT_PATTERN_TAG:
+                createOutputPattern(data);
+                break;
+            case MAKE_PAIRS_TAG:
+                createMakePairs(data);
+                break;
+            case USE_PKG_PATH_TAG:
+                createUsePkgPath(data);
+                break;
+            case OVERWRITE_SUBCLASSES_TAG:
+                createOverwriteSubclasses(data);
+                break;
+            case CREATE_PROPERTY_NAMES_TAG:
+                createPropertyNamesTag(data);
+                break;
+            case SUPER_PKG_TAG:
+                createSuperPkg(data);
+                break;
+        }
+    }
+
+    private void createOutputDir(String path) {
+        if(path.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setDestDir(new File(path));
+        }
+    }
+
+    private void createGenerationMode(String mode) {
+        if(mode.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setArtifactsGenerationMode(mode);
+        }
+    }
+
+    private void createSubclassTemplate(String template) {
+        if(template.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setTemplate(template);
+        }
+    }
+
+    private void createSuperclassTemplate(String template) {
+        if(template.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setSuperTemplate(template);
+        }
+    }
+
+    private void createOutputPattern(String pattern) {
+        if(pattern.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setOutputPattern(pattern);
+        }
+    }
+
+    private void createMakePairs(String makePairs) {
+        if (makePairs.trim().length() == 0) {
+            return;
+        }
+
+        if (configuration != null) {
+            if (makePairs.equals(TRUE)) {
+                configuration.setMakePairs(true);
+            } else {
+                configuration.setMakePairs(false);
+            }
+        }
+    }
+
+    private void createUsePkgPath(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            if(data.equals(TRUE)) {
+                configuration.setUsePkgPath(true);
+            } else {
+                configuration.setUsePkgPath(false);
+            }
+        }
+    }
+
+    private void createOverwriteSubclasses(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            if(data.equals(TRUE)) {
+                configuration.setOverwrite(true);
+            } else {
+                configuration.setOverwrite(false);
+            }
+        }
+    }
+
+    private void createPropertyNamesTag(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            if(data.equals(TRUE)) {
+                configuration.setCreatePropertyNames(true);
+            } else {
+                configuration.setCreatePropertyNames(false);
+            }
+        }
+    }
+
+    private void createSuperPkg(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setSuperPkg(data);
+        }
+    }
+
+    private void createConfig() {
+        configuration = new ClassGenerationAction();
+        loaderContext.addDataMapListener(dataMap -> {
+            CgenConfigHandler.this.metaData.add(dataMap, configuration);
+            configuration.setDataMap(dataMap);
+        });
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java
index 619bffc..e98eca9 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java
@@ -4,6 +4,7 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.extension.BaseNamingDelegate;
 import org.apache.cayenne.project.extension.LoaderDelegate;
 import org.apache.cayenne.project.extension.ProjectExtension;
 import org.apache.cayenne.project.extension.SaverDelegate;
@@ -17,7 +18,7 @@ public class CgenExtension implements ProjectExtension {
 
     @Override
     public LoaderDelegate createLoaderDelegate() {
-        return null;
+        return new CgenLoaderDelegate(metaData);
     }
 
     @Override
@@ -27,6 +28,6 @@ public class CgenExtension implements ProjectExtension {
 
     @Override
     public ConfigurationNodeVisitor<String> createNamingDelegate() {
-        return null;
+        return new BaseNamingDelegate();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java
index 44438e3..8b3728f 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java
@@ -20,9 +20,9 @@ public class CgenLoaderDelegate implements LoaderDelegate {
 
     @Override
     public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent, String tag) {
-//        if(CgenConfigHandler.CONFIG_TAG.equals(tag)) {
-//            return new CgenConfigHandler(parent, metaData);
-//        }
+        if(CgenConfigHandler.CONFIG_TAG.equals(tag)) {
+            return new CgenConfigHandler(parent, metaData);
+        }
         return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 f9c7173..d4d4b8f 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
@@ -1,6 +1,7 @@
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.project.extension.BaseSaverDelegate;
 
@@ -14,7 +15,10 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
 
     @Override
     public Void visitDataMap(DataMap dataMap) {
-
+        ClassGenerationAction cgen = metaData.get(dataMap, ClassGenerationAction.class);
+        if(cgen != null){
+            encoder.nested(cgen, getParentDelegate());
+        }
         return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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
new file mode 100644
index 0000000..4e11a6f
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
@@ -0,0 +1,49 @@
+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;
+
+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/d489f2a5/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
new file mode 100644
index 0000000..f4ebc48
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
@@ -0,0 +1,48 @@
+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;
+
+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/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
index c72934d..1d51503 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
@@ -50,6 +50,8 @@ public class CodeTemplateManager {
 	protected Map<String, String> customTemplates;
 	protected Map<String, String> standardTemplates;
 
+	private Map<String, String> reverseStandartTemplates;
+
 	private static Logger logger = LoggerFactory.getLogger(CodeTemplateManager.class);
 
 	public Preferences getTemplatePreferences(Application application) {
@@ -75,6 +77,14 @@ public class CodeTemplateManager {
 		standardTemplates.put(STANDARD_SERVER_SUBCLASS, ClassGenerationAction.SUBCLASS_TEMPLATE);
 		standardTemplates.put(STANDARD_CLIENT_SUBCLASS, ClientClassGenerationAction.SUBCLASS_TEMPLATE);
 		standardTemplates.put(SINGLE_SERVER_CLASS, ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+
+		reverseStandartTemplates = new HashMap<>();
+		reverseStandartTemplates.put(ClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_SERVER_SUBCLASS);
+		reverseStandartTemplates.put(ClientClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_CLIENT_SUBCLASS);
+		reverseStandartTemplates.put(ClassGenerationAction.SINGLE_CLASS_TEMPLATE, SINGLE_SERVER_CLASS);
+		reverseStandartTemplates.put(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, STANDARD_CLIENT_SUPERCLASS);
+		reverseStandartTemplates.put(ClassGenerationAction.SUPERCLASS_TEMPLATE, STANDARD_SERVER_SUPERCLASS);
+
 	}
 
 	/**
@@ -107,6 +117,15 @@ public class CodeTemplateManager {
 		return value != null ? value.toString() : null;
 	}
 
+	public String getNameByPath(String name) {
+		if(customTemplates.containsKey(name)){
+			return customTemplates.get(name).toString();
+		} else {
+			Object value = reverseStandartTemplates.get(name);
+			return value != null ? value.toString() : null;
+		}
+	}
+
 	public Map<String, String> getCustomTemplates() {
 		return customTemplates;
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 2b478ac..3a63297 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
@@ -19,7 +19,6 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ImageRendererColumn;
@@ -36,13 +35,18 @@ public class ClassesTabController extends CayenneController {
     protected ClassesTabPanel view;
     protected ObjectBinding tableBinding;
 
+    private BindingBuilder builder;
+
     public ClassesTabController(CodeGeneratorControllerBase parent) {
         super(parent);
 
         this.view = new ClassesTabPanel();
+        builder = new BindingBuilder(getApplication().getBindingFactory(), this);
+
+        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
     }
 
-    public void startup(DataMap dataMap){
+    public void startup(){
         initBindings();
     }
 
@@ -55,13 +59,6 @@ public class ClassesTabController extends CayenneController {
     }
 
     protected void initBindings() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-
         TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
 
         tableBuilder.addColumn(
@@ -109,6 +106,7 @@ public class ClassesTabController extends CayenneController {
         else if (selectedCount == getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(true);
         }
+        updateEntities();
     }
 
     /**
@@ -118,6 +116,12 @@ public class ClassesTabController extends CayenneController {
     public void checkAllAction() {
         if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
             tableBinding.updateView();
+            updateEntities();
         }
     }
+
+    private void updateEntities(){
+        getParentController().updateEntities();
+        getParentController().getProjectController().setDirty(true);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 8163acb..45d3e51 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
@@ -29,7 +29,6 @@ import org.slf4j.LoggerFactory;
 
 import javax.swing.*;
 import java.awt.*;
-import java.util.Collection;
 import java.util.function.Predicate;
 
 /**
@@ -58,8 +57,11 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     private void initListeners(){
         projectController.addDataMapDisplayListener(e -> {
             super.startup(e.getDataMap());
-            classesSelector.startup(e.getDataMap());
+            classesSelector.startup();
             generatorSelector.startup(e.getDataMap());
+            GeneratorController modeController = generatorSelector.getGeneratorController();
+            ClassGenerationAction classGenerationAction = modeController.createGenerator();
+            ((CustomModeController)modeController).initForm(classGenerationAction);
         });
     }
 
@@ -125,13 +127,10 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     }
 
     public void generateAction() {
-        Collection<ClassGenerationAction> generators = generatorSelector.getGenerator();
-
-        if (generators != null) {
+        ClassGenerationAction generator = generatorSelector.getGenerator();
+        if (generator != null) {
             try {
-                for (ClassGenerationAction generator : generators) {
-                    generator.execute();
-                }
+                generator.execute();
                 JOptionPane.showMessageDialog(
                         getView(),
                         "Class generation finished");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
index 17196fa..d99e708 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
+import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
@@ -171,14 +172,6 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         return selected;
     }
 
-    public int getSelectedEntitiesSize() {
-        return selectedEntities.size();
-    }
-
-    public int getSelectedEmbeddablesSize() {
-        return selectedEmbeddables.size();
-    }
-
     /**
      * Returns the first encountered validation problem for an antity matching the name or
      * null if the entity is valid or the entity is not present.
@@ -250,18 +243,6 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         }
     }
 
-    public Object getCurrentClass() {
-        return currentClass;
-    }
-
-    public void setCurrentClass(Object currentClass) {
-        this.currentClass = currentClass;
-    }
-
-    public Collection<DataMap> getDataMaps() {
-        return dataMaps;
-    }
-
     public JLabel getItemName(Object obj) {
         String className;
         Icon icon;
@@ -279,6 +260,43 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         return labelIcon;
     }
 
+    public void updateEntities(){
+        DataMap map = getProjectController().getCurrentDataMap();
+        ClassGenerationAction generator = projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
+        if(generator != null) {
+            generator.resetArtifacts();
+            LinkedList<ObjEntity> objEntities = new LinkedList<>(map.getObjEntities());
+
+            Collection<ObjEntity> selected = new ArrayList<>(getSelectedEntities());
+            selected.removeIf(ObjEntity::isGeneric);
+
+            objEntities.retainAll(selected);
+            generator.addEntities(objEntities);
+
+            LinkedList<Embeddable> embeddables = new LinkedList<>(map.getEmbeddables());
+            embeddables.retainAll(getSelectedEmbeddables());
+            generator.addEmbeddables(embeddables);
+
+            generator.addQueries(map.getQueryDescriptors());
+        }
+    }
+
+    public void addToSelectedEntities(Collection<String> entities) {
+        selectedEntities.addAll(entities);
+    }
+
+    public void addToSelectedEmbeddables(Collection<String> embeddables) {
+        selectedEmbeddables.addAll(embeddables);
+    }
+
+    public int getSelectedEntitiesSize() {
+        return selectedEntities.size();
+    }
+
+    public int getSelectedEmbeddablesSize() {
+        return selectedEmbeddables.size();
+    }
+
     public DataMap getDataMap() {
         return dataMap;
     }
@@ -286,4 +304,16 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     public ProjectController getProjectController() {
         return projectController;
     }
+
+    public Object getCurrentClass() {
+        return currentClass;
+    }
+
+    public void setCurrentClass(Object currentClass) {
+        this.currentClass = currentClass;
+    }
+
+//    public Collection<DataMap> getDataMaps() {
+//        return dataMaps;
+//    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 8f4dac9..3d07c60 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
@@ -26,9 +26,10 @@ import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 import java.awt.*;
 import java.util.*;
 import java.util.List;
@@ -49,14 +50,19 @@ public class CustomModeController extends GeneratorController {
 
     static final Map<String, String> modesByLabel = new HashMap<>();
 
+    static final Map<String, String> labelByMode = new HashMap<>();
+
     static {
         modesByLabel.put(DATA_MAP_MODE_LABEL, MODE_DATAMAP);
         modesByLabel.put(ENTITY_MODE_LABEL, MODE_ENTITY);
         modesByLabel.put(ALL_MODE_LABEL, MODE_ALL);
+        labelByMode.put(MODE_DATAMAP, DATA_MAP_MODE_LABEL);
+        labelByMode.put(MODE_ENTITY, ENTITY_MODE_LABEL);
+        labelByMode.put(MODE_ALL, ALL_MODE_LABEL);
     }
 
     protected CustomModePanel view;
-    protected CodeTemplateManager templateManager;
+    private CodeTemplateManager templateManager;
 
     protected ObjectBinding superTemplate;
     protected ObjectBinding subTemplate;
@@ -65,6 +71,8 @@ public class CustomModeController extends GeneratorController {
 
     private CustomPreferencesUpdater preferencesUpdater;
 
+    private ClassGenerationAction classGenerationAction;
+
     public CustomPreferencesUpdater getCustomPreferencesUpdater() {
         return preferencesUpdater;
     }
@@ -72,6 +80,7 @@ public class CustomModeController extends GeneratorController {
     public CustomModeController(CodeGeneratorControllerBase parent) {
         super(parent);
         this.view = new CustomModePanel();
+        initListeners();
         bind();
     }
 
@@ -80,64 +89,11 @@ public class CustomModeController extends GeneratorController {
         builder = new BindingBuilder(getApplication().getBindingFactory(), this);
         builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
 
-        Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));
+        updateTemplates();
     }
 
     public void startup(DataMap dataMap) {
-        super.startup(dataMap);
-
-        // bind preferences and init defaults...
-        DataMapDefaults dataMapDefaults = getMapPreferences().get(getParentController().getDataMap());
-
-        if (Util.isEmptyString(dataMapDefaults.getSuperclassTemplate())) {
-            dataMapDefaults.setSuperclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUPERCLASS);
-        }
-
-        if (Util.isEmptyString(dataMapDefaults.getSubclassTemplate())) {
-            dataMapDefaults.setSubclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUBCLASS);
-        }
-
-        if (Util.isEmptyString(dataMapDefaults.getProperty("mode"))) {
-            dataMapDefaults.setProperty("mode", MODE_ENTITY);
-        }
-
-        if (Util.isEmptyString(dataMapDefaults.getProperty("overwrite"))) {
-            dataMapDefaults.setBooleanProperty("overwrite", false);
-        }
-
-        if (Util.isEmptyString(dataMapDefaults.getProperty("pairs"))) {
-            dataMapDefaults.setBooleanProperty("pairs", true);
-        }
-
-        if (Util.isEmptyString(dataMapDefaults.getProperty("usePackagePath"))) {
-            dataMapDefaults.setBooleanProperty("usePackagePath", true);
-        }
-
-        if (Util.isEmptyString(dataMapDefaults.getProperty("outputPattern"))) {
-            dataMapDefaults.setProperty("outputPattern", "*.java");
-        }
-
-        builder.bindToComboSelection(view.getGenerationMode(), "customPreferencesUpdater.mode").updateView();
-
-        builder.bindToStateChange(view.getOverwrite(), "customPreferencesUpdater.overwrite").updateView();
-
-        builder.bindToStateChange(view.getPairs(), "customPreferencesUpdater.pairs").updateView();
-
-        builder.bindToStateChange(view.getUsePackagePath(), "customPreferencesUpdater.usePackagePath").updateView();
-
-        subTemplate = builder.bindToComboSelection(view.getSubclassTemplate(),
-                "customPreferencesUpdater.subclassTemplate");
-
-        superTemplate = builder.bindToComboSelection(view.getSuperclassTemplate(),
-                "customPreferencesUpdater.superclassTemplate");
-
-        builder.bindToTextField(view.getOutputPattern(), "customPreferencesUpdater.outputPattern").updateView();
-
-        builder.bindToStateChange(view.getCreatePropertyNames(), "customPreferencesUpdater.createPropertyNames")
-                .updateView();
-
-        updateTemplates();
+        createDefaults();
     }
 
     protected void createDefaults() {
@@ -159,19 +115,10 @@ public class CustomModeController extends GeneratorController {
         preferencesUpdater = new CustomPreferencesUpdater(map);
     }
 
-    protected GeneratorControllerPanel createView() {
-        if (getParentController().getDataMap() != view.getStandardPanelComponent().getDataMap()) {
-            DataMapDefaults dataMapDefaults = getMapPreferences().get(getParentController().getDataMap());
-            view.getStandardPanelComponent().setDataMap(getParentController().getDataMap());
-            view.getStandardPanelComponent().setPreferences(dataMapDefaults);
-            view.getStandardPanelComponent().getDataMapName().setText(view.getStandardPanelComponent().getDataMap().getName());
-            BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), view.getStandardPanelComponent());
-            builder.bindToTextField(view.getStandardPanelComponent().getSuperclassPackage(), "preferences.superclassPackage").updateView();
-        }
-        return view;
-    }
-
     protected void updateTemplates() {
+        Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
+        view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));
+
         this.templateManager = getApplication().getCodeTemplateManager();
 
         List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
@@ -187,43 +134,12 @@ public class CustomModeController extends GeneratorController {
 
         this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
         this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
-
-        superTemplate.updateView();
-        subTemplate.updateView();
     }
 
     public Component getView() {
         return view;
     }
 
-    public Collection<ClassGenerationAction> createGenerator() {
-
-        mode = modesByLabel.get(view.getGenerationMode().getSelectedItem()).toString();
-
-        Collection<ClassGenerationAction> generators = super.createGenerator();
-
-        String superKey = view.getSuperclassTemplate().getSelectedItem().toString();
-        String superTemplate = templateManager.getTemplatePath(superKey);
-
-        String subKey = view.getSubclassTemplate().getSelectedItem().toString();
-        String subTemplate = templateManager.getTemplatePath(subKey);
-
-        for (ClassGenerationAction generator : generators) {
-            generator.setSuperTemplate(superTemplate);
-            generator.setTemplate(subTemplate);
-            generator.setOverwrite(view.getOverwrite().isSelected());
-            generator.setUsePkgPath(view.getUsePackagePath().isSelected());
-            generator.setMakePairs(view.getPairs().isSelected());
-            generator.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
-
-            if (!Util.isEmptyString(view.getOutputPattern().getText())) {
-                generator.setOutputPattern(view.getOutputPattern().getText());
-            }
-        }
-
-        return generators;
-    }
-
     public void popPreferencesAction() {
         new PreferenceDialog(getApplication().getFrameController()).startupAction(PreferenceDialog.TEMPLATES_KEY);
         updateTemplates();
@@ -235,4 +151,97 @@ public class CustomModeController extends GeneratorController {
         getApplication().getInjector().injectMembers(action);
         return action;
     }
+
+    private void initListeners(){
+        view.getOutputFolder().getDocument().addDocumentListener(new DocumentListener() {
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                classGenerationAction.setDestDir(view.getOutputDir());
+                getParentController().getProjectController().setDirty(true);
+            }
+            @Override
+            public void removeUpdate(DocumentEvent e) {}
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {}
+        });
+
+        view.getPairs().addActionListener(val -> {
+            classGenerationAction.setMakePairs(view.getPairs().isSelected());
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getOverwrite().addActionListener(val -> {
+            classGenerationAction.setOverwrite(view.getOverwrite().isSelected());
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getCreatePropertyNames().addActionListener(val -> {
+            classGenerationAction.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getUsePackagePath().addActionListener(val -> {
+            classGenerationAction.setUsePkgPath(view.getUsePackagePath().isSelected());
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getSubclassTemplate().addActionListener(val -> {
+            classGenerationAction.setTemplate(getApplication().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSubclassTemplate().getSelectedItem())));
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getSuperclassTemplate().addActionListener(val -> {
+            classGenerationAction.setSuperTemplate(getApplication().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSuperclassTemplate().getSelectedItem())));
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getGenerationMode().addActionListener(val -> {
+            classGenerationAction.setArtifactsGenerationMode(modesByLabel.get(view.getGenerationMode().getSelectedItem()));
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getOutputPattern().getDocument().addDocumentListener(new DocumentListener() {
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                classGenerationAction.setOutputPattern(view.getOutputPattern().getText());
+                getParentController().getProjectController().setDirty(true);
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {}
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {}
+        });
+
+        view.getSuperclassPackage().getDocument().addDocumentListener(new DocumentListener() {
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                classGenerationAction.setSuperPkg(view.getSuperclassPackage().getText());
+                getParentController().getProjectController().setDirty(true);
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {}
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {}
+        });
+    }
+
+    public void initForm(ClassGenerationAction classGenerationAction){
+        this.classGenerationAction = classGenerationAction;
+        view.setOutputFolder(classGenerationAction.getDir());
+        view.setGenerationMode(labelByMode.get(classGenerationAction.getArtifactsGenerationMode()));
+        view.setTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getTemplate()));
+        view.setSuperclassTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getSuperclassTemplate()));
+        view.setDataMapName(classGenerationAction.getDataMap().getName());
+        view.setOutputPattern(classGenerationAction.getOutputPattern());
+        view.setPairs(classGenerationAction.isMakePairs());
+        view.setUsePackagePath(classGenerationAction.isUsePkgPath());
+        view.setOverwrite(classGenerationAction.isOverwrite());
+        view.setCreatePropertyNames(classGenerationAction.isCreatePropertyNames());
+        view.setSuperclassPackage(classGenerationAction.getSuperPkg());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 538ff64..720c521 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
@@ -36,6 +36,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
     protected JCheckBox usePackagePath;
     protected JTextField outputPattern;
     protected JCheckBox createPropertyNames;
+    private JTextField superclassPackage;
 
     private JTextField additionalMaps;
     private JButton selectAdditionalMaps;
@@ -49,8 +50,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
     protected ActionLink manageTemplatesLink;
 
-    private StandardPanelComponent standardPanelComponent;
-
     public CustomModePanel() {
 
         this.generationMode = new JComboBox();
@@ -62,9 +61,8 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.outputPattern = new JTextField();
         this.createPropertyNames = new JCheckBox();
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
-        manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
-
-        this.standardPanelComponent = new StandardPanelComponent();
+        this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
+        this.superclassPackage = new JTextField();
 
         this.additionalMaps = new JTextField();
         this.selectAdditionalMaps = new JButton("Select");
@@ -129,7 +127,10 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Client", client);
         builder.nextLine();
 
-        builder.append(standardPanelComponent, 4);
+        builder.append(dataMapName);
+        builder.nextLine();
+
+        builder.append("Superclass package", superclassPackage);
 
         setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
@@ -141,12 +142,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         add(builder.getPanel(), BorderLayout.CENTER);
     }
 
-    public void addDataMapLine(StandardPanelComponent dataMapLine) {
-        dataMapLines.add(dataMapLine);
-        builder.append(dataMapLine, 4);
-        builder.nextLine();
-    }
-
     public JComboBox getGenerationMode() {
         return generationMode;
     }
@@ -183,7 +178,48 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return createPropertyNames;
     }
 
-    public StandardPanelComponent getStandardPanelComponent() {
-        return standardPanelComponent;
+
+    public JTextField getSuperclassPackage() {
+        return superclassPackage;
+    }
+
+    public void setDataMapName(String mapName){
+        dataMapName.setText(mapName);
+    }
+
+    public void setSuperclassPackage(String pack) {
+        superclassPackage.setText(pack);
+    }
+
+    public void setPairs(boolean val){
+        pairs.setSelected(val);
+    }
+
+    public void setOverwrite(boolean val){
+        overwrite.setSelected(val);
+    }
+
+    public void setUsePackagePath(boolean val) {
+        usePackagePath.setSelected(val);
+    }
+
+    public void setCreatePropertyNames(boolean val) {
+        createPropertyNames.setSelected(val);
+    }
+
+    public void setOutputPattern(String pattern){
+        outputPattern.setText(pattern);
+    }
+
+    public void setSuperclassTemplate(String template){
+        superclassTemplate.setSelectedItem(template);
+    }
+
+    public void setTemplate(String template) {
+        subclassTemplate.setSelectedItem(template);
+    }
+
+    public void setGenerationMode(String mode) {
+        generationMode.setSelectedItem(mode);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 9370e3b..a1ccf8f 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
@@ -48,7 +48,7 @@ import java.util.prefs.Preferences;
  */
 public abstract class GeneratorController extends CayenneController {
 
-    protected String mode = ArtifactsGenerationMode.ALL.getLabel();
+    protected String mode = ArtifactsGenerationMode.ENTITY.getLabel();
     protected Map<DataMap, DataMapDefaults> mapPreferences;
     private String outputPath;
 
@@ -56,12 +56,6 @@ public abstract class GeneratorController extends CayenneController {
         super(parent);
     }
 
-    public void startup(DataMap dataMap){
-        createDefaults();
-        createView();
-//        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
-    }
-
     public String getOutputPath() {
         return outputPath;
     }
@@ -94,25 +88,14 @@ public abstract class GeneratorController extends CayenneController {
     }
 
     protected void initBindings(BindingBuilder bindingBuilder) {
-
-        initOutputFolder();
-
-        JTextField outputFolder = ((GeneratorControllerPanel) getView()).getOutputFolder();
         JButton outputSelect = ((GeneratorControllerPanel) getView()).getSelectOutputFolder();
-
-        outputFolder.setText(getOutputPath());
         bindingBuilder.bindToAction(outputSelect, "selectOutputFolderAction()");
-        bindingBuilder.bindToTextField(outputFolder, "outputPath");
     }
 
     protected CodeGeneratorControllerBase getParentController() {
         return (CodeGeneratorControllerBase) getParent();
     }
 
-    protected abstract GeneratorControllerPanel createView();
-
-    protected abstract void createDefaults();
-
     /**
      * Creates an appropriate subclass of {@link ClassGenerationAction},
      * returning it in an unconfigured state. Configuration is performed by
@@ -123,76 +106,57 @@ public abstract class GeneratorController extends CayenneController {
     /**
      * Creates a class generator for provided selections.
      */
-    public Collection<ClassGenerationAction> createGenerator() {
-
-        File outputDir = getOutputDir();
+    public ClassGenerationAction createGenerator() {
+        DataMap map = getParentController().getProjectController().getCurrentDataMap();
 
-        // no destination folder
-        if (outputDir == null) {
-            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
-            return null;
+        ClassGenerationAction generator = getParentController().projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
+        if(generator != null){
+            generator.prepareArtifacts();
+            getParentController().addToSelectedEntities(generator.getEntities());
+            getParentController().addToSelectedEmbeddables(generator.getEmbeddables());
+            return generator;
         }
 
-        // no such folder
-        if (!outputDir.exists() && !outputDir.mkdirs()) {
-            JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir
-                    + ". Select a different one.");
-            return null;
-        }
-
-        // not a directory
-        if (!outputDir.isDirectory()) {
-            JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory.");
-            return null;
-        }
-
-        // remove generic entities...
-        Collection<ObjEntity> selectedEntities = new ArrayList<>(getParentController().getSelectedEntities());
-        selectedEntities.removeIf(ObjEntity::isGeneric);
-
-        Collection<ClassGenerationAction> generators = new ArrayList<>();
-        Collection<StandardPanelComponent> dataMapLines = ((GeneratorControllerPanel) getView()).getDataMapLines();
-        DataMap map = getParentController().getDataMap();
         try {
-            ClassGenerationAction generator = newGenerator();
-            generator.setArtifactsGenerationMode(mode);
+            generator = newGenerator();
             generator.setDataMap(map);
+            initOutputFolder();
+            File outputDir = new File(outputPath);
 
-            LinkedList<ObjEntity> objEntities = new LinkedList<>(map.getObjEntities());
-            objEntities.retainAll(selectedEntities);
-            generator.addEntities(objEntities);
-
-            LinkedList<Embeddable> embeddables = new LinkedList<>(map.getEmbeddables());
-            embeddables.retainAll(getParentController().getSelectedEmbeddables());
-            generator.addEmbeddables(embeddables);
-
-            generator.addQueries(map.getQueryDescriptors());
+            // no destination folder
+            if (outputDir == null) {
+                JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
+                return null;
+            }
 
-            Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
+            // no such folder
+            if (!outputDir.exists() && !outputDir.mkdirs()) {
+                JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir
+                        + ". Select a different one.");
+                return null;
+            }
 
-            if (preferences != null) {
-                generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
+            // not a directory
+            if (!outputDir.isDirectory()) {
+                JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory.");
+                return null;
             }
 
             generator.setDestDir(outputDir);
-            generator.setMakePairs(true);
-            generator.setForce(true);
 
-            for (StandardPanelComponent dataMapLine : dataMapLines) {
-                if (dataMapLine.getDataMap() == map && !Util.isEmptyString(dataMapLine.getSuperclassPackage().getText())) {
-                    generator.setSuperPkg(dataMapLine.getSuperclassPackage().getText());
-                    break;
-                }
-            }
+            Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
 
-                generators.add(generator);
-            } catch (CayenneRuntimeException exception) {
-                JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
-                return null;
+            if (preferences != null) {
+                generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
             }
 
+            getParentController().projectController.getApplication().getMetaData().add(map, generator);
+        } catch (CayenneRuntimeException exception) {
+            JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
+            return null;
+        }
 
-        return generators;
+        return generator;
     }
 
     public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
@@ -520,7 +484,7 @@ public abstract class GeneratorController extends CayenneController {
             // update model
             String path = selected.getAbsolutePath();
             outputFolder.setText(path);
-            setOutputPath(path);
+//            setOutputPath(path);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 9b836bd..7f1f689 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
@@ -20,8 +20,7 @@
 package org.apache.cayenne.modeler.editor.cgen;
 
 import javax.swing.*;
-import java.util.ArrayList;
-import java.util.Collection;
+import java.io.File;
 
 /**
  * A generic panel that is a superclass of generator panels, defining common fields.
@@ -29,12 +28,10 @@ import java.util.Collection;
  */
 public class GeneratorControllerPanel extends JPanel {
 
-    protected Collection<StandardPanelComponent> dataMapLines;
     protected JTextField outputFolder;
     protected JButton selectOutputFolder;
 
     public GeneratorControllerPanel() {
-        this.dataMapLines = new ArrayList<>();
         this.outputFolder = new JTextField();
         this.selectOutputFolder = new JButton("Select");
     }
@@ -43,11 +40,15 @@ public class GeneratorControllerPanel extends JPanel {
         return outputFolder;
     }
 
+    public File getOutputDir(){
+        return new File(outputFolder.getText());
+    }
+
     public JButton getSelectOutputFolder() {
         return selectOutputFolder;
     }
 
-    public Collection<StandardPanelComponent> getDataMapLines() {
-        return dataMapLines;
+    public void setOutputFolder(String folder) {
+        this.outputFolder.setText(folder);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/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 c3fff72..1e338eb 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
@@ -25,7 +25,6 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.pref.PreferenceDetail;
 
 import java.awt.*;
-import java.util.Collection;
 
 /**
  */
@@ -64,7 +63,7 @@ public class GeneratorTabController extends CayenneController {
         return customModeController;
     }
 
-    public Collection<ClassGenerationAction> getGenerator() {
+    public ClassGenerationAction getGenerator() {
         GeneratorController modeController = getGeneratorController();
         return (modeController != null) ? modeController.createGenerator() : null;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java
deleted file mode 100644
index 71d95e4..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java
+++ /dev/null
@@ -1,79 +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.editor.cgen;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-
-import javax.swing.*;
-import java.awt.*;
-
-public class StandardPanelComponent extends JComponent {
-
-    private DataMap dataMap;
-    private DataMapDefaults preferences;
-    private JLabel dataMapName;
-    private JTextField superclassPackage;
-    private DefaultFormBuilder builder;
-
-    public StandardPanelComponent() {
-        super();
-        dataMapName = new JLabel();
-        dataMapName.setFont(dataMapName.getFont().deriveFont(1));
-        superclassPackage = new JTextField();
-
-        FormLayout layout = new FormLayout(
-                "right:77dlu, 3dlu, fill:200:grow, 3dlu", "");
-        builder = new DefaultFormBuilder(layout);
-        builder.append(dataMapName);
-        builder.nextLine();
-        builder.append("Superclass Package:", superclassPackage);
-
-        setLayout(new BorderLayout());
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public DataMap getDataMap() {
-        return dataMap;
-    }
-
-    public void setDataMap(DataMap dataMap) {
-        this.dataMap = dataMap;
-    }
-
-    public DataMapDefaults getPreferences() {
-        return preferences;
-    }
-
-    public void setPreferences(DataMapDefaults preferences) {
-        this.preferences = preferences;
-    }
-
-    public JLabel getDataMapName() {
-        return dataMapName;
-    }
-
-    public JTextField getSuperclassPackage() {
-        return superclassPackage;
-    }
-
-}