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

[04/32] cayenne git commit: Create global cgen action.

Create global cgen action.


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

Branch: refs/heads/master
Commit: b85a090025c21e1cbe781f47c58737fefb67e892
Parents: d489f2a
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Jun 20 10:50:42 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:40:57 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ClassGenerationAction.java      | 45 ++++++---
 .../cayenne/gen/xml/CgenConfigHandler.java      | 46 +++++++++-
 .../cayenne/modeler/CayenneModelerFrame.java    | 96 +++-----------------
 .../cayenne/modeler/CodeTemplateManager.java    | 29 ++++++
 .../cayenne/modeler/action/CgenAction.java      | 53 +++++++++++
 .../modeler/action/DefaultActionManager.java    |  5 +-
 .../editor/cgen/ClassesTabController.java       |  2 +-
 .../editor/cgen/CodeGeneratorController.java    |  1 +
 .../editor/cgen/CustomModeController.java       | 82 +++++++++++------
 .../modeler/editor/cgen/CustomModePanel.java    | 44 ++++-----
 .../editor/cgen/GeneratorController.java        | 23 +----
 .../editor/cgen/GeneratorTabController.java     |  2 +-
 12 files changed, 258 insertions(+), 170 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 423fb92..35e34cf 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
@@ -89,7 +89,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	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,6 +98,10 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 
 		this.template = SUBCLASS_TEMPLATE;
 		this.superTemplate = SUPERCLASS_TEMPLATE;
+
+		this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
+		this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
+
 		this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
 
 		this.artifacts = new ArrayList<>();
@@ -253,6 +256,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public void prepareArtifacts(){
+//		resetArtifacts();
 		if(!entityArtifacts.isEmpty()) {
 			for(String name : entityArtifacts) {
 				ObjEntity objEntity = dataMap.getObjEntity(name);
@@ -621,18 +625,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		}
 	}
 
-	public String getArtifactsGenerationMode(){
-		return artifactsGenerationMode.getLabel();
-	}
-
-	public boolean isForce() {
-		return force;
-	}
-
-	public void setForce(boolean force) {
-		this.force = force;
-	}
-
 	/**
 	 * @since 4.1
 	 */
@@ -719,6 +711,30 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return embeddableArtifacts;
 	}
 
+	public String getArtifactsGenerationMode(){
+		return artifactsGenerationMode.getLabel();
+	}
+
+	public boolean isForce() {
+		return force;
+	}
+
+	public void setForce(boolean force) {
+		this.force = force;
+	}
+
+	public String getEncoding() {
+		return encoding;
+	}
+
+	public String getEmbeddableTemplate() {
+		return embeddableTemplate;
+	}
+
+	public String getEmbeddableSuperTemplate() {
+		return embeddableSuperTemplate;
+	}
+
 	@Override
 	public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
 		encoder.start("cgen")
@@ -729,12 +745,15 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 				.simpleTag("generationMode", this.artifactsGenerationMode.getLabel())
 				.simpleTag("subclassTemplate", this.template)
 				.simpleTag("superclassTemplate", this.superTemplate)
+				.simpleTag("embeddableTemplate", this.embeddableTemplate)
+				.simpleTag("embeddableSuperclassTemplate", this.embeddableSuperTemplate)
 				.simpleTag("outputPattern", this.outputPattern)
 				.simpleTag("makePairs", Boolean.toString(this.makePairs))
 				.simpleTag("usePkgPath", Boolean.toString(this.usePkgPath))
 				.simpleTag("overwriteSubclasses", Boolean.toString(this.overwrite))
 				.simpleTag("createPropertyNames", Boolean.toString(this.createPropertyNames))
 				.simpleTag("superPkg", this.superPkg)
+				.simpleTag("encoding", this.encoding)
 				.end();
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 fa89bf5..667a4a6 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
@@ -25,6 +25,9 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     private static final String SUPER_PKG_TAG = "superPkg";
     private static final String OBJENTITY_TAG = "objEntity";
     private static final String EMBEDDABLE_TAG = "embeddable";
+    private static final String ENCODING_TAG = "encoding";
+    private static final String EMBEDDABLE_TEMPLATE_TAG = "embeddableTemplate";
+    private static final String EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG = "embeddableSuperclassTemplate";
 
     public static final String TRUE = "true";
 
@@ -96,6 +99,16 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case SUPER_PKG_TAG:
                 createSuperPkg(data);
                 break;
+            case ENCODING_TAG:
+                createEncoding(data);
+                break;
+            case EMBEDDABLE_TEMPLATE_TAG:
+                createEmbeddableTemplate(data);
+                break;
+            case EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG:
+                createEmbeddableSuperclassTemplate(data);
+                break;
+
         }
     }
 
@@ -139,6 +152,26 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
+    public void createEmbeddableTemplate(String template) {
+        if(template.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setEmbeddableTemplate(template);
+        }
+    }
+
+    public void createEmbeddableSuperclassTemplate(String template) {
+        if(template.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setEmbeddableSuperTemplate(template);
+        }
+    }
+
     private void createOutputPattern(String pattern) {
         if(pattern.trim().length() == 0) {
             return;
@@ -215,11 +248,22 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
+    private void createEncoding(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setEncoding(data);
+        }
+    }
+
     private void createConfig() {
         configuration = new ClassGenerationAction();
         loaderContext.addDataMapListener(dataMap -> {
-            CgenConfigHandler.this.metaData.add(dataMap, configuration);
             configuration.setDataMap(dataMap);
+            configuration.prepareArtifacts();
+            CgenConfigHandler.this.metaData.add(dataMap, configuration);
         });
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 507919d..0b12dcd 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,94 +19,12 @@
 
 package org.apache.cayenne.modeler;
 
-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;
-import java.awt.event.KeyListener;
-import java.util.List;
-import java.util.Vector;
-
-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 org.apache.cayenne.modeler.action.AboutAction;
-import org.apache.cayenne.modeler.action.ActionManager;
-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.ReverseEngineeringAction;
-import org.apache.cayenne.modeler.action.ImportDataMapAction;
-import org.apache.cayenne.modeler.action.ImportEOModelAction;
-import org.apache.cayenne.modeler.action.InferRelationshipsAction;
-import org.apache.cayenne.modeler.action.MigrateAction;
-import org.apache.cayenne.modeler.action.NavigateBackwardAction;
-import org.apache.cayenne.modeler.action.NavigateForwardAction;
-import org.apache.cayenne.modeler.action.NewProjectAction;
-import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.ProjectAction;
-import org.apache.cayenne.modeler.action.RedoAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
-import org.apache.cayenne.modeler.action.RevertAction;
-import org.apache.cayenne.modeler.action.SaveAction;
-import org.apache.cayenne.modeler.action.SaveAsAction;
-import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
-import org.apache.cayenne.modeler.action.UndoAction;
-import org.apache.cayenne.modeler.action.ValidateAction;
+import org.apache.cayenne.modeler.action.*;
 import org.apache.cayenne.modeler.action.dbimport.ReverseEngineeringToolMenuAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.dialog.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.editor.EditorView;
-import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
-import org.apache.cayenne.modeler.event.DataMapDisplayListener;
-import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
-import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
-import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
-import org.apache.cayenne.modeler.event.EntityDisplayEvent;
-import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
-import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
-import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
-import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
-import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
-import org.apache.cayenne.modeler.event.QueryDisplayEvent;
-import org.apache.cayenne.modeler.event.QueryDisplayListener;
-import org.apache.cayenne.modeler.event.RecentFileListListener;
+import org.apache.cayenne.modeler.event.*;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.RecentFileMenu;
@@ -114,6 +32,15 @@ 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 java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.List;
+import java.util.Vector;
+
 /**
  * Main frame of CayenneModeler. Responsibilities include coordination of
  * enabling/disabling of menu and toolbar.
@@ -237,6 +164,7 @@ public class CayenneModelerFrame extends JFrame implements DataNodeDisplayListen
         toolMenu.add(getAction(InferRelationshipsAction.class).buildMenu());
         toolMenu.add(getAction(ImportEOModelAction.class).buildMenu());
         toolMenu.addSeparator();
+        toolMenu.add(getAction(CgenAction.class).buildMenu());
         toolMenu.add(getAction(GenerateCodeAction.class).buildMenu());
         toolMenu.add(getAction(GenerateDBAction.class).buildMenu());
         toolMenu.add(getAction(MigrateAction.class).buildMenu());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 1d51503..b56851a 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
@@ -43,6 +43,10 @@ public class CodeTemplateManager {
 	static final String STANDARD_CLIENT_SUPERCLASS = "Standard Client Superclass";
 	static final String STANDARD_CLIENT_SUBCLASS = "Standard Client Subclass";
 
+	public static final String STANDART_EMBEDDABLE_SUPERCLASS = "Standart Embeddable Superclass";
+	public static final String STANDART_EMBEDDABLE_SUBCLASS = "Standart Embeddable Subclass";
+	public static final String SINGLE_EMBEDDABLE_CLASS = "Single Embeddable class";
+
 	public static final String NODE_NAME = "codeTemplateManager";
 
 	protected List<String> standardSubclassTemplates;
@@ -50,6 +54,9 @@ public class CodeTemplateManager {
 	protected Map<String, String> customTemplates;
 	protected Map<String, String> standardTemplates;
 
+	protected List<String> standartEmbeddableTemplates;
+	protected List<String> standartEmbeddableSuperclassTemplates;
+
 	private Map<String, String> reverseStandartTemplates;
 
 	private static Logger logger = LoggerFactory.getLogger(CodeTemplateManager.class);
@@ -69,6 +76,13 @@ public class CodeTemplateManager {
 		standardSubclassTemplates.add(STANDARD_CLIENT_SUBCLASS);
 		standardSubclassTemplates.add(SINGLE_SERVER_CLASS);
 
+		standartEmbeddableTemplates = new ArrayList<>();
+		standartEmbeddableTemplates.add(SINGLE_EMBEDDABLE_CLASS);
+		standartEmbeddableTemplates.add(STANDART_EMBEDDABLE_SUBCLASS);
+
+		standartEmbeddableSuperclassTemplates = new ArrayList<>();
+		standartEmbeddableSuperclassTemplates.add(STANDART_EMBEDDABLE_SUPERCLASS);
+
 		updateCustomTemplates(getTemplatePreferences(application));
 
 		standardTemplates = new HashMap<>();
@@ -78,6 +92,10 @@ public class CodeTemplateManager {
 		standardTemplates.put(STANDARD_CLIENT_SUBCLASS, ClientClassGenerationAction.SUBCLASS_TEMPLATE);
 		standardTemplates.put(SINGLE_SERVER_CLASS, ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
 
+		standardTemplates.put(STANDART_EMBEDDABLE_SUPERCLASS, ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE);
+		standardTemplates.put(STANDART_EMBEDDABLE_SUBCLASS, ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE);
+		standardTemplates.put(SINGLE_EMBEDDABLE_CLASS, ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
+
 		reverseStandartTemplates = new HashMap<>();
 		reverseStandartTemplates.put(ClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_SERVER_SUBCLASS);
 		reverseStandartTemplates.put(ClientClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_CLIENT_SUBCLASS);
@@ -85,6 +103,9 @@ public class CodeTemplateManager {
 		reverseStandartTemplates.put(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, STANDARD_CLIENT_SUPERCLASS);
 		reverseStandartTemplates.put(ClassGenerationAction.SUPERCLASS_TEMPLATE, STANDARD_SERVER_SUPERCLASS);
 
+		reverseStandartTemplates.put(ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE, STANDART_EMBEDDABLE_SUPERCLASS);
+		reverseStandartTemplates.put(ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE, STANDART_EMBEDDABLE_SUBCLASS);
+		reverseStandartTemplates.put(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE, SINGLE_EMBEDDABLE_CLASS);
 	}
 
 	/**
@@ -137,4 +158,12 @@ public class CodeTemplateManager {
 	public List<String> getStandardSuperclassTemplates() {
 		return standardSuperclassTemplates;
 	}
+
+	public List<String> getStandartEmbeddableTemplates() {
+		return standartEmbeddableTemplates;
+	}
+
+	public List<String> getStandartEmbeddableSuperclassTemplates() {
+		return standartEmbeddableSuperclassTemplates;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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
new file mode 100644
index 0000000..2cd3012
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
@@ -0,0 +1,53 @@
+package org.apache.cayenne.modeler.action;
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneAction;
+import org.apache.cayenne.project.Project;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+
+public class CgenAction extends CayenneAction{
+
+    private static Logger logObj = LoggerFactory.getLogger(CgenAction.class);
+
+    public CgenAction(Application application) {
+        super(getActionName(), application);
+    }
+
+    public static String getActionName(){
+        return "Generate All Classes";
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        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.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/b85a0900/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
index c476fff..d2ad35f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
@@ -167,6 +167,8 @@ public class DefaultActionManager implements ActionManager {
 
         registerAction(new LinkDataMapAction(application));
         registerAction(new LinkDataMapsAction(application));
+
+        registerAction(new CgenAction((application)));
     }
 
     private void initActions() {
@@ -195,7 +197,8 @@ public class DefaultActionManager implements ActionManager {
                 GenerateCodeAction.class.getName(),
                 GenerateDBAction.class.getName(),
                 PasteAction.class.getName(),
-                ReverseEngineeringToolMenuAction.class.getName()));
+                ReverseEngineeringToolMenuAction.class.getName(),
+                CgenAction.class.getName()));
 
         DATA_NODE_ACTIONS = new HashSet<>(DOMAIN_ACTIONS);
         DATA_NODE_ACTIONS.addAll(Arrays.asList(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 3a63297..586416e 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
@@ -122,6 +122,6 @@ public class ClassesTabController extends CayenneController {
 
     private void updateEntities(){
         getParentController().updateEntities();
-        getParentController().getProjectController().setDirty(true);
+//        getParentController().getProjectController().setDirty(true);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 45d3e51..ac5e152 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
@@ -59,6 +59,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
             super.startup(e.getDataMap());
             classesSelector.startup();
             generatorSelector.startup(e.getDataMap());
+
             GeneratorController modeController = generatorSelector.getGeneratorController();
             ClassGenerationAction classGenerationAction = modeController.createGenerator();
             ((CustomModeController)modeController).initForm(classGenerationAction);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 3d07c60..134381b 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
@@ -20,10 +20,8 @@
 package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.CodeTemplateManager;
 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;
 
@@ -73,10 +71,6 @@ public class CustomModeController extends GeneratorController {
 
     private ClassGenerationAction classGenerationAction;
 
-    public CustomPreferencesUpdater getCustomPreferencesUpdater() {
-        return preferencesUpdater;
-    }
-
     public CustomModeController(CodeGeneratorControllerBase parent) {
         super(parent);
         this.view = new CustomModePanel();
@@ -92,27 +86,23 @@ public class CustomModeController extends GeneratorController {
         updateTemplates();
     }
 
-    public void startup(DataMap dataMap) {
-        createDefaults();
-    }
-
     protected void createDefaults() {
-        TreeMap<DataMap, DataMapDefaults> map = new TreeMap<>();
-        DataMap dataMap = getParentController().getDataMap();
-        DataMapDefaults preferences;
-        preferences = getApplication().getFrameController().getProjectController()
-                .getDataMapPreferences(this.getClass().getName().replace(".", "/"), dataMap);
-        preferences.setSuperclassPackage("");
-        preferences.updateSuperclassPackage(dataMap, false);
-
-        map.put(dataMap, preferences);
-
-        if (getOutputPath() == null) {
-            setOutputPath(preferences.getOutputPath());
-        }
-
-        setMapPreferences(map);
-        preferencesUpdater = new CustomPreferencesUpdater(map);
+//        TreeMap<DataMap, DataMapDefaults> map = new TreeMap<>();
+//        DataMap dataMap = getParentController().getDataMap();
+//        DataMapDefaults preferences;
+//        preferences = getApplication().getFrameController().getProjectController()
+//                .getDataMapPreferences(this.getClass().getName().replace(".", "/"), dataMap);
+//        preferences.setSuperclassPackage("");
+//        preferences.updateSuperclassPackage(dataMap, false);
+//
+//        map.put(dataMap, preferences);
+//
+//        if (getOutputPath() == null) {
+//            setOutputPath(preferences.getOutputPath());
+//        }
+//
+//        setMapPreferences(map);
+//        preferencesUpdater = new CustomPreferencesUpdater(map);
     }
 
     protected void updateTemplates() {
@@ -132,8 +122,19 @@ public class CustomModeController extends GeneratorController {
         Collections.sort(subTemplates);
         subTemplates.addAll(customTemplates);
 
+        List<String> embeddableTemplates = new ArrayList<>(templateManager.getStandartEmbeddableTemplates());
+        Collections.sort(embeddableTemplates);
+        embeddableTemplates.addAll(customTemplates);
+
+        List<String> embeddableSuperTemplates = new ArrayList<>(templateManager.getStandartEmbeddableSuperclassTemplates());
+        Collections.sort(embeddableSuperTemplates);
+        embeddableSuperTemplates.addAll(customTemplates);
+
         this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
         this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
+
+        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel(embeddableTemplates.toArray()));
+        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel(embeddableSuperTemplates.toArray()));
     }
 
     public Component getView() {
@@ -196,6 +197,16 @@ public class CustomModeController extends GeneratorController {
             getParentController().getProjectController().setDirty(true);
         });
 
+        view.getEmbeddableTemplate().addActionListener(val -> {
+            classGenerationAction.setEmbeddableTemplate(getApplication().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getEmbeddableTemplate().getSelectedItem())));
+            getParentController().getProjectController().setDirty(true);
+        });
+
+        view.getEmbeddableSuperTemplate().addActionListener(val -> {
+            classGenerationAction.setEmbeddableSuperTemplate(getApplication().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getEmbeddableSuperTemplate().getSelectedItem())));
+            getParentController().getProjectController().setDirty(true);
+        });
+
         view.getGenerationMode().addActionListener(val -> {
             classGenerationAction.setArtifactsGenerationMode(modesByLabel.get(view.getGenerationMode().getSelectedItem()));
             getParentController().getProjectController().setDirty(true);
@@ -228,6 +239,20 @@ public class CustomModeController extends GeneratorController {
             @Override
             public void changedUpdate(DocumentEvent e) {}
         });
+
+        view.getEncoding().getDocument().addDocumentListener(new DocumentListener() {
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                classGenerationAction.setEncoding(view.getEncoding().getText());
+                getParentController().getProjectController().setDirty(true);
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {}
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {}
+        });
     }
 
     public void initForm(ClassGenerationAction classGenerationAction){
@@ -243,5 +268,10 @@ public class CustomModeController extends GeneratorController {
         view.setOverwrite(classGenerationAction.isOverwrite());
         view.setCreatePropertyNames(classGenerationAction.isCreatePropertyNames());
         view.setSuperclassPackage(classGenerationAction.getSuperPkg());
+        view.setEncoding(classGenerationAction.getEncoding());
+        view.setEmbeddableTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableTemplate()));
+        view.setEmbeddableSuperTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableSuperTemplate()));
+
+//        getParentController().getProjectController().setDirty(false);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 720c521..e79ef7a 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
@@ -28,19 +28,16 @@ import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
-    protected JComboBox generationMode;
-    protected JComboBox subclassTemplate;
-    protected JComboBox superclassTemplate;
+    private JComboBox generationMode;
+    private JComboBox subclassTemplate;
+    private JComboBox superclassTemplate;
     protected JCheckBox pairs;
-    protected JCheckBox overwrite;
-    protected JCheckBox usePackagePath;
-    protected JTextField outputPattern;
-    protected JCheckBox createPropertyNames;
+    private JCheckBox overwrite;
+    private JCheckBox usePackagePath;
+    private JTextField outputPattern;
+    private JCheckBox createPropertyNames;
     private JTextField superclassPackage;
 
-    private JTextField additionalMaps;
-    private JButton selectAdditionalMaps;
-    private JCheckBox client;
     private JTextField encoding;
     private JComboBox embeddableTemplate;
     private JComboBox embeddableSuperTemplate;
@@ -64,9 +61,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
         this.superclassPackage = new JTextField();
 
-        this.additionalMaps = new JTextField();
-        this.selectAdditionalMaps = new JButton("Select");
-        this.client = new JCheckBox();
         this.encoding = new JTextField();
         this.embeddableTemplate = new JComboBox();
         this.embeddableSuperTemplate = new JComboBox();
@@ -79,7 +73,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         });
 
         // assemble
-
         FormLayout layout = new FormLayout(
                 "right:77dlu, 3dlu, fill:200:grow, 6dlu, fill:50dlu, 3dlu", "");
         builder = new DefaultFormBuilder(layout);
@@ -88,9 +81,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Output Directory:", outputFolder, selectOutputFolder);
         builder.nextLine();
 
-        builder.append("Additional DataMaps", additionalMaps, selectAdditionalMaps);
-        builder.nextLine();
-
         builder.append("Generation Mode:", generationMode);
         builder.nextLine();
 
@@ -124,9 +114,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Create Property Names:", createPropertyNames);
         builder.nextLine();
 
-        builder.append("Client", client);
-        builder.nextLine();
-
         builder.append(dataMapName);
         builder.nextLine();
 
@@ -150,9 +137,11 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return manageTemplatesLink;
     }
 
-    public JComboBox getSubclassTemplate() {
-        return subclassTemplate;
-    }
+    public JComboBox getSubclassTemplate() { return subclassTemplate; }
+
+    public JComboBox getEmbeddableTemplate() { return embeddableTemplate; }
+
+    public JComboBox getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
 
     public JComboBox getSuperclassTemplate() {
         return superclassTemplate;
@@ -178,11 +167,12 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return createPropertyNames;
     }
 
-
     public JTextField getSuperclassPackage() {
         return superclassPackage;
     }
 
+    public JTextField getEncoding() { return encoding; }
+
     public void setDataMapName(String mapName){
         dataMapName.setText(mapName);
     }
@@ -222,4 +212,10 @@ public class CustomModePanel extends GeneratorControllerPanel {
     public void setGenerationMode(String mode) {
         generationMode.setSelectedItem(mode);
     }
+
+    public void setEncoding(String encoding) { this.encoding.setText(encoding); }
+
+    public void setEmbeddableTemplate(String template) { embeddableTemplate.setSelectedItem(template); }
+
+    public void setEmbeddableSuperTemplate(String template) { embeddableSuperTemplate.setSelectedItem(template); }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 a1ccf8f..7a62efc 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
@@ -111,9 +111,10 @@ public abstract class GeneratorController extends CayenneController {
 
         ClassGenerationAction generator = getParentController().projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
         if(generator != null){
-            generator.prepareArtifacts();
             getParentController().addToSelectedEntities(generator.getEntities());
             getParentController().addToSelectedEmbeddables(generator.getEmbeddables());
+            generator.getEntities().clear();
+            generator.getEmbeddables().clear();
             return generator;
         }
 
@@ -489,24 +490,8 @@ public abstract class GeneratorController extends CayenneController {
     }
 
     private void initOutputFolder() {
-        String path;
-        if (getOutputPath() == null) {
-            if (System.getProperty("cayenne.cgen.destdir") != null) {
-                setOutputPath(System.getProperty("cayenne.cgen.destdir"));
-            } else {
-                // init default directory..
-                FSPath lastPath = Application.getInstance().getFrameController().getLastDirectory();
-
-                path = checkDefaultMavenResourceDir(lastPath, "test");
-
-                if (path != null || (path = checkDefaultMavenResourceDir(lastPath, "main")) != null) {
-                    setOutputPath(path);
-                } else {
-                    File lastDir = (lastPath != null) ? lastPath.getExistingDirectory(false) : null;
-                    setOutputPath(lastDir != null ? lastDir.getAbsolutePath() : null);
-                }
-            }
-        }
+        String pathString = System.getProperty("user.home");
+        setOutputPath(pathString);
     }
 
     private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b85a0900/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 1e338eb..fc3f567 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
@@ -44,7 +44,7 @@ public class GeneratorTabController extends CayenneController {
     }
 
     public void startup(DataMap dataMap){
-        customModeController.startup(dataMap);
+//        customModeController.startup(dataMap);
     }
 
     public Component getView() {