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

[06/32] cayenne git commit: Create global cgen config

Create global cgen config


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

Branch: refs/heads/master
Commit: e41f1e44e801ff80640983fa621c84f0049a1113
Parents: 0e19c96
Author: Arseni Bulatski <an...@gmail.com>
Authored: Fri Jun 22 15:56:59 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:41:41 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ClassGenerationAction.java      |  12 +-
 .../cayenne/tools/CayenneGeneratorMojo.java     |   4 +-
 .../cayenne/modeler/action/CgenAction.java      |  54 ++--
 .../modeler/dialog/codegen/cgen/CgenDialog.java |  44 +++
 .../codegen/cgen/CgenGlobalController.java      |  47 +++
 .../dialog/codegen/cgen/CgenGlobalPanel.java    | 274 ++++++++++++++++++
 .../codegen/cgen/CgenGlobalPanelController.java | 285 +++++++++++++++++++
 .../editor/cgen/CodeGeneratorController.java    |   1 +
 .../modeler/editor/cgen/CustomModePanel.java    |   2 +-
 9 files changed, 687 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/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 f56f81e..5b10a07 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
@@ -219,16 +219,18 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		artifact.postInitContext(context);
 	}
 
+	public void prepareArtifacts() {
+        resetArtifacts();
+        addAllEntities();
+        addAllEmbeddables();
+        addQueries(dataMap.getQueryDescriptors());
+    }
+
 	/**
 	 * Executes class generation once per each artifact.
 	 */
 	public void execute() throws Exception {
 
-		resetArtifacts();
-		addAllEntities();
-		addAllEmbeddables();
-		addQueries(dataMap.getQueryDescriptors());
-
 		validateAttributes();
 
 		try {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
index 10cd860..d043c30 100644
--- a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
+++ b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
@@ -26,13 +26,13 @@ import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
-import org.slf4j.Logger;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
@@ -288,7 +288,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		action.setEmbeddableSuperTemplate(embeddableSuperTemplate);
 		action.setEmbeddableTemplate(embeddableTemplate);
 		action.setUsePkgPath(usePkgPath);
-        action.setCreatePropertyNames(createPropertyNames);
+		action.setCreatePropertyNames(createPropertyNames);
         action.setCreatePKProperties(createPKProperties);
 
 		return action;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
index 2cd3012..b197991 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
@@ -1,18 +1,12 @@
 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.dialog.codegen.cgen.CgenGlobalController;
 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{
 
@@ -28,26 +22,30 @@ public class CgenAction extends CayenneAction{
 
     @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());
-        }
+
+        new CgenGlobalController(getApplication().getFrameController()).startup();
+
+//        Collection<DataMap> dataMaps;
+//        DataChannelMetaData metaData = getApplication().getMetaData();
+//
+//        try {
+//            Project project = getProjectController().getProject();
+//            dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
+//            for (DataMap dataMap : dataMaps) {
+//                ClassGenerationAction classGenerationAction = metaData.get(dataMap, ClassGenerationAction.class);
+//                if (classGenerationAction != null) {
+//                    classGenerationAction.prepareArtifacts();
+//                    classGenerationAction.execute();
+//                }
+//            }
+//            JOptionPane.showMessageDialog(
+//                    this.getApplication().getFrameController().getView(),
+//                    "Class generation finished");
+//        } catch (Exception ex) {
+//            logObj.error("Error generating classes", e);
+//            JOptionPane.showMessageDialog(
+//                    this.getApplication().getFrameController().getView(),
+//                    "Error generating classes - " + ex.getMessage());
+//        }
     }
 }

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
new file mode 100644
index 0000000..4b88697
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
@@ -0,0 +1,47 @@
+package org.apache.cayenne.modeler.dialog.codegen.cgen;
+
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.swing.BindingBuilder;
+
+import java.awt.*;
+
+public class CgenGlobalController extends CayenneController{
+
+    protected CgenDialog view;
+
+    protected CgenGlobalPanelController globalPanelController;
+
+    public CgenGlobalController(CayenneController parent){
+        super(parent);
+
+        globalPanelController = new CgenGlobalPanelController(this);
+    }
+
+    public void startup(){
+        this.view = new CgenDialog(globalPanelController.getView());
+        initBindings();
+
+        view.pack();
+        view.setModal(true);
+        centerView();
+        makeCloseableOnEscape();
+        view.setVisible(true);
+    }
+
+    protected void initBindings() {
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        builder.bindToAction(view.getCancelButton(), "cancelAction()");
+    }
+
+    public void cancelAction() {
+        view.dispose();
+    }
+
+    @Override
+    public Component getView() {
+        return view;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
new file mode 100644
index 0000000..3c9b68a
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
@@ -0,0 +1,274 @@
+package org.apache.cayenne.modeler.dialog.codegen.cgen;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.ProjectController;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class CgenGlobalPanel extends JPanel {
+
+    private JButton generateButton;
+
+    private JTextField outputFolder;
+    private JButton selectOutputFolder;
+    private JComboBox generationMode;
+    private JComboBox subclassTemplate;
+    private JComboBox superclassTemplate;
+    private JComboBox embeddableTemplate;
+    private JComboBox embeddableSuperTemplate;
+    private JComboBox dataMapTemplate;
+    private JComboBox dataMapSuperTemplate;
+    private JCheckBox pairs;
+    private JCheckBox overwrite;
+    private JCheckBox usePackagePath;
+    private JTextField outputPattern;
+    private JCheckBox createPropertyNames;
+    private JTextField superclassPackage;
+    private JTextField encoding;
+
+    private JButton resetFolder;
+    private JButton resetMode;
+    private JButton resetDataMapTemplate;
+    private JButton resetDataMapSuperTemplate;
+    private JButton resetTemplate;
+    private JButton resetSuperTemplate;
+    private JButton resetEmbeddableTemplate;
+    private JButton resetEmbeddableSuperTemplate;
+    private JButton resetPattern;
+    private JButton resetEncoding;
+    private JButton resetPairs;
+    private JButton resetPath;
+    private JButton resetOverwrite;
+    private JButton resetNames;
+    private JButton resetPackage;
+
+    private ProjectController projectController;
+
+    CgenGlobalPanel(ProjectController projectController) {
+        this.projectController = projectController;
+
+        this.generateButton = new JButton("Generate All classes");
+        this.outputFolder = new JTextField();
+        this.selectOutputFolder = new JButton("Select");
+        this.generationMode = new JComboBox();
+        this.subclassTemplate = new JComboBox();
+        this.superclassTemplate = new JComboBox();
+        this.embeddableTemplate = new JComboBox();
+        this.embeddableSuperTemplate = new JComboBox();
+        this.dataMapTemplate = new JComboBox();
+        this.dataMapSuperTemplate = new JComboBox();
+        this.pairs = new JCheckBox();
+        this.overwrite = new JCheckBox();
+        this.usePackagePath = new JCheckBox();
+        this.outputPattern = new JTextField();
+        this.createPropertyNames = new JCheckBox();
+        this.encoding = new JTextField();
+        this.superclassPackage = new JTextField();
+
+        // assemble
+        FormLayout layout = new FormLayout(
+                "right:100dlu, 3dlu, fill:50:grow, 6dlu, fill:70dlu, 3dlu", "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+
+        builder.append("Generate Classes for dataMaps", generateButton);
+        builder.nextLine();
+
+        builder.appendSeparator();
+
+        resetFolder = new JButton("Reset Folder");
+        builder.append("Output Directory:", outputFolder, selectOutputFolder);
+        builder.nextLine();
+        builder.append(resetFolder);
+        builder.nextLine();
+        resetMode = new JButton("Reset Mode");
+        builder.append("Generation Mode:", generationMode, resetMode);
+        builder.nextLine();
+
+        resetDataMapTemplate = new JButton("Reset Template");
+        builder.append("DataMap Template:", dataMapTemplate, resetDataMapTemplate);
+        builder.nextLine();
+
+        resetDataMapSuperTemplate = new JButton("Reset Template");
+        builder.append("DataMap Superclass Template", dataMapSuperTemplate, resetDataMapSuperTemplate);
+        builder.nextLine();
+
+        resetTemplate = new JButton("Reset Template");
+        builder.append("Subclass Template:", subclassTemplate, resetTemplate);
+        builder.nextLine();
+
+        resetSuperTemplate = new JButton("Reset Template");
+        builder.append("Superclass Template:", superclassTemplate, resetSuperTemplate);
+        builder.nextLine();
+
+        resetEmbeddableTemplate = new JButton("Reset Template");
+        builder.append("Embeddable Template", embeddableTemplate, resetEmbeddableTemplate);
+        builder.nextLine();
+
+        resetEmbeddableSuperTemplate = new JButton("Reset Template");
+        builder.append("Embeddable Super Template", embeddableSuperTemplate, resetEmbeddableSuperTemplate);
+        builder.nextLine();
+
+        resetPattern = new JButton("Reset pattern");
+        builder.append("Output Pattern:", outputPattern, resetPattern);
+        builder.nextLine();
+
+        resetEncoding = new JButton("Reset encoding");
+        builder.append("Encoding", encoding, resetEncoding);
+        builder.nextLine();
+
+        resetPairs = new JButton("Reset pairs");
+        builder.append("Make Pairs:", pairs, resetPairs);
+        builder.nextLine();
+
+        resetPath = new JButton("Reset path");
+        builder.append("Use Package Path:", usePackagePath, resetPath);
+        builder.nextLine();
+
+        resetOverwrite = new JButton("Reset overwrite");
+        builder.append("Overwrite Subclasses:", overwrite, resetOverwrite);
+        builder.nextLine();
+
+        resetNames = new JButton("Reset Names");
+        builder.append("Create Property Names:", createPropertyNames, resetNames);
+        builder.nextLine();
+
+        resetPackage = new JButton("Reset Package");
+        builder.append("Superclass package", superclassPackage, resetPackage);
+
+        setLayout(new BorderLayout());
+        add(builder.getPanel(), BorderLayout.CENTER);
+
+        add(builder.getPanel(), BorderLayout.CENTER);
+    }
+
+    public JButton getGenerateButton() {
+        return generateButton;
+    }
+
+    public JTextField getOutputFolder() {
+        return outputFolder;
+    }
+
+    public JButton getSelectOutputFolder() {
+        return selectOutputFolder;
+    }
+
+    public JComboBox getGenerationMode() {
+        return generationMode;
+    }
+
+    public JComboBox getSubclassTemplate() {
+        return subclassTemplate;
+    }
+
+    public JComboBox getSuperclassTemplate() {
+        return superclassTemplate;
+    }
+
+    public JComboBox getEmbeddableTemplate() {
+        return embeddableTemplate;
+    }
+
+    public JComboBox getEmbeddableSuperTemplate() {
+        return embeddableSuperTemplate;
+    }
+
+    public JComboBox getDataMapTemplate() {
+        return dataMapTemplate;
+    }
+
+    public JComboBox getDataMapSuperTemplate() {
+        return dataMapSuperTemplate;
+    }
+
+    public JCheckBox getPairs() {
+        return pairs;
+    }
+
+    public JCheckBox getOverwrite() {
+        return overwrite;
+    }
+
+    public JCheckBox getUsePackagePath() {
+        return usePackagePath;
+    }
+
+    public JTextField getOutputPattern() {
+        return outputPattern;
+    }
+
+    public JCheckBox getCreatePropertyNames() {
+        return createPropertyNames;
+    }
+
+    public JTextField getSuperclassPackage() {
+        return superclassPackage;
+    }
+
+    public JTextField getEncoding() {
+        return encoding;
+    }
+
+    public JButton getResetFolder() {
+        return resetFolder;
+    }
+
+    public JButton getResetMode() {
+        return resetMode;
+    }
+
+    public JButton getResetDataMapTemplate() {
+        return resetDataMapTemplate;
+    }
+
+    public JButton getResetDataMapSuperTemplate() {
+        return resetDataMapSuperTemplate;
+    }
+
+    public JButton getResetTemplate() {
+        return resetTemplate;
+    }
+
+    public JButton getResetSuperTemplate() {
+        return resetSuperTemplate;
+    }
+
+    public JButton getResetEmbeddableTemplate() {
+        return resetEmbeddableTemplate;
+    }
+
+    public JButton getResetEmbeddableSuperTemplate() {
+        return resetEmbeddableSuperTemplate;
+    }
+
+    public JButton getResetPattern() {
+        return resetPattern;
+    }
+
+    public JButton getResetEncoding() {
+        return resetEncoding;
+    }
+
+    public JButton getResetPairs() {
+        return resetPairs;
+    }
+
+    public JButton getResetPath() {
+        return resetPath;
+    }
+
+    public JButton getResetOverwrite() {
+        return resetOverwrite;
+    }
+
+    public JButton getResetNames() {
+        return resetNames;
+    }
+
+    public JButton getResetPackage() {
+        return resetPackage;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
new file mode 100644
index 0000000..b07bdd2
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
@@ -0,0 +1,285 @@
+package org.apache.cayenne.modeler.dialog.codegen.cgen;
+
+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.CodeTemplateManager;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.pref.FSPath;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.*;
+import java.awt.*;
+import java.io.File;
+import java.util.*;
+import java.util.List;
+
+public class CgenGlobalPanelController extends CayenneController{
+
+    static final String ALL_MODE_LABEL = "Generate all";
+    static final Map<String, String> modesByLabel = new HashMap<>();
+    // correspond to non-public constants on MapClassGenerator.
+    private static final String MODE_DATAMAP = "datamap";
+    private static final String MODE_ENTITY = "entity";
+    private static final String MODE_ALL = "all";
+    private static final String DATA_MAP_MODE_LABEL = "DataMap generation";
+    private static final String ENTITY_MODE_LABEL = "Entity and Embeddable generation";
+    private static final Map<String, String> labelByMode = new HashMap<>();
+    private static Logger logObj = LoggerFactory.getLogger(CgenGlobalPanelController.class);
+
+    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 CgenGlobalPanel view;
+    private ProjectController projectController;
+
+    private Collection<ClassGenerationAction> generators;
+
+    public CgenGlobalPanelController(CayenneController parent) {
+        super(parent);
+        this.projectController = Application.getInstance().getFrameController().getProjectController();
+
+        this.view = new CgenGlobalPanel(projectController);
+        this.generators = new HashSet<>();
+        initSources();
+
+        updateTemplates();
+        initButtons();
+    }
+
+    private void updateTemplates() {
+        Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
+        view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));
+
+        CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
+
+        java.util.List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
+        Collections.sort(customTemplates);
+
+        java.util.List<String> superTemplates = new ArrayList<>(templateManager.getStandardSuperclassTemplates());
+        Collections.sort(superTemplates);
+        superTemplates.addAll(customTemplates);
+
+        java.util.List<String> subTemplates = new ArrayList<>(templateManager.getStandardSubclassTemplates());
+        Collections.sort(subTemplates);
+        subTemplates.addAll(customTemplates);
+
+        java.util.List<String> embeddableTemplates = new ArrayList<>(templateManager.getStandartEmbeddableTemplates());
+        Collections.sort(embeddableTemplates);
+        embeddableTemplates.addAll(customTemplates);
+
+        java.util.List<String> embeddableSuperTemplates = new ArrayList<>(templateManager.getStandartEmbeddableSuperclassTemplates());
+        Collections.sort(embeddableSuperTemplates);
+        embeddableSuperTemplates.addAll(customTemplates);
+
+        java.util.List<String> dataMapTemplates = new ArrayList<>(templateManager.getStandartDataMapTemplates());
+        Collections.sort(dataMapTemplates);
+        dataMapTemplates.addAll(customTemplates);
+
+        List<String> dataMapSuperTemplates = new ArrayList<>(templateManager.getStandartDataMapSuperclassTemplates());
+        Collections.sort(dataMapSuperTemplates);
+        dataMapSuperTemplates.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()));
+
+        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel(dataMapTemplates.toArray()));
+        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel(dataMapSuperTemplates.toArray()));
+
+        this.view.getOutputPattern().setText("*.java");
+        this.view.getPairs().setSelected(true);
+        this.view.getUsePackagePath().setSelected(true);
+
+        this.view.getOutputFolder().setText(System.getProperty("user.home"));
+    }
+
+    private void initSources() {
+        DataChannelMetaData metaData = getApplication().getMetaData();
+        Project project = projectController.getProject();
+        Collection<DataMap> dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
+        for (DataMap dataMap : dataMaps) {
+            ClassGenerationAction classGenerationAction = metaData.get(dataMap, ClassGenerationAction.class);
+            if (classGenerationAction != null) {
+                generators.add(classGenerationAction);
+            }
+        }
+    }
+
+    private void initButtons() {
+        this.view.getSelectOutputFolder().addActionListener(action -> {
+
+            JTextField outputFolder = view.getOutputFolder();
+
+            String currentDir = outputFolder.getText();
+
+            JFileChooser chooser = new JFileChooser();
+            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+            chooser.setDialogType(JFileChooser.OPEN_DIALOG);
+
+            // guess start directory
+            if (!Util.isEmptyString(currentDir)) {
+                chooser.setCurrentDirectory(new File(currentDir));
+            } else {
+                FSPath lastDir = Application.getInstance().getFrameController().getLastDirectory();
+                lastDir.updateChooser(chooser);
+            }
+
+                int result = chooser.showOpenDialog(getView());
+                if (result == JFileChooser.APPROVE_OPTION) {
+                    File selected = chooser.getSelectedFile();
+
+                    // update model
+                    String path = selected.getAbsolutePath();
+                    view.getOutputFolder().setText(path);
+                }
+        });
+
+        this.view.getGenerateButton().addActionListener(action -> {
+            try {
+            for(ClassGenerationAction generator : generators) {
+                generator.prepareArtifacts();
+                generator.execute();
+            }
+            JOptionPane.showMessageDialog(
+                    this.getApplication().getFrameController().getView(),
+                    "Class generation finished");
+            } catch (Exception ex) {
+            logObj.error("Error generating classes", ex);
+            JOptionPane.showMessageDialog(
+                    this.getApplication().getFrameController().getView(),
+                    "Error generating classes - " + ex.getMessage());
+            }
+        });
+
+        this.view.getResetFolder().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setDestDir(new File(view.getOutputFolder().getText()));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetMode().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setArtifactsGenerationMode(modesByLabel.get(String.valueOf(view.getGenerationMode().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetDataMapTemplate().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setQueryTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getDataMapTemplate().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetDataMapSuperTemplate().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setQuerySuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getDataMapSuperTemplate().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetTemplate().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSubclassTemplate().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetSuperTemplate().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSuperclassTemplate().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetEmbeddableTemplate().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setEmbeddableTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getEmbeddableTemplate().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetEmbeddableSuperTemplate().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setEmbeddableSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getEmbeddableSuperTemplate().getSelectedItem())));
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetEncoding().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setEncoding(view.getEncoding().getText());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetPattern().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setOutputPattern(view.getOutputPattern().getText());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetPairs().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setMakePairs(view.getPairs().isSelected());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getUsePackagePath().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setUsePkgPath(view.getUsePackagePath().isSelected());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetOverwrite().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setUsePkgPath(view.getUsePackagePath().isSelected());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetNames().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+
+        this.view.getResetPackage().addActionListener(action ->
+                generators.forEach(val -> {
+                    val.setSuperPkg(view.getSuperclassPackage().getText());
+                    update(val.getDataMap());
+                    projectController.setDirty(true);
+                }));
+    }
+
+    private void update(DataMap dataMap) {
+        projectController.fireDataMapDisplayEvent(new DataMapDisplayEvent(this, dataMap, (DataChannelDescriptor)projectController.getProject().getRootNode()));
+
+    }
+
+    @Override
+    public Component getView() {
+        return view;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/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 64a15fa..2ee1034 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
@@ -131,6 +131,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         ClassGenerationAction generator = generatorSelector.getGenerator();
         if (generator != null) {
             try {
+                generator.prepareArtifacts();
                 generator.execute();
                 JOptionPane.showMessageDialog(
                         getView(),

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e41f1e44/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 bfadc8a..ca4b50f 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
@@ -41,7 +41,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
     private ComboBoxAdapter embeddableSuperTemplate;
     private ComboBoxAdapter dataMapTemplate;
     private ComboBoxAdapter dataMapSuperTemplate;
-    protected JCheckBox pairs;
+    private JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
     private TextAdapter outputPattern;